aboutsummaryrefslogtreecommitdiffstats
path: root/test/test_branch.ml
diff options
context:
space:
mode:
authorMarcos Magueta <maguetamarcos@gmail.com>2026-07-12 17:55:27 -0300
committerMarcos Magueta <maguetamarcos@gmail.com>2026-07-12 17:56:11 -0300
commitb4a2485afbf74e99e2147086fbca0568b7e2b7b8 (patch)
treef2f0f653c7de2d5a1b1565d0ec48c46dec580a5a /test/test_branch.ml
parentb7ab0a9d1f0275db32a526faf7cffe9d520b15c8 (diff)
downloadSOL-b4a2485afbf74e99e2147086fbca0568b7e2b7b8.tar.gz
SOL-b4a2485afbf74e99e2147086fbca0568b7e2b7b8.zip
relation references as a term kind, written #Name
Diffstat (limited to '')
-rw-r--r--test/test_branch.ml30
1 files changed, 22 insertions, 8 deletions
diff --git a/test/test_branch.ml b/test/test_branch.ml
index 2cfabdd..415e1c2 100644
--- a/test/test_branch.ml
+++ b/test/test_branch.ml
@@ -48,8 +48,8 @@ let test_transition_chain () =
let world = world () in
let source =
Printf.sprintf
- {| [Insert relation: "Person" tuple: {name: "Marcos" age: 30} before: %S after: S1] :and
- [Insert relation: "Person" tuple: {name: "Ana" age: 12} before: S1 after: S2] :and
+ {| [Insert relation: #Person tuple: {name: "Marcos" age: 30} before: %S after: S1] :and
+ [Insert relation: #Person tuple: {name: "Ana" age: 12} before: S1 after: S2] :and
[Person name: N age: A at: S2] |}
(tip_digest world)
in
@@ -59,7 +59,7 @@ let test_transition_chain () =
visible at S1. *)
let mid =
Printf.sprintf
- {| [Insert relation: "Person" tuple: {name: "Marcos" age: 30} before: %S after: S1] :and
+ {| [Insert relation: #Person tuple: {name: "Marcos" age: 30} before: %S after: S1] :and
[Person name: N age: A at: S1] |}
(tip_digest world)
in
@@ -73,7 +73,7 @@ let test_tip_unmoved_until_commit () =
solve world
(compile
(Printf.sprintf
- {| [Insert relation: "Person" tuple: {name: "Rui" age: 70} before: %S after: S1] |}
+ {| [Insert relation: #Person tuple: {name: "Rui" age: 70} before: %S after: S1] |}
before))
in
Alcotest.(check string) "solving commits nothing" before (tip_digest world)
@@ -85,7 +85,7 @@ let test_commit_and_conflict () =
solve world
(compile
(Printf.sprintf
- {| [Insert relation: "Person" tuple: {name: "Rui" age: 70} before: %S after: S1] |}
+ {| [Insert relation: #Person tuple: {name: "Rui" age: 70} before: %S after: S1] |}
root))
in
let next =
@@ -110,7 +110,7 @@ let test_integrity_at_transition () =
let world = world () in
let source =
Printf.sprintf
- {| [Insert relation: "Person" tuple: {name: "Ghost" age: "old"} before: %S after: S1] |}
+ {| [Insert relation: #Person tuple: {name: "Ghost" age: "old"} before: %S after: S1] |}
(tip_digest world)
in
Alcotest.(check int) "an ill-typed tuple is no transition" 0
@@ -120,13 +120,25 @@ let test_linearity_rejects_forks () =
let world = world () in
ignore world;
let source =
- {| [Insert relation: "Person" tuple: {name: "A" age: 1} before: S0 after: S1] :and
- [Insert relation: "Person" tuple: {name: "B" age: 2} before: S0 after: S2] |}
+ {| [Insert relation: #Person tuple: {name: "A" age: 1} before: S0 after: S1] :and
+ [Insert relation: #Person tuple: {name: "B" age: 2} before: S0 after: S2] |}
in
match Sol.Branch.linear (compile source) with
| Error _ -> ()
| Ok () -> Alcotest.fail "a fork inside one expression must be rejected"
+let test_unknown_relation_is_no_transition () =
+ (* Decision 15: inserting into a relation absent from the catalog
+ is a dangling reference, and there is no such transition. *)
+ let world = world () in
+ let source =
+ Printf.sprintf
+ {| [Insert relation: #Ghost tuple: {name: "X" age: 1} before: %S after: S1] |}
+ (tip_digest world)
+ in
+ Alcotest.(check int) "dangling reference" 0
+ (List.length (solve world (compile source)))
+
let test_reads_default_to_tip () =
let world = world () in
Alcotest.(check int) "the root tip has nobody" 0
@@ -145,6 +157,8 @@ let () =
test_integrity_at_transition;
Alcotest.test_case "linearity rejects forks" `Quick
test_linearity_rejects_forks;
+ Alcotest.test_case "unknown relation is no transition" `Quick
+ test_unknown_relation_is_no_transition;
Alcotest.test_case "reads default to tip" `Quick
test_reads_default_to_tip;
] );