Skip to content

Instantly share code, notes, and snippets.

@renatoalencar
Created March 4, 2022 19:11
Show Gist options
  • Save renatoalencar/12c526d5c5d873fe1292e310a6cca0d2 to your computer and use it in GitHub Desktop.
Save renatoalencar/12c526d5c5d873fe1292e310a6cca0d2 to your computer and use it in GitHub Desktop.
Deku Lambda VM test cases
diff --git a/esy.lock/index.json b/esy.lock/index.json
index 472c19f2..950f6e8f 100644
--- a/esy.lock/index.json
+++ b/esy.lock/index.json
@@ -1,5 +1,5 @@
{
- "checksum": "06f9f237cf9dd0acc2174a26407cd7c3",
+ "checksum": "9d0b0d7d646f14d07c9584a66e8ae6a9",
"root": "sidechain@link-dev:./package.json",
"node": {
"yarn-pkg-config@github:esy-ocaml/yarn-pkg-config#db3a0b63883606dd57c54a7158d560d6cba8cd79@d41d8cd9": {
@@ -102,7 +102,7 @@
},
"overrides": [],
"dependencies": [
- "webpack-merge@5.8.0@d41d8cd9", "webpack@5.69.1@d41d8cd9",
+ "webpack-merge@5.8.0@d41d8cd9", "webpack@5.70.0@d41d8cd9",
"rechoir@0.7.1@d41d8cd9", "interpret@2.2.0@d41d8cd9",
"import-local@3.1.0@d41d8cd9", "fastest-levenshtein@1.0.12@d41d8cd9",
"execa@5.1.1@d41d8cd9", "commander@7.2.0@d41d8cd9",
@@ -113,14 +113,14 @@
],
"devDependencies": []
},
- "webpack@5.69.1@d41d8cd9": {
- "id": "webpack@5.69.1@d41d8cd9",
+ "webpack@5.70.0@d41d8cd9": {
+ "id": "webpack@5.70.0@d41d8cd9",
"name": "webpack",
- "version": "5.69.1",
+ "version": "5.70.0",
"source": {
"type": "install",
"source": [
- "archive:https://registry.npmjs.org/webpack/-/webpack-5.69.1.tgz#sha1:8cfd92c192c6a52c99ab00529b5a0d33aa848dc5"
+ "archive:https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz#sha1:3461e6287a72b5e6e2f4872700bc8de0d7500e6d"
]
},
"overrides": [],
@@ -132,7 +132,7 @@
"json-parse-better-errors@1.0.2@d41d8cd9",
"graceful-fs@4.2.9@d41d8cd9", "glob-to-regexp@0.4.1@d41d8cd9",
"events@3.3.0@d41d8cd9", "eslint-scope@5.1.1@d41d8cd9",
- "es-module-lexer@0.9.3@d41d8cd9", "enhanced-resolve@5.9.1@d41d8cd9",
+ "es-module-lexer@0.9.3@d41d8cd9", "enhanced-resolve@5.9.2@d41d8cd9",
"chrome-trace-event@1.0.3@d41d8cd9", "browserslist@4.19.3@d41d8cd9",
"acorn-import-assertions@1.8.0@d41d8cd9", "acorn@8.7.0@d41d8cd9",
"@webassemblyjs/wasm-parser@1.11.1@d41d8cd9",
@@ -226,7 +226,7 @@
},
"overrides": [],
"dependencies": [
- "webpack@5.69.1@d41d8cd9", "terser@5.12.0@d41d8cd9",
+ "webpack@5.70.0@d41d8cd9", "terser@5.12.0@d41d8cd9",
"source-map@0.6.1@d41d8cd9", "serialize-javascript@6.0.0@d41d8cd9",
"schema-utils@3.1.1@d41d8cd9", "jest-worker@27.5.1@d41d8cd9"
],
@@ -388,7 +388,7 @@
},
"overrides": [],
"dependencies": [
- "webpack-cli@4.9.2@d41d8cd9", "webpack@5.69.1@d41d8cd9",
+ "webpack-cli@4.9.2@d41d8cd9", "webpack@5.70.0@d41d8cd9",
"ocaml@github:esy-ocaml/ocaml#65e3f82dcd867d2b1f27c84597b3c25259b09396@d41d8cd9",
"@taquito/taquito@11.2.0@d41d8cd9",
"@taquito/signer@11.2.0@d41d8cd9", "@taquito/rpc@11.2.0@d41d8cd9",
@@ -410,7 +410,8 @@
"@opam/digestif@opam:1.1.0@a8d16625",
"@opam/data-encoding@opam:0.4@edfce09b",
"@opam/cmdliner@opam:1.0.4@93208aac",
- "@opam/bigstring@opam:0.3@d98556f0"
+ "@opam/bigstring@opam:0.3@d98556f0",
+ "@opam/alcotest@opam:1.5.0@338d9572"
],
"devDependencies": [
"prettier@2.5.1@d41d8cd9",
@@ -1624,14 +1625,14 @@
"dependencies": [],
"devDependencies": []
},
- "enhanced-resolve@5.9.1@d41d8cd9": {
- "id": "enhanced-resolve@5.9.1@d41d8cd9",
+ "enhanced-resolve@5.9.2@d41d8cd9": {
+ "id": "enhanced-resolve@5.9.2@d41d8cd9",
"name": "enhanced-resolve",
- "version": "5.9.1",
+ "version": "5.9.2",
"source": {
"type": "install",
"source": [
- "archive:https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.1.tgz#sha1:e898cea44d9199fd92137496cff5691b910fb43e"
+ "archive:https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz#sha1:0224dcd6a43389ebfb2d55efee517e5466772dd9"
]
},
"overrides": [],
@@ -2136,7 +2137,7 @@
},
"overrides": [],
"dependencies": [
- "webpack-cli@4.9.2@d41d8cd9", "webpack@5.69.1@d41d8cd9"
+ "webpack-cli@4.9.2@d41d8cd9", "webpack@5.70.0@d41d8cd9"
],
"devDependencies": []
},
diff --git a/package.json b/package.json
index a48a360f..5cb9222e 100644
--- a/package.json
+++ b/package.json
@@ -2,15 +2,8 @@
"name": "sidechain",
"esy": {
"build": "dune build -p #{self.name}",
- "release": {
- "bin": [
- "sidecli",
- "deku-node"
- ]
- },
- "buildEnv": {
- "PATH": "%{localStore}%/../bin:$PATH"
- }
+ "release": { "bin": [ "sidecli", "deku-node" ] },
+ "buildEnv": { "PATH": "%{localStore}%/../bin:$PATH" }
},
"license": "MIT",
"scripts": {
@@ -19,32 +12,33 @@
"build_static": "dune build --profile=static --release"
},
"dependencies": {
- "ocaml": "4.12.",
+ "@opam/alcotest": "1.5.0",
+ "@opam/bigstring": "*",
+ "@opam/cmdliner": "1.0.4",
+ "@opam/data-encoding": "*",
+ "@opam/digestif": "*",
+ "@opam/domainslib": "0.4.1",
+ "@opam/dream": "*",
"@opam/dune": "~2.9.3",
- "@opam/ppx_deriving": "*",
- "@opam/ppx_deriving_yojson": "*",
+ "@opam/hex": "*",
"@opam/lwt": "*",
"@opam/mirage-crypto": "*",
+ "@opam/mirage-crypto-ec": "*",
"@opam/mirage-crypto-pk": "*",
"@opam/mirage-crypto-rng": "*",
- "@opam/mirage-crypto-ec": "*",
- "@opam/dream": "*",
- "@opam/piaf": "*",
"@opam/mrmime": "0.3.2",
- "@opam/hex": "*",
+ "@opam/piaf": "*",
+ "@opam/ppx_blob": "*",
+ "@opam/ppx_deriving": "*",
+ "@opam/ppx_deriving_yojson": "*",
+ "@opam/secp256k1-internal": "*",
"@opam/tezos-micheline": "11.1",
- "@opam/digestif": "*",
- "@opam/cmdliner": "1.0.4",
- "@taquito/taquito": "^11.0.1",
- "@taquito/signer": "^11.0.1",
"@taquito/rpc": "^11.0.1",
+ "@taquito/signer": "^11.0.1",
+ "@taquito/taquito": "^11.0.1",
+ "ocaml": "4.12.",
"webpack": "^5.47.1",
- "webpack-cli": "^4.7.1",
- "@opam/ppx_blob": "*",
- "@opam/secp256k1-internal": "*",
- "@opam/bigstring": "*",
- "@opam/domainslib": "0.4.1",
- "@opam/data-encoding": "*"
+ "webpack-cli": "^4.7.1"
},
"devDependencies": {
"prettier": "^2.3.2",
@@ -57,16 +51,18 @@
},
"resolutions": {
"ocaml": "esy-ocaml/ocaml#65e3f82dcd867d2b1f27c84597b3c25259b09396",
- "@esy-ocaml/reason": "EduardoRFS/reason:reason.json#70984e94eae3084e56d0cfdf7d5d3be1ecda7b18",
- "@opam/reason": "EduardoRFS/reason:reason.json#70984e94eae3084e56d0cfdf7d5d3be1ecda7b18",
- "@reason-native/rely": "reasonml/reason-native:rely.json#7788757212c5b9365ed839b044c4840e3e917987",
- "@reason-native/cli": "reasonml/reason-native:cli.json#7788757212c5b9365ed839b044c4840e3e917987",
- "@opam/base-domains": {
- "source": "no-source:",
- "override": {}
- },
+ "@esy-ocaml/reason":
+ "EduardoRFS/reason:reason.json#70984e94eae3084e56d0cfdf7d5d3be1ecda7b18",
+ "@opam/reason":
+ "EduardoRFS/reason:reason.json#70984e94eae3084e56d0cfdf7d5d3be1ecda7b18",
+ "@reason-native/rely":
+ "reasonml/reason-native:rely.json#7788757212c5b9365ed839b044c4840e3e917987",
+ "@reason-native/cli":
+ "reasonml/reason-native:cli.json#7788757212c5b9365ed839b044c4840e3e917987",
+ "@opam/base-domains": { "source": "no-source:", "override": {} },
"@opam/dream": {
- "source": "EduardoRFS/dream:dream.opam#bd4c4b09b0ace2144384f97848bcfd6ad0856e7e",
+ "source":
+ "EduardoRFS/dream:dream.opam#bd4c4b09b0ace2144384f97848bcfd6ad0856e7e",
"override": {
"dependencies": {
"@opam/websocketaf": "*",
@@ -81,7 +77,8 @@
}
},
"@opam/piaf": {
- "source": "ulrikstrid/piaf:piaf.opam#79e8c830e4268b51d9a76e9ff1322a09aa1b6e14",
+ "source":
+ "ulrikstrid/piaf:piaf.opam#79e8c830e4268b51d9a76e9ff1322a09aa1b6e14",
"override": {
"dependencies": {
"@opam/base64": "*",
@@ -94,75 +91,87 @@
}
}
},
- "@opam/ssl": "anmonteiro/ocaml-ssl:ssl.opam#35e6dfa65181cccdfeee898702f45eca8afebbd4",
- "@opam/httpaf": "anmonteiro/httpaf:httpaf.opam#3a74fd8851e3019f5889ae1bf9350e90ed40017d",
- "@opam/httpaf-lwt": "anmonteiro/httpaf:httpaf-lwt.opam#3a74fd8851e3019f5889ae1bf9350e90ed40017d",
- "@opam/httpaf-lwt-unix": "anmonteiro/httpaf:httpaf-lwt-unix.opam#3a74fd8851e3019f5889ae1bf9350e90ed40017d",
- "@opam/h2": "anmonteiro/ocaml-h2:h2.opam#fa0c8a4746fdc50183e254f8c08239fc5b67717d",
- "@opam/h2-lwt": "anmonteiro/ocaml-h2:h2-lwt.opam#fa0c8a4746fdc50183e254f8c08239fc5b67717d",
- "@opam/h2-lwt-unix": "anmonteiro/ocaml-h2:h2-lwt-unix.opam#fa0c8a4746fdc50183e254f8c08239fc5b67717d",
- "@opam/websocketaf": "anmonteiro/websocketaf:websocketaf.opam#248a2cb0dcffa51996c3ad7643577dce75d67454",
- "@opam/websocketaf-lwt": "anmonteiro/websocketaf:websocketaf-lwt.opam#248a2cb0dcffa51996c3ad7643577dce75d67454",
- "@opam/websocketaf-lwt-unix": "anmonteiro/websocketaf:websocketaf-lwt-unix.opam#248a2cb0dcffa51996c3ad7643577dce75d67454",
- "@opam/ppxlib": "patricoferris/ppxlib:ppxlib.opam#91c39e958fca1dabf16f64dc7699ace7752f0014",
- "@opam/easy-format": "nojb/easy-format:easy-format.opam#4568bfa1887146ab6ce41a48c9e00c8c1329c6e4",
- "@opam/biniou": "EduardoRFS/biniou:biniou.opam#b5f099b4ad594e68383e55ffde6d296439d341b8",
- "@opam/sexplib0": "EduardoRFS/sexplib0:sexplib0.opam#6785e5fe565bdbcdbc00d861654b4f468d7a552c",
- "@opam/base": "EduardoRFS/base:base.opam#6ea52922e153b3a3aae6ffbf2379c6f442671ebd",
- "@opam/stdio": "janestreet/stdio:stdio.opam#f006beb417ee568c612c3d89824cfb6e15a98568",
+ "@opam/ssl":
+ "anmonteiro/ocaml-ssl:ssl.opam#35e6dfa65181cccdfeee898702f45eca8afebbd4",
+ "@opam/httpaf":
+ "anmonteiro/httpaf:httpaf.opam#3a74fd8851e3019f5889ae1bf9350e90ed40017d",
+ "@opam/httpaf-lwt":
+ "anmonteiro/httpaf:httpaf-lwt.opam#3a74fd8851e3019f5889ae1bf9350e90ed40017d",
+ "@opam/httpaf-lwt-unix":
+ "anmonteiro/httpaf:httpaf-lwt-unix.opam#3a74fd8851e3019f5889ae1bf9350e90ed40017d",
+ "@opam/h2":
+ "anmonteiro/ocaml-h2:h2.opam#fa0c8a4746fdc50183e254f8c08239fc5b67717d",
+ "@opam/h2-lwt":
+ "anmonteiro/ocaml-h2:h2-lwt.opam#fa0c8a4746fdc50183e254f8c08239fc5b67717d",
+ "@opam/h2-lwt-unix":
+ "anmonteiro/ocaml-h2:h2-lwt-unix.opam#fa0c8a4746fdc50183e254f8c08239fc5b67717d",
+ "@opam/websocketaf":
+ "anmonteiro/websocketaf:websocketaf.opam#248a2cb0dcffa51996c3ad7643577dce75d67454",
+ "@opam/websocketaf-lwt":
+ "anmonteiro/websocketaf:websocketaf-lwt.opam#248a2cb0dcffa51996c3ad7643577dce75d67454",
+ "@opam/websocketaf-lwt-unix":
+ "anmonteiro/websocketaf:websocketaf-lwt-unix.opam#248a2cb0dcffa51996c3ad7643577dce75d67454",
+ "@opam/ppxlib":
+ "patricoferris/ppxlib:ppxlib.opam#91c39e958fca1dabf16f64dc7699ace7752f0014",
+ "@opam/easy-format":
+ "nojb/easy-format:easy-format.opam#4568bfa1887146ab6ce41a48c9e00c8c1329c6e4",
+ "@opam/biniou":
+ "EduardoRFS/biniou:biniou.opam#b5f099b4ad594e68383e55ffde6d296439d341b8",
+ "@opam/sexplib0":
+ "EduardoRFS/sexplib0:sexplib0.opam#6785e5fe565bdbcdbc00d861654b4f468d7a552c",
+ "@opam/base":
+ "EduardoRFS/base:base.opam#6ea52922e153b3a3aae6ffbf2379c6f442671ebd",
+ "@opam/stdio":
+ "janestreet/stdio:stdio.opam#f006beb417ee568c612c3d89824cfb6e15a98568",
"@opam/ppx_hash": {
"version": "opam:v0.14.0",
- "override" : {
- "dependencies": {
- "@opam/ppx_sexp_conv": "*"
- }
- }
+ "override": { "dependencies": { "@opam/ppx_sexp_conv": "*" } }
},
"@opam/ppx_assert": {
"version": "opam:v0.14.0",
- "override" : {
- "dependencies": {
- "@opam/ppx_sexp_conv": "*"
- }
- }
+ "override": { "dependencies": { "@opam/ppx_sexp_conv": "*" } }
},
"@opam/ppx_base": {
"version": "opam:v0.14.0",
- "override" : {
- "dependencies": {
- "@opam/ppx_sexp_conv": "*"
- }
- }
+ "override": { "dependencies": { "@opam/ppx_sexp_conv": "*" } }
},
- "@opam/ppx_inline_test": "janestreet/ppx_inline_test:ppx_inline_test.opam#54e0a1cd2402126998d40f653876e59a7011bf75",
- "@opam/ppx_sexp_conv": "janestreet/ppx_sexp_conv:ppx_sexp_conv.opam#3d413303de3f76fecb19dc51c85b81c33c5c872a",
- "@opam/secp256k1-internal": "git:https://gitlab.com/marigold/ocaml-secp256k1-internal:secp256k1-internal.opam#964026bdb43db3ebffd1643599ec22e4caf8f2bc",
+ "@opam/ppx_inline_test":
+ "janestreet/ppx_inline_test:ppx_inline_test.opam#54e0a1cd2402126998d40f653876e59a7011bf75",
+ "@opam/ppx_sexp_conv":
+ "janestreet/ppx_sexp_conv:ppx_sexp_conv.opam#3d413303de3f76fecb19dc51c85b81c33c5c872a",
+ "@opam/secp256k1-internal":
+ "git:https://gitlab.com/marigold/ocaml-secp256k1-internal:secp256k1-internal.opam#964026bdb43db3ebffd1643599ec22e4caf8f2bc",
"@opam/ocaml-lsp-server": {
- "source": "EduardoRFS/ocaml-lsp:ocaml-lsp-server.opam#24fcebcec9f1e99815b036a6d45c0f912e8e8a19",
- "override": {
- "dependencies": {
- "@opam/ocamlformat-rpc-lib": "*"
- }
- }
+ "source":
+ "EduardoRFS/ocaml-lsp:ocaml-lsp-server.opam#24fcebcec9f1e99815b036a6d45c0f912e8e8a19",
+ "override": { "dependencies": { "@opam/ocamlformat-rpc-lib": "*" } }
},
- "@opam/ocamlformat": "EduardoRFS/ocamlformat:ocamlformat.opam#832e0a33d5cc05a77a335e6b6fa369172c742c95",
- "@opam/ocamlformat-rpc": "EduardoRFS/ocamlformat:ocamlformat-rpc.opam#832e0a33d5cc05a77a335e6b6fa369172c742c95",
- "@opam/ocamlformat-rpc-lib": "EduardoRFS/ocamlformat:ocamlformat-rpc-lib.opam#832e0a33d5cc05a77a335e6b6fa369172c742c95",
- "@opam/odoc": "ocaml/odoc:odoc.opam#d243b80287a73bf3f34292254b0e9d8b2f56cc47",
+ "@opam/ocamlformat":
+ "EduardoRFS/ocamlformat:ocamlformat.opam#832e0a33d5cc05a77a335e6b6fa369172c742c95",
+ "@opam/ocamlformat-rpc":
+ "EduardoRFS/ocamlformat:ocamlformat-rpc.opam#832e0a33d5cc05a77a335e6b6fa369172c742c95",
+ "@opam/ocamlformat-rpc-lib":
+ "EduardoRFS/ocamlformat:ocamlformat-rpc-lib.opam#832e0a33d5cc05a77a335e6b6fa369172c742c95",
+ "@opam/odoc":
+ "ocaml/odoc:odoc.opam#d243b80287a73bf3f34292254b0e9d8b2f56cc47",
"@opam/odoc-parser": {
- "source": "kit-ty-kate/odoc-parser:odoc-parser.opam#bfa00f8b36778e16166e17c529f289633caf9fa7",
- "override": {
- "dependencies": {
- "@opam/camlp-streams": "*"
- }
- }
+ "source":
+ "kit-ty-kate/odoc-parser:odoc-parser.opam#bfa00f8b36778e16166e17c529f289633caf9fa7",
+ "override": { "dependencies": { "@opam/camlp-streams": "*" } }
},
- "@opam/lwt": "kit-ty-kate/lwt:lwt.opam#0c4cc9d1238461b82b92d61c1c007cb1048509be",
- "@opam/ocplib-endian": "kit-ty-kate/ocplib-endian:ocplib-endian.opam#8136732deb8e7f69ece0a19cfc9f9a141ebe1d2b",
- "@opam/domainslib": "ocaml-multicore/domainslib:domainslib.opam#4ac01e870615e32291f0145a7cbdd5528b88ea59",
- "@opam/omd": "EduardoRFS/omd:omd.opam#74477dafa064a621b585eb7b637ad3b1d1b3dfef",
- "@opam/camomile": "kit-ty-kate/camomile:camomile.opam#12e8baac3cedaa18b98cdcc2d84196f8e52ee31c",
- "@opam/lwt_log": "kit-ty-kate/lwt_log:lwt_log.opam#604644d7c72af1f1e87ab4fc2d7e8f7376c9b906",
- "@opam/utop": "EduardoRFS/utop:utop.opam#8f93be9019235ea7224cf792beacad045ba7de4d"
+ "@opam/lwt":
+ "kit-ty-kate/lwt:lwt.opam#0c4cc9d1238461b82b92d61c1c007cb1048509be",
+ "@opam/ocplib-endian":
+ "kit-ty-kate/ocplib-endian:ocplib-endian.opam#8136732deb8e7f69ece0a19cfc9f9a141ebe1d2b",
+ "@opam/domainslib":
+ "ocaml-multicore/domainslib:domainslib.opam#4ac01e870615e32291f0145a7cbdd5528b88ea59",
+ "@opam/omd":
+ "EduardoRFS/omd:omd.opam#74477dafa064a621b585eb7b637ad3b1d1b3dfef",
+ "@opam/camomile":
+ "kit-ty-kate/camomile:camomile.opam#12e8baac3cedaa18b98cdcc2d84196f8e52ee31c",
+ "@opam/lwt_log":
+ "kit-ty-kate/lwt_log:lwt_log.opam#604644d7c72af1f1e87ab4fc2d7e8f7376c9b906",
+ "@opam/utop":
+ "EduardoRFS/utop:utop.opam#8f93be9019235ea7224cf792beacad045ba7de4d"
}
-}
+}
\ No newline at end of file
diff --git a/src/lambda_vm/interpreter.ml b/src/lambda_vm/interpreter.ml
index 891f5fbe..c3fdb2a5 100644
--- a/src/lambda_vm/interpreter.ml
+++ b/src/lambda_vm/interpreter.ml
@@ -190,3 +190,39 @@ let execute gas ~arg script =
let execute gas ~arg script =
try Ok (execute gas ~arg script) with
| Error error -> Error error
+
+let prim_to_string = function
+ | P_neg -> "P_neg"
+ | P_add -> "P_add"
+ | P_sub -> "P_sub"
+ | P_mul -> "P_mul"
+ | P_div -> "P_div"
+ | P_rem -> "P_rem"
+ | P_and -> "P_and"
+ | P_or -> "P_or"
+ | P_xor -> "P_xor"
+ | P_lsl -> "P_lsl"
+ | P_lsr -> "P_lsr"
+ | P_asr -> "P_asr"
+
+let rec pp_value fmt value =
+ match value with
+ | V_int64 value ->
+ Format.fprintf fmt "V_int64 %LdL" value
+ | V_pair { first ; second } ->
+ Format.pp_print_string fmt "V_pair { first = ";
+ pp_value fmt first;
+ Format.pp_print_string fmt "; second = ";
+ pp_value fmt second;
+ Format.pp_print_string fmt " }"
+ | V_closure _ ->
+ (* TODO: Format this with an unique ID for different closures *)
+ Format.pp_print_string fmt "Closure"
+ | V_primitive { args ; prim } ->
+ Format.fprintf fmt "V_primitive { prim = %s ; args = [" (prim_to_string prim);
+ List.iter
+ (fun value ->
+ pp_value fmt value;
+ Format.pp_print_string fmt "; ")
+ args;
+ Format.pp_print_string fmt "] }"
diff --git a/src/lambda_vm/interpreter.mli b/src/lambda_vm/interpreter.mli
index a02b49fb..8bebf3b4 100644
--- a/src/lambda_vm/interpreter.mli
+++ b/src/lambda_vm/interpreter.mli
@@ -14,3 +14,6 @@ type script_result = {
}
val execute :
Gas.t -> arg:Ir.value -> Ir.script -> (script_result, error) result
+
+val pp_value : Format.formatter -> Ir.value -> unit
+
diff --git a/src/lambda_vm/lambda_vm.mli b/src/lambda_vm/lambda_vm.mli
index c0b61f3a..ae79d66e 100644
--- a/src/lambda_vm/lambda_vm.mli
+++ b/src/lambda_vm/lambda_vm.mli
@@ -29,3 +29,6 @@ type script_result = {
}
val execute :
Gas.t -> arg:value -> script -> (script_result, execution_error) result
+
+val pp_value : Format.formatter -> value -> unit
+
diff --git a/tests/vm/dune b/tests/vm/dune
new file mode 100644
index 00000000..1a339dbd
--- /dev/null
+++ b/tests/vm/dune
@@ -0,0 +1,3 @@
+(test
+ (name test)
+ (libraries lambda_vm alcotest))
\ No newline at end of file
diff --git a/tests/vm/test.ml b/tests/vm/test.ml
new file mode 100644
index 00000000..6084b8a9
--- /dev/null
+++ b/tests/vm/test.ml
@@ -0,0 +1,74 @@
+open Lambda_vm
+
+let compilation_error_to_string: compile_error -> string = function
+ | Undefined_variable -> "Undefined_variable"
+
+let execution_error_to_string = function
+ | Undefined_variable -> "Undefined_variable"
+ | Over_applied_primitives -> "Over_applied_primitives"
+ | Value_is_not_pair -> "Value_is_not_pair"
+ | Value_is_not_int64 -> "Value_is_not_int64"
+ | Value_is_not_function -> "Value_is_not_function"
+ | Value_is_not_zero -> "Value_is_not_zero"
+
+let compile_exn gas script =
+ match compile gas script with
+ | Ok value -> value
+ | Error error -> failwith (compilation_error_to_string error)
+
+let compile_value_exn gas value =
+ match compile_value gas value with
+ | Ok value -> value
+ | Error error -> failwith (compilation_error_to_string error)
+
+let execute_exn gas arg script =
+ match execute gas ~arg script with
+ | Ok value -> value
+ | Error error -> failwith (execution_error_to_string error)
+
+let execute_ast gas arg script =
+ (* TODO: Use different gas to different stuff *)
+ let gas = Gas.make ~initial_gas:gas in
+ let script = compile_exn gas script in
+ let arg = compile_value_exn gas arg in
+ execute_exn gas arg script
+
+module Testable = struct
+ let value = Alcotest.testable Lambda_vm.pp_value ( = )
+end
+
+let test_increment () =
+ let script =
+ Ast.{ param = "x"
+ ; code = Pair { first = App { funct = Prim Add
+ ; arg = Pair { first = Var "x"
+ ; second = Const 1L } }
+ ; second = Pair { first = Const 0L
+ ; second = Const 0L } } }
+ in
+ let result = execute_ast 1901 (Int64 42L) script in
+ let expected_value = compile_value_exn (Gas.make ~initial_gas:101) (Int64 43L) in
+
+ Alcotest.(check Testable.value) "Same value" expected_value result.storage
+
+let test_decrement () =
+ let script =
+ Ast.{ param = "x"
+ ; code = Pair { first = App { funct = Prim Sub
+ ; arg = Pair { first = Var "x"
+ ; second = Const 1L } }
+ ; second = Pair { first = Const 0L
+ ; second = Const 0L } } }
+ in
+
+ let result = execute_ast 1901 (Int64 42L) script in
+ let expected_value = compile_value_exn (Gas.make ~initial_gas:101) (Int64 41L) in
+
+ Alcotest.(check Testable.value) "Same value" expected_value result.storage
+
+let () =
+ let open Alcotest in
+ run "Lambda VM" [
+ "Simple with primitive operations",
+ [ test_case "Increment" `Quick test_increment
+ ; test_case "Decrement" `Quick test_decrement ] ]
--
2.35.1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment