summaryrefslogtreecommitdiff
path: root/ocaml/test/test_state.ml
blob: b5c980381430e4805ee66efc5cbe43ffe26c874e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
open Nock_lib
module State = Nock_lib.State
open Noun

let atom_int n = atom (Z.of_int n)

let make_test_kernel ~effects ~new_core =
  let gate_result = cell effects new_core in
  let gate_battery = cell (atom_int 1) gate_result in
  let gate_payload = cell (atom_int 0) (atom_int 0) in
  let gate = cell gate_battery gate_payload in
  let formula = cell (atom_int 0) (atom (Z.of_int 6)) in
  let battery =
    cell (atom_int 0)
      (cell (atom_int 0)
        (cell (atom_int 0) formula))
  in
  let payload = cell gate (atom_int 0) in
  cell battery payload

let test_boot_and_event_counter () =
  let state = State.create () in
  Alcotest.(check int64) "initial eve" 0L (State.event_number state);
  let kernel = atom_int 99 in
  State.boot state kernel;
  Alcotest.(check bool) "kernel after boot" true (equal kernel (State.arvo_core state));
  Alcotest.(check int64) "eve reset" 0L (State.event_number state)

let test_boot_with_explicit_eve () =
  let state = State.create () in
  let kernel = atom_int 7 in
  State.boot ~events_played:3L state kernel;
  Alcotest.(check bool) "kernel after boot" true (equal kernel (State.arvo_core state));
  Alcotest.(check int64) "eve preset" 3L (State.event_number state)

let test_poke_updates_core_and_counter () =
  let effects = atom_int 0 in
  let new_core = atom_int 123 in
  let kernel = make_test_kernel ~effects ~new_core in
  Alcotest.(check bool) "axis 23" true
    (equal (Noun.slot (Z.of_int 23) kernel) (cell (atom_int 0) (atom (Z.of_int 6))));
  let state = State.create ~initial:kernel () in
  let event = atom_int 42 in
  let returned = State.poke state event in
  Alcotest.(check bool) "effects" true (equal returned effects);
  Alcotest.(check bool) "new core" true (equal new_core (State.arvo_core state));
  Alcotest.(check int64) "eve increment" 1L (State.event_number state)

let test_peek () =
  let kernel = cell (atom_int 1) (atom_int 2) in
  let state = State.create ~initial:kernel () in
  let path = atom_int 0 in
  match State.peek state path with
  | Some result ->
      Alcotest.(check bool) "peek subject" true (equal result (cell path kernel))
  | None -> Alcotest.fail "peek should succeed"

let test_snapshot_roundtrip () =
  let kernel = cell (atom_int 5) (atom_int 6) in
  let state = State.create ~initial:kernel () in
  let jammed, eve = State.snapshot state in
  Alcotest.(check int64) "snapshot eve" 0L eve;
  let state' = State.create () in
  State.load_snapshot state' jammed eve;
  Alcotest.(check bool) "core restored" true (equal (State.arvo_core state') kernel)

let tests = [
  "boot", `Quick, test_boot_and_event_counter;
  "boot preset eve", `Quick, test_boot_with_explicit_eve;
  "poke", `Quick, test_poke_updates_core_and_counter;
  "peek", `Quick, test_peek;
  "snapshot", `Quick, test_snapshot_roundtrip;
]

let () = Alcotest.run "state" [ "state", tests ]