Skip to content

Commit 7e5a257

Browse files
committed
add regression tests for the parser
This adds tests to ensure that the compiler using the `chumsky` parser produces the same Simplicity program as when using the `pest` parser for the default examples. The programs were compiled using an old `simc` version with debug symbols into .json files, and located in `test-data/` folder.
1 parent 56b22b3 commit 7e5a257

22 files changed

Lines changed: 247 additions & 0 deletions

src/lib.rs

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,11 @@ pub(crate) mod tests {
372372
include_fee_output: self.include_fee_output,
373373
}
374374
}
375+
376+
pub fn get_encoding(self) -> String {
377+
let program_bytes = self.program.commit().to_vec_without_witness();
378+
Base64Display::new(&program_bytes, &STANDARD).to_string()
379+
}
375380
}
376381

377382
impl<T> TestCase<T> {
@@ -428,6 +433,14 @@ pub(crate) mod tests {
428433
Err(error) => panic!("Unexpected error: {error}"),
429434
}
430435
}
436+
437+
pub fn get_encoding_with_witness(self) -> (String, String) {
438+
let (program_bytes, witness_bytes) = self.program.redeem().to_vec_with_witness();
439+
(
440+
Base64Display::new(&program_bytes, &STANDARD).to_string(),
441+
Base64Display::new(&witness_bytes, &STANDARD).to_string(),
442+
)
443+
}
431444
}
432445

433446
#[test]
@@ -670,4 +683,154 @@ fn main() {
670683
.with_witness_values(WitnessValues::default())
671684
.assert_run_success();
672685
}
686+
687+
#[cfg(feature = "serde")]
688+
mod regression {
689+
use super::TestCase;
690+
691+
#[derive(serde::Deserialize)]
692+
struct Program {
693+
program: String,
694+
witness: Option<String>,
695+
}
696+
697+
fn regression_test(name: &str) {
698+
let program = serde_json::from_str::<Program>(
699+
std::fs::read_to_string(format!("./test-data/{}.json", name))
700+
.unwrap()
701+
.as_str(),
702+
)
703+
.unwrap();
704+
705+
let test_case = TestCase::program_file(format!("./examples/{}.simf", name));
706+
match program.witness {
707+
Some(wit) => {
708+
let (new_program, new_witness) = test_case
709+
.with_witness_file(format!("./examples/{}.wit", name))
710+
.get_encoding_with_witness();
711+
assert_eq!(
712+
program.program, new_program,
713+
"Byte code of programs should be the same"
714+
);
715+
assert_eq!(
716+
wit, new_witness,
717+
"Byte code of witnesses should be the same"
718+
);
719+
}
720+
None => {
721+
let new_program = test_case.get_encoding();
722+
723+
assert_eq!(
724+
program.program, new_program,
725+
"Byte code of programs should be the same"
726+
)
727+
}
728+
}
729+
}
730+
731+
#[test]
732+
fn array_fold_2n_regression() {
733+
regression_test("array_fold_2n");
734+
}
735+
736+
#[test]
737+
fn array_fold_regression() {
738+
regression_test("array_fold");
739+
}
740+
741+
#[test]
742+
fn cat_regression() {
743+
regression_test("cat");
744+
}
745+
746+
#[test]
747+
fn ctv_regression() {
748+
regression_test("ctv");
749+
}
750+
751+
#[test]
752+
fn escrow_with_delay_regression() {
753+
regression_test("escrow_with_delay");
754+
}
755+
756+
#[test]
757+
fn hash_loop_regression() {
758+
regression_test("hash_loop");
759+
}
760+
761+
#[test]
762+
fn hodl_vault_regression() {
763+
regression_test("hodl_vault");
764+
}
765+
766+
#[test]
767+
fn htlc_regression() {
768+
regression_test("htlc");
769+
}
770+
771+
#[test]
772+
fn last_will_regression() {
773+
regression_test("last_will");
774+
}
775+
776+
#[test]
777+
fn non_interactive_fee_bump_regression() {
778+
regression_test("non_interactive_fee_bump");
779+
}
780+
781+
#[test]
782+
fn p2ms_regression() {
783+
regression_test("p2ms");
784+
}
785+
786+
#[test]
787+
fn p2pkh_regression() {
788+
regression_test("p2pkh");
789+
}
790+
791+
#[test]
792+
fn presigned_vault_regression() {
793+
regression_test("presigned_vault");
794+
}
795+
796+
#[test]
797+
fn reveal_collision_regression() {
798+
regression_test("reveal_collision");
799+
}
800+
801+
#[test]
802+
fn reveal_fix_point_regression() {
803+
regression_test("reveal_fix_point");
804+
}
805+
806+
#[test]
807+
fn sighash_all_anyonecanpay_regression() {
808+
regression_test("sighash_all_anyonecanpay");
809+
}
810+
811+
#[test]
812+
fn sighash_all_anyprevoutanyscript_regression() {
813+
regression_test("sighash_all_anyprevoutanyscript");
814+
}
815+
816+
#[test]
817+
fn sighash_all_anyprevout_regression() {
818+
regression_test("sighash_all_anyprevout");
819+
}
820+
821+
#[test]
822+
fn sighash_none_regression() {
823+
regression_test("sighash_none");
824+
}
825+
826+
#[test]
827+
fn sighash_single_regression() {
828+
regression_test("sighash_single");
829+
}
830+
831+
#[test]
832+
fn transfer_with_timeout_regression() {
833+
regression_test("transfer_with_timeout");
834+
}
835+
}
673836
}

test-data/array_fold.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"program": "5WJsgAAAAEEWQAAAAEDBZAAAAAYMgqFksgAAAAQGpZAAAAAoNgVWQAAAAMDesgAAAAcHAQqFkFsIFCDE2QAAAAACBYEHGIMMQcKkHGGyMPoFCSDbD7RQLBpcTmcVRCRXQmYAIq4WDF4UsJ7AwqF1hL9cVIyFlhwCtu/AEMAxCcCPwYwFA4AFwUbcbgB+GigDMWIDSDQBxCFxQPxEYbiQw/FIoA1CyAbAagONiBQkg3GlkAAAAOAwCoWLNuJzAu99qFH3Wh9HF0gSGitpeJMKWMyu4jCUAb0bbp/LsAGGAYha2Dmuu5eD0J1PRkDjOX+NuSvKMp89lTLaq09lrtGKI8VGIcMAxCcCPyTBAODAclQ=",
3+
"witness": null
4+
}

test-data/array_fold_2n.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"program": "5JpsgAAAAEECBAhAoQYmyAAAAAAQLAg4w1MQcKkHGGph9AoPqMNsMPuFCSBZaBRpcTmcVRCRXQmYAIq4WDF4UsJ7AwqF1hL9cVIyFlhwCtu/AEMAxCcGPwowFA3BcDAUHBwuGAKDiELicBQcWEChJBuK7IAAAAIBgFQsWbcTmBd77UKPutD6OLpAkNFbS8SYUsZldxGEoA3o23T+XYAMMAxC1sHNddy8HoTqejIHGcv8bcleUZT57KmW1Vp7LXaMUR4qMQ4YBiE4EfkSCAcGA5Fg",
3+
"witness": null
4+
}

test-data/cat.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"program": "5DJsBAEWACDAKkChNiIAIIQKEkIMONRQLJm3A5rruXg9CdT0ZA4zl/jbkryjKfPZUy2qtPZa7RiiPFRiHDAMQtjBzOKohIroTMAEVcLBi8KWE9gYVC6wl+uKkZCyw4BW3fgCGAYq2Dgiug4MFSBQmwvQQgUJIQYcaigWTNtOYIi/1AcaRNMBhc3vyX09ErCRo/sv5CAbaGAJlp1bvfigwDELYYF3vtQo+60Po4ukCQ0VtLxJhSxmV3EYSgDejbdP5dgAw8PAoTgJ+OAQDgoHCwuIwGIOOAOPgA==",
3+
"witness": null
4+
}

test-data/ctv.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"program": "5wEkCTVkcziqISK6EzABFXCwYvClhPYGFQusJfripGQssOAVt34AhgGJAoSQgwVw+HGBzAu99qFH3Wh9HF0gSGitpeJMKWMyu4jCUAb0bbp/LsAGGAYhZhamq05rruXg9CdT0ZA4zl/jbkryjKfPZUy2qtPZa7RiiPFRiHDAMSBQkg3AxS/DI5n4KrWbIJljsDH8qWizDjD9hqJKs0No6Ez/56tZohz3GDAMQswtJgiL/UBxpE0wGFze/JfT0SsJGj+y/kIBtoYAmWnVu9+KDwICkChJBuIxS9wI5u8lZwLSPPkvMpefT82f85Cc97MlOKr7Djoj7EAHmx0TDAMQswtLVcjm8ToYSOAZ74jeLno8FWHRgos74PKQ3vn+6/VNqUJJRywMAxIFCSDcail+GBzfQgn7m8T+SlBrmrOch86kHUDO438Z7mfcnzyKpQtkIOGAYhZhaTaCHQWKequSoQRbKj9ZMNUNP9TZslL2ACY8pcCYeALJMHjQCkChJBuQope4Ac0vqVxn0dNTcJGVHIKgZVnO4Ri5KL+OnrThZFmsP0velhgGIWYWk20qztTpHBhF8ugDjaMMsLl9/jQllEBh7MsI4rcUNpyvh4iApAoSQbkqKX4YnNKg3OgxzUB7/tnnkIYePSA4b9lUGNvmRsOpjaQAmHTtYYBiFmFpMDLqyIAl/t8mPC4rRGEfM1lVH7CAxNfptKDrOKJGwAHAeSgFIFCSDcpRS9gcxgts54X+MRHKrfq2DJAzmcXWPmk3AyFTFgxcx5QC1WKBgGIWYWkwYulQXr0Fu/BAWgC5j7LWeBAl+pI9pt9ZFn0rcXaN1Fh5BAUgUJINy1FL8KcxsXX6Q/gR6bfNv+QIkq2TSNzaS+85toDfqr3uY18KY5BgGIWYWk2R+ra7Pj7bD7ngvTZ8puEzNaYgGZeeHhbJwsZpxe6Uuh5aAUgUJINzCijVicxaVg5c7bCv5v4Efeky6pdqN8+a2UbNm+82P8XJkfgUkBgGJAoTaa49AZswUpxgRNKz1+4uDuXbUafwXtXbjwic1dRV8fxdBCBQkhBhxqKBZM26Dmf7mfDw7DxJRotWTkSgnKVskuvR6itvdUy8omlW0PLqAMAxC2MHNuPwXvzv9stXb3QFgqI0+EkTeqbTD8hwv1sedPf8PVoQYBiE4GfmrBAODgcNA4pA46A5FgcnAOVoHL4DmRA5ogObYA==",
3+
"witness": null
4+
}

test-data/escrow_with_delay.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"program": "56XQKEGJtLzfMz987l3WKtAxSudDhYOBTf5tlucUbKz5QK2LfAvMAgTFNpxgR/lEHtfW0wRUBulcB82Fx3jkuM7zynq6wJuVxwnuUEIFCbT8mEUAySxhiCSaJ8L8TqkU2pjkIsG3zNhDAPiJ3nAbfIIQKEGHHGwONkKBYj8JOOFgQYgUH4hOQKE2AACDcIMOQYYLALQPicgUIMONxOccgwVJIEnDmuu5eD0J1PRkDjOX+NuSvKMp89lTLaq09lrtGKI8VGIcMAxCcUJIPxAbjkUH4CcKhZtjDmBd77UKPutD6OLpAkNFbS8SYUsZldxGEoA3o23T+XYAMMAxCbj8lwQDgQHDCSD8TCjTGnMERf6gONImmAwub35L6eiVhI0f2X8hANtDAEy06t3vxQYBiQKEkIMMSQJjmA5nFUQkV0JmACKuFgxeFLCewMKhdYS/XFSMhZYcArbvwBDAMQNIW1g5n4KrWbIJljsDH8qWizDjD9hqJKs0No6Ez/56tZohz3GDAMR+QhgqPyHBAOFBcTAMA8igORwHJMgUG5Im5bHGHHG5QHGHCxC1gOAIFBuUB+YU4w444/LA4w44WQW0BxCgUJsAIEIFCSDcuDjcuhQLFm2nN3krOBaR58l5lLz6fmz/nITnvZkpxVfYcdEfYgA82OiYYBiFrN4nQwkcAz3xG8XPR4KsOjBRZ3weUhvfP91+qbUoSSjlgeQgFCcAA5TA4GBwkDisDjsDmcA5oQOaYkUAcsAc24HN6Bzhgc5A3MgkDnJE5kxc03MGBy4sQPoBzKBObVJCDBV5Tm0EOgsU9VclQgi2VH6yYaoaf6mzZKXsAEx5S4Ew8AWSYMAxCagOYkG0LgIDmMBwUDhIPCwOeYA=",
3+
"witness": null
4+
}

test-data/hash_loop.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"program": "6EZJAk1ZHN3krOBaR58l5lLz6fmz/nITnvZkpxVfYcdEfYgA82OiYYBiQKEGJFB8iUUCyG0IOSQKhZDbzcCMOQcYcfA4VC0BbBuGIOSQKhZDcRoOSQKhZDcVG3GHH4WYcfhxwqFmFrG42NxyYcg4w4+BwqFoC2Dcg0HJIFQshuRSDkkCoWQ3JE24w4/IIw4/IU4VCzC1jcnUHJIFQshuUiDkkCoWQ3Ks24w4/Jww4/J84VCzC1jctzcaGHH5AmHH5CHCoWYWsbmDNzDGHIOMOPgcKhaAthJBuZJBxwsAsmqjmcVRCRXQmYAIq4WDF4UsJ7AwqF1hL9cVIyFlhwCtu/AEMAxIFCSD7BRmynNddy8HoTqejIHGcv8bcleUZT57KmW1Vp7LXaMUR4qMQ4YBiQKDc1RxSSBMNWJzAu99qFH3Wh9HF0gSGitpeJMKWMyu4jCUAb0bbp/LsAGGAYiA6gNwHCgOKgOOAOQoHJIJyXQYQXk0Lk4FyfAaQ4gaQOUgTlSbWQXlWLlaFywAaA4gaAOWoHMEE5hzcGILzEi5iwuY4BoDiBoA5kwnMwbiAgvM0LmcC5nwGgOIGgDmkA5sgOb8JziG4sILzjC5yAucsBoDiBoA50AnOqbjYgvOuLnZC53AGgOIGgDnhA57wnPobkCQXn2Fz8Bc/YDQHEDQB0AAToBDciyC9ASLoCAugMAaA4gaAOgOIFCbSgV/l06WxJFyPX6jJHNLOkuKw8L96O1DhziIEzX8okQAIQKEkG5OoMOFiSLEzohnOQs8/+3xpn819ObmnDkhDQn925GJoUwiWnfmwmLh4UBRzbSrO1OkcGEXy6AONowywuX3+NCWUQGHsywjitxQ2nK+GAaQtwXAGbdBzfQgn7m8T+SlBrmrOch86kHUDO438Z7mfcnzyKpQtkIOGAYhcGYObQQ6CxT1VyVCCLZUfrJhqhp/qbNkpewATHlLgTDwBZJgwDEJw0/QcggHEIHE4HQeAA==",
3+
"witness": null
4+
}

test-data/hodl_vault.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"program": "53k2QAAAfQCECh0ChJCDDjUUCyacAxOb6EE/c3ifyUoNc1ZzkPnUg6gZ3G/jPcz7k+eRVKFshBwwDELYwc2gh0FinqrkqEEWyo/WTDVDT/U2bJS9gAmPKXAmHgCyTBgGIXAt3g5tpVnanSODCL5dAHG0YZYXL7/GhLKIDD2ZYRxW4obTlfDAMVkAAMNQA4UQKHQKEkG4gONxEKBYmBl1ZEAS/2+THhcVojCPmayqj9hAYmv02lB1nFEjYADgPDwKFpNL6lcZ9HTU3CRlRyCoGVZzuEYuSi/jp604WRZrD9L3pYeGgVaXm+Zn753LusVaBilc6HCwcCm/zbLc4o2VnygVsW+BeYBvIFDoFCDDj8ZnHHH4QcKkGCoWsgw5AoSQJNWRzAu99qFH3Wh9HF0gSGitpeJMKWMyu4jCUAb0bbp/LsAGGAYkChJCDDclDDhYBZtVpzBEX+oDjSJpgMLm9+S+nolYSNH9l/IQDbQwBMtOrd78UGAYkChJBuAH5RmHHCxCzM/BVazZBMsdgY/lS0WYcYfsNRJVmhtHQmf/PVrNEOe4weAAUgUJINw4UasTm8ToYSOAZ74jeLno8FWHRgos74PKQ3vn+6/VNqUJJRywMAxIFCSDciDjjjjjcjhQfkMccccccLQFwFsYc3eSs4FpHnyXmUvPp+bP+chOe9mSnFV9hx0R9iADzY6JhgGIThB+ZkEA4YBxQBxuByIA5JgcmSbTjAj/KIPa+tpgioDdK4D5sLjvHJcZ3nlPV1gTcrjhPcoIQKHQKDcrzjcpxQkgScOZxVEJFdCZgAirhYMXhSwnsDCoXWEv1xUjIWWHAK278AQwDEgUJINy/ONzAig/Lk4VC0Guu5eD0J1PRkDjOX+NuSvKMp89lTLaq09lrtGKI8VGIcPFwFCbQOLAcAA4WSKAOMQcRgcThcWgONQcywHM0FzPgOOQc14HNmFzcAOPRc4ADj8HOqBzsg==",
3+
"witness": "AAAD6AABhqCQIxuN6WoflA3c9Ab+g4lBfKj7CwMVFgji+UsxtEOn4NJqEuQ332kCjwkCfDfV9nQqEMHohkBh0Rm4u86WLSbT8jQfVx8Gkhbt/HKCL2CUuOwznC9y3GSuoO7R49YKv0Vy/dBGGOW1vGcszXHPrxJbbBsQGuyjp7k4/oOTKrOHQw=="
4+
}

test-data/htlc.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"program": "5lnQKEGIFCDDEHGCwJIEmrI5nFUQkV0JmACKuFgxeFLCewMKhdYS/XFSMhZYcArbvwBDAMQm9JCDD8EFAsWq5HNddy8HoTqejIHGcv8bcleUZT57KmW1Vp7LXaMUR4qMQ4YBiQKEkG3CjVicwLvfahR91ofRxdIEhoraXiTCljMruIwlAG9G26fy7ABhgGIGoDhIHFATi5NpZmh6rfhivXdsj8GLjp+OIAiXFIVu4jOzkCpZHQ1fKSUEIFCSDcZHG40FAsWbdBzd5KzgWkefJeZS8+n5s/5yE572ZKcVX2HHRH2IAPNjomGAYha2Dm8ToYSOAZ74jeLno8FWHRgos74PKQ3vn+6/VNqUJJRywMAxWl5vmZ++dy7rFWgYpXOhwsHApv82y3OKNlZ8oFbFvgXmAcDIFBuQx+QZxwsCSBJw5giL/UBxpE0wGFze/JfT0SsJGj+y/kIBtoYAmWnVu9+KDAMQnJcnFJ+SgnEgnABYNjDmfgqtZsgmWOwMfypaLMOMP2GokqzQ2joTP/nq1miHPcYMAxCcZn5SggG4DhBIoAyBxCFxMA0g46A5AAcpSRQBvBywG5WpsgAAA+gECcsUkIMFXg5tBDoLFPVXJUIItlR+smGqGn+ps2Sl7ABMeUuBMPAFkmDAMVpxgR/lEHtfW0wRUBulcB82Fx3jkuM7zynq6wJuVxwnuUGsgUG5gz8wJwqA4mBkFrAcVg4OBwwHhwHMmA==",
3+
"witness": null
4+
}

test-data/last_will.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"program": "5wnQKEGJsWVABAmKSEGCrynMGLpUF69BbvwQFoAuY+y1ngQJfqSPabfWRZ9K3F2jdRYYBitLzfMz987l3WKtAxSudDhYOBTf5tlucUbKz5QK2LfAvMA1kChBh+DHCpJAk4cziqISK6EzABFXCwYvClhPYGFQusJfripGQssOAVt34AhgGJAoSQbgJxuBig/FJwqFobGHNddy8HoTqejIHGcv8bcleUZT57KmW1Vp7LXaMUR4qMQ4YBiE3n41BAOBgcOJFAGQOJwuLAGkHHAHHpBiBQbkHacYEf5RB7X1tMEVAbpXAfNhcd45LjO88p6usCblccJ7lByDCchhcRcOA4GJxgBwcGIGlafkwigGSWMMQSTRPhfidUim1MchFg2+ZsIYB8RO84Db5ByMCcj0kCT4YnM/BVazZBMsdgY/lS0WYcYfsNRJVmhtHQmf/PVrNEOe4wYBisgAAAAIGkKhambcTmCIv9QHGkTTAYXN78l9PRKwkaP7L+QgG2hgCZadW734oMAxC4AwcwLvfahR91ofRxdIEhoraXiTCljMruIwlAG9G26fy7ABhgGL4cEObxOhhI4BnviN4uejwVYdGCizvg8pDe+f7r9U2pQklHLAwDhITlckiyAAAAAAUKvhqObQQ6CxT1VyVCCLZUfrJhqhp/qbNkpewATHlLgTDwBZJgwDELSQkUM6IZzkLPP/t8aZ/NfTm5pw5IQ0J/duRiaFMIlp35sJi5uVAYBgObvJWcC0jz5LzKXn0/Nn/OQnPezJTiq+w46I+xAB5sdEwwDWQKEkH1m5aCgWDNug5tpVnanSODCL5dAHG0YZYXL7/GhLKIDD2ZYRxW4obTlfDAMQtRvoQT9zeJ/JSg1zVnOQ+dSDqBncb+M9zPuT55FUoWyEHDxeBVkAAAAAg4AFwB8NhzSoNzoMc1Ae/7Z55CGHj0gOG/ZVBjb5kbDqY2kAJh07WGAYhcGISKEGB4nAwHMDLqyIAl/t8mPC4rRGEfM1lVH7CAxNfptKDrOKJGwAHAYBrC4iNL6lcZ9HTU3CRlRyCoGVZzuEYuSi/jp604WRZrD9L3pYeQ4FCcTgcuhcLAcvAcWAchQuRgDmABzNhOZwDmDFyvAcwoOVQHLcHleBy6B5fgc34A==",
3+
"witness": null
4+
}

0 commit comments

Comments
 (0)