aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--test/test_branch.ml30
-rw-r--r--test/test_term.ml14
2 files changed, 35 insertions, 9 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;
] );
diff --git a/test/test_term.ml b/test/test_term.ml
index 20b2f1a..3601718 100644
--- a/test/test_term.ml
+++ b/test/test_term.ml
@@ -82,7 +82,17 @@ let test_printing () =
Alcotest.(check string) "sequence" "#(1 2 3)"
(print (Sol.Term.sequence [ int 1; int 2; int 3 ]));
Alcotest.(check string) "record" "{a: 1 b: 2}"
- (print (record [ (label "b", int 2); (label "a", int 1) ]))
+ (print (record [ (label "b", int 2); (label "a", int 1) ]));
+ Alcotest.(check string) "reference" "#Person"
+ (print (Result.get_ok (Sol.Term.reference "Person")))
+
+let test_reference_validation () =
+ Alcotest.(check bool) "well-formed" true
+ (Result.is_ok (Sol.Term.reference "Person"));
+ Alcotest.(check bool) "empty rejected" false
+ (Result.is_ok (Sol.Term.reference ""));
+ Alcotest.(check bool) "leading digit rejected" false
+ (Result.is_ok (Sol.Term.reference "1st"))
let test_label_validation () =
let ok s = Result.is_ok (Sol.Label.of_string s) in
@@ -122,5 +132,7 @@ let () =
[
Alcotest.test_case "printing" `Quick test_printing;
Alcotest.test_case "label validation" `Quick test_label_validation;
+ Alcotest.test_case "reference validation" `Quick
+ test_reference_validation;
] );
]