diff --git a/.gitignore b/.gitignore index c41cc9e3..2a0038a4 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -/target \ No newline at end of file +/target +.idea \ No newline at end of file diff --git a/crates/uplc/tests/integ_tests.rs b/crates/uplc/tests/integ_tests.rs new file mode 100644 index 00000000..b99570cb --- /dev/null +++ b/crates/uplc/tests/integ_tests.rs @@ -0,0 +1,67 @@ +/// e2e encoding/decoding tests +use uplc::{ + ast::{DeBruijn, Name, Program}, + parser, +}; + +fn round_trip_test(bytes: &[u8], code: &str) { + parsed_program_matches_decoded_bytes(bytes, code); + encoded_program_matches_bytes(bytes, code); + can_convert_between_de_bruijn_and_name(bytes, code); + decoded_bytes_can_convert_into_code(bytes, code); +} + +fn parsed_program_matches_decoded_bytes(bytes: &[u8], code: &str) { + let parsed_program = parser::program(code).unwrap(); + + let debruijn_program: Program = parsed_program.clone().try_into().unwrap(); + + let decoded_program: Program = Program::from_flat(bytes).unwrap(); + + assert_eq!(debruijn_program, decoded_program); +} + +fn encoded_program_matches_bytes(bytes: &[u8], code: &str) { + let parsed_program = parser::program(code).unwrap(); + + let debruijn_program: Program = parsed_program.clone().try_into().unwrap(); + + let encoded_program = debruijn_program.to_flat().unwrap(); + + assert_eq!(encoded_program, bytes); +} +fn can_convert_between_de_bruijn_and_name(bytes: &[u8], code: &str) { + let parsed_program = parser::program(code).unwrap(); + + let decoded_program: Program = Program::from_flat(bytes).unwrap(); + + let name_program: Program = decoded_program.try_into().unwrap(); + + assert_eq!(parsed_program, name_program); +} + +fn decoded_bytes_can_convert_into_code(bytes: &[u8], code: &str) { + let decoded_program: Program = Program::from_flat(bytes).unwrap(); + + let name_program: Program = decoded_program.try_into().unwrap(); + + let pretty = name_program.to_pretty(); + + assert_eq!(pretty, code); +} + +#[test] +fn integer() { + let bytes = include_bytes!("../test_data/basic/integer/integer.flat"); + let code = include_str!("../test_data/basic/integer/integer.uplc"); + + round_trip_test(bytes, code); +} + +#[test] +fn jpg() { + let bytes = include_bytes!("../test_data/jpg/jpg.flat"); + let code = include_str!("../test_data/jpg/jpg.uplc"); + + round_trip_test(bytes, code); +} \ No newline at end of file