From 5de3f7a3ad7b0cf63b4a6cbddfc1e26359dea161 Mon Sep 17 00:00:00 2001 From: polwex Date: Mon, 6 Oct 2025 23:18:59 +0700 Subject: cleaned up tests --- ocaml/test/bench_cue_pill.ml | 218 ----------- ocaml/test/bench_nock.ml | 132 ------- ocaml/test/bench_serial.ml | 160 --------- ocaml/test/cache_solid.ml | 78 ---- ocaml/test/compare_events_3_4.ml | 161 --------- ocaml/test/debug_event4_slam.ml | 155 -------- ocaml/test/dune | 560 ++++++++++++++--------------- ocaml/test/examine_event3_effects.ml | 148 -------- ocaml/test/examine_ivory.ml | 86 ----- ocaml/test/examine_pill_events.ml | 88 ----- ocaml/test/explore_kernel_structure.ml | 108 ------ ocaml/test/inspect_boot_events.ml | 48 --- ocaml/test/inspect_event4_detail.ml | 132 ------- ocaml/test/inspect_events_simple.ml | 88 ----- ocaml/test/jam_compare.ml | 36 -- ocaml/test/old/bench_cue_pill.ml | 218 +++++++++++ ocaml/test/old/bench_nock.ml | 132 +++++++ ocaml/test/old/bench_serial.ml | 160 +++++++++ ocaml/test/old/cache_solid.ml | 78 ++++ ocaml/test/old/compare_events_3_4.ml | 161 +++++++++ ocaml/test/old/debug_event4_slam.ml | 155 ++++++++ ocaml/test/old/examine_event3_effects.ml | 148 ++++++++ ocaml/test/old/examine_ivory.ml | 86 +++++ ocaml/test/old/examine_pill_events.ml | 88 +++++ ocaml/test/old/explore_kernel_structure.ml | 108 ++++++ ocaml/test/old/inspect_boot_events.ml | 48 +++ ocaml/test/old/inspect_event4_detail.ml | 132 +++++++ ocaml/test/old/inspect_events_simple.ml | 88 +++++ ocaml/test/old/jam_compare.ml | 36 ++ ocaml/test/old/parse_solid_pill.ml | 190 ++++++++++ ocaml/test/old/test_ames.ml | 150 ++++++++ ocaml/test/old/test_arms.ml | 73 ++++ ocaml/test/old/test_arvo.ml | 69 ++++ ocaml/test/old/test_arvo_poke_correct.ml | 128 +++++++ ocaml/test/old/test_arvo_real_poke.ml | 103 ++++++ ocaml/test/old/test_arvo_slots.ml | 74 ++++ ocaml/test/old/test_arvo_structure.ml | 116 ++++++ ocaml/test/old/test_bench_one.ml | 15 + ocaml/test/old/test_boot_arvo_properly.ml | 220 ++++++++++++ ocaml/test/old/test_boot_solid_events.ml | 136 +++++++ ocaml/test/old/test_boot_with_slam.ml | 202 +++++++++++ ocaml/test/old/test_brass_cue.ml | 89 +++++ ocaml/test/old/test_clay.ml | 243 +++++++++++++ ocaml/test/old/test_correct_boot.ml | 131 +++++++ ocaml/test/old/test_cvere_poke.ml | 105 ++++++ ocaml/test/old/test_dill_iris.ml | 98 +++++ ocaml/test/old/test_event4_slot42.ml | 104 ++++++ ocaml/test/old/test_eventlog.ml | 155 ++++++++ ocaml/test/old/test_functional_bios.ml | 132 +++++++ ocaml/test/old/test_hex.ml | 26 ++ ocaml/test/old/test_http.ml | 186 ++++++++++ ocaml/test/old/test_ivory_boot.ml | 97 +++++ ocaml/test/old/test_ivory_structure.ml | 105 ++++++ ocaml/test/old/test_jam_debug.ml | 20 ++ ocaml/test/old/test_life_formula.ml | 48 +++ ocaml/test/old/test_life_on_bot.ml | 98 +++++ ocaml/test/old/test_multicore.ml | 204 +++++++++++ ocaml/test/old/test_nock.ml | 284 +++++++++++++++ ocaml/test/old/test_parallel_nock.ml | 244 +++++++++++++ ocaml/test/old/test_pill_depth.ml | 98 +++++ ocaml/test/old/test_poke_formulas.ml | 85 +++++ ocaml/test/old/test_poke_solid_arvo.ml | 120 +++++++ ocaml/test/old/test_real_arvo.ml | 111 ++++++ ocaml/test/old/test_roundtrip.ml | 15 + ocaml/test/old/test_runtime.ml | 178 +++++++++ ocaml/test/old/test_serial.ml | 185 ++++++++++ ocaml/test/old/test_slam_directly.ml | 108 ++++++ ocaml/test/old/test_solid_boot.ml | 116 ++++++ ocaml/test/old/test_solid_cvere_pattern.ml | 129 +++++++ ocaml/test/old/test_solid_structure.ml | 119 ++++++ ocaml/test/old/test_state.ml | 165 +++++++++ ocaml/test/old/test_two_phase_boot.ml | 42 +++ ocaml/test/old/test_two_stage_boot.ml | 277 ++++++++++++++ ocaml/test/parse_solid_pill.ml | 190 ---------- ocaml/test/test_ames.ml | 150 -------- ocaml/test/test_arms.ml | 73 ---- ocaml/test/test_arvo.ml | 69 ---- ocaml/test/test_arvo_poke_correct.ml | 128 ------- ocaml/test/test_arvo_real_poke.ml | 103 ------ ocaml/test/test_arvo_slots.ml | 74 ---- ocaml/test/test_arvo_structure.ml | 116 ------ ocaml/test/test_bench_one.ml | 15 - ocaml/test/test_boot_arvo_properly.ml | 220 ------------ ocaml/test/test_boot_solid_events.ml | 136 ------- ocaml/test/test_boot_with_slam.ml | 202 ----------- ocaml/test/test_brass_cue.ml | 89 ----- ocaml/test/test_clay.ml | 243 ------------- ocaml/test/test_correct_boot.ml | 131 ------- ocaml/test/test_cvere_poke.ml | 105 ------ ocaml/test/test_dill_iris.ml | 98 ----- ocaml/test/test_event4_slot42.ml | 104 ------ ocaml/test/test_eventlog.ml | 155 -------- ocaml/test/test_functional_bios.ml | 132 ------- ocaml/test/test_hex.ml | 26 -- ocaml/test/test_http.ml | 186 ---------- ocaml/test/test_ivory_boot.ml | 97 ----- ocaml/test/test_ivory_structure.ml | 105 ------ ocaml/test/test_jam_debug.ml | 20 -- ocaml/test/test_life_formula.ml | 48 --- ocaml/test/test_life_on_bot.ml | 98 ----- ocaml/test/test_multicore.ml | 204 ----------- ocaml/test/test_nock.ml | 284 --------------- ocaml/test/test_parallel_nock.ml | 244 ------------- ocaml/test/test_pill_depth.ml | 98 ----- ocaml/test/test_poke_formulas.ml | 85 ----- ocaml/test/test_poke_solid_arvo.ml | 120 ------- ocaml/test/test_real_arvo.ml | 111 ------ ocaml/test/test_roundtrip.ml | 15 - ocaml/test/test_runtime.ml | 178 --------- ocaml/test/test_serial.ml | 185 ---------- ocaml/test/test_slam_directly.ml | 108 ------ ocaml/test/test_solid_boot.ml | 116 ------ ocaml/test/test_solid_cvere_pattern.ml | 129 ------- ocaml/test/test_solid_structure.ml | 119 ------ ocaml/test/test_state.ml | 165 --------- ocaml/test/test_two_phase_boot.ml | 42 --- 116 files changed, 7511 insertions(+), 7234 deletions(-) delete mode 100644 ocaml/test/bench_cue_pill.ml delete mode 100644 ocaml/test/bench_nock.ml delete mode 100644 ocaml/test/bench_serial.ml delete mode 100644 ocaml/test/cache_solid.ml delete mode 100644 ocaml/test/compare_events_3_4.ml delete mode 100644 ocaml/test/debug_event4_slam.ml delete mode 100644 ocaml/test/examine_event3_effects.ml delete mode 100644 ocaml/test/examine_ivory.ml delete mode 100644 ocaml/test/examine_pill_events.ml delete mode 100644 ocaml/test/explore_kernel_structure.ml delete mode 100644 ocaml/test/inspect_boot_events.ml delete mode 100644 ocaml/test/inspect_event4_detail.ml delete mode 100644 ocaml/test/inspect_events_simple.ml delete mode 100644 ocaml/test/jam_compare.ml create mode 100644 ocaml/test/old/bench_cue_pill.ml create mode 100644 ocaml/test/old/bench_nock.ml create mode 100644 ocaml/test/old/bench_serial.ml create mode 100644 ocaml/test/old/cache_solid.ml create mode 100644 ocaml/test/old/compare_events_3_4.ml create mode 100644 ocaml/test/old/debug_event4_slam.ml create mode 100644 ocaml/test/old/examine_event3_effects.ml create mode 100644 ocaml/test/old/examine_ivory.ml create mode 100644 ocaml/test/old/examine_pill_events.ml create mode 100644 ocaml/test/old/explore_kernel_structure.ml create mode 100644 ocaml/test/old/inspect_boot_events.ml create mode 100644 ocaml/test/old/inspect_event4_detail.ml create mode 100644 ocaml/test/old/inspect_events_simple.ml create mode 100644 ocaml/test/old/jam_compare.ml create mode 100644 ocaml/test/old/parse_solid_pill.ml create mode 100644 ocaml/test/old/test_ames.ml create mode 100644 ocaml/test/old/test_arms.ml create mode 100644 ocaml/test/old/test_arvo.ml create mode 100644 ocaml/test/old/test_arvo_poke_correct.ml create mode 100644 ocaml/test/old/test_arvo_real_poke.ml create mode 100644 ocaml/test/old/test_arvo_slots.ml create mode 100644 ocaml/test/old/test_arvo_structure.ml create mode 100644 ocaml/test/old/test_bench_one.ml create mode 100644 ocaml/test/old/test_boot_arvo_properly.ml create mode 100644 ocaml/test/old/test_boot_solid_events.ml create mode 100644 ocaml/test/old/test_boot_with_slam.ml create mode 100644 ocaml/test/old/test_brass_cue.ml create mode 100644 ocaml/test/old/test_clay.ml create mode 100644 ocaml/test/old/test_correct_boot.ml create mode 100644 ocaml/test/old/test_cvere_poke.ml create mode 100644 ocaml/test/old/test_dill_iris.ml create mode 100644 ocaml/test/old/test_event4_slot42.ml create mode 100644 ocaml/test/old/test_eventlog.ml create mode 100644 ocaml/test/old/test_functional_bios.ml create mode 100644 ocaml/test/old/test_hex.ml create mode 100644 ocaml/test/old/test_http.ml create mode 100644 ocaml/test/old/test_ivory_boot.ml create mode 100644 ocaml/test/old/test_ivory_structure.ml create mode 100644 ocaml/test/old/test_jam_debug.ml create mode 100644 ocaml/test/old/test_life_formula.ml create mode 100644 ocaml/test/old/test_life_on_bot.ml create mode 100644 ocaml/test/old/test_multicore.ml create mode 100644 ocaml/test/old/test_nock.ml create mode 100644 ocaml/test/old/test_parallel_nock.ml create mode 100644 ocaml/test/old/test_pill_depth.ml create mode 100644 ocaml/test/old/test_poke_formulas.ml create mode 100644 ocaml/test/old/test_poke_solid_arvo.ml create mode 100644 ocaml/test/old/test_real_arvo.ml create mode 100644 ocaml/test/old/test_roundtrip.ml create mode 100644 ocaml/test/old/test_runtime.ml create mode 100644 ocaml/test/old/test_serial.ml create mode 100644 ocaml/test/old/test_slam_directly.ml create mode 100644 ocaml/test/old/test_solid_boot.ml create mode 100644 ocaml/test/old/test_solid_cvere_pattern.ml create mode 100644 ocaml/test/old/test_solid_structure.ml create mode 100644 ocaml/test/old/test_state.ml create mode 100644 ocaml/test/old/test_two_phase_boot.ml create mode 100644 ocaml/test/old/test_two_stage_boot.ml delete mode 100644 ocaml/test/parse_solid_pill.ml delete mode 100644 ocaml/test/test_ames.ml delete mode 100644 ocaml/test/test_arms.ml delete mode 100644 ocaml/test/test_arvo.ml delete mode 100644 ocaml/test/test_arvo_poke_correct.ml delete mode 100644 ocaml/test/test_arvo_real_poke.ml delete mode 100644 ocaml/test/test_arvo_slots.ml delete mode 100644 ocaml/test/test_arvo_structure.ml delete mode 100644 ocaml/test/test_bench_one.ml delete mode 100644 ocaml/test/test_boot_arvo_properly.ml delete mode 100644 ocaml/test/test_boot_solid_events.ml delete mode 100644 ocaml/test/test_boot_with_slam.ml delete mode 100644 ocaml/test/test_brass_cue.ml delete mode 100644 ocaml/test/test_clay.ml delete mode 100644 ocaml/test/test_correct_boot.ml delete mode 100644 ocaml/test/test_cvere_poke.ml delete mode 100644 ocaml/test/test_dill_iris.ml delete mode 100644 ocaml/test/test_event4_slot42.ml delete mode 100644 ocaml/test/test_eventlog.ml delete mode 100644 ocaml/test/test_functional_bios.ml delete mode 100644 ocaml/test/test_hex.ml delete mode 100644 ocaml/test/test_http.ml delete mode 100644 ocaml/test/test_ivory_boot.ml delete mode 100644 ocaml/test/test_ivory_structure.ml delete mode 100644 ocaml/test/test_jam_debug.ml delete mode 100644 ocaml/test/test_life_formula.ml delete mode 100644 ocaml/test/test_life_on_bot.ml delete mode 100644 ocaml/test/test_multicore.ml delete mode 100644 ocaml/test/test_nock.ml delete mode 100644 ocaml/test/test_parallel_nock.ml delete mode 100644 ocaml/test/test_pill_depth.ml delete mode 100644 ocaml/test/test_poke_formulas.ml delete mode 100644 ocaml/test/test_poke_solid_arvo.ml delete mode 100644 ocaml/test/test_real_arvo.ml delete mode 100644 ocaml/test/test_roundtrip.ml delete mode 100644 ocaml/test/test_runtime.ml delete mode 100644 ocaml/test/test_serial.ml delete mode 100644 ocaml/test/test_slam_directly.ml delete mode 100644 ocaml/test/test_solid_boot.ml delete mode 100644 ocaml/test/test_solid_cvere_pattern.ml delete mode 100644 ocaml/test/test_solid_structure.ml delete mode 100644 ocaml/test/test_state.ml delete mode 100644 ocaml/test/test_two_phase_boot.ml diff --git a/ocaml/test/bench_cue_pill.ml b/ocaml/test/bench_cue_pill.ml deleted file mode 100644 index 064f0c5..0000000 --- a/ocaml/test/bench_cue_pill.ml +++ /dev/null @@ -1,218 +0,0 @@ -open Nock_lib - -exception Stop of string - -type limits = { - max_nouns : int; - max_bytes : int option; - progress_interval : int; - pill_path : string; - verbose : bool; - stop_atom_bits : int option; -} - -let read_file_bytes path = - let ic = open_in_bin path in - let len = in_channel_length ic in - let data = really_input_string ic len in - close_in ic; - Bytes.of_string data - -let mib_of_bytes bytes = float_of_int bytes /. (1024. *. 1024.) - -let run limits = - let pill_bytes = read_file_bytes limits.pill_path in - let total_bytes = Bytes.length pill_bytes in - - Printf.printf "Benchmarking cue on %s (%.2f MiB)\n" limits.pill_path - (mib_of_bytes total_bytes); - Stdlib.flush Stdlib.stdout; - - let start = Unix.gettimeofday () in - let last_print = ref start in - let processed_nouns = ref 0 in - let processed_bytes = ref 0 in - let current_depth = ref 0 in - let peak_depth = ref 0 in - let stop_reason = ref None in - let largest_atom_bits = ref 0 in - let largest_atom_total = ref 0 in - let longest_emit_gap = ref 0.0 in - let last_emit_time = ref start in - - let needs_inspect = limits.verbose || Option.is_some limits.stop_atom_bits in - let maybe_inspect = - if not needs_inspect then None - else - let atom_log_threshold_bits = 1024 in - Some - (fun event -> - match event with - | Serial.Cue_atom_begin { position; value_bits } -> - (match limits.stop_atom_bits with - | Some threshold when value_bits >= threshold -> - stop_reason := - Some - (Printf.sprintf - "encountered large atom (%d bits) at position %d" - value_bits position); - raise (Stop "atom limit") - | _ -> ()); - if limits.verbose && value_bits >= atom_log_threshold_bits then - Printf.printf - " [atom-start] pos=%d value_bits=%d (~%.2f KiB)\n%!" - position value_bits - (float_of_int value_bits /. 8. /. 1024.) - | Serial.Cue_atom_end { position; total_bits; value_bits } -> - if value_bits > !largest_atom_bits then begin - largest_atom_bits := value_bits; - largest_atom_total := total_bits; - if limits.verbose then - Printf.printf - " [atom-end] pos=%d value_bits=%d total_bits=%d (~%.2f KiB)\n%!" - position value_bits total_bits - (float_of_int value_bits /. 8. /. 1024.) - end; - | Serial.Cue_emit { nouns; depth; max_depth } -> - let now = Unix.gettimeofday () in - let gap = now -. !last_emit_time in - if gap > !longest_emit_gap then longest_emit_gap := gap; - if limits.verbose && gap > 0.2 then - Printf.printf - " [emit] gap %.3fs before noun %d (depth=%d peak=%d)\n%!" - gap nouns depth max_depth; - last_emit_time := now - | Serial.Cue_backref _ -> ()) - in - - let progress ~nouns ~bits ~depth ~max_depth = - processed_nouns := nouns; - processed_bytes := bits / 8; - current_depth := depth; - peak_depth := max_depth; - - let now = Unix.gettimeofday () in - if now -. !last_print >= 0.5 then begin - let elapsed = now -. start in - let mib = mib_of_bytes !processed_bytes in - let nouns_rate = float_of_int nouns /. elapsed in - let mib_rate = mib /. elapsed in - Printf.printf - " %.1fs | nouns=%d (%.0f/s) | %.2f MiB (%.2f MiB/s) | depth=%d/%d\n%!" - elapsed nouns nouns_rate mib mib_rate depth max_depth; - last_print := now - end; - - if limits.max_nouns > 0 && nouns >= limits.max_nouns then begin - stop_reason := Some (Printf.sprintf "reached noun limit %d" limits.max_nouns); - raise (Stop "noun limit") - end; - - begin - match limits.max_bytes with - | None -> () - | Some byte_limit -> - if !processed_bytes >= byte_limit then begin - stop_reason := - Some - (Printf.sprintf "reached byte limit %.2f MiB" - (mib_of_bytes byte_limit)); - raise (Stop "byte limit") - end - end - in - - let result = - try - let _ = - Serial.cue ~progress - ~progress_interval:limits.progress_interval - ?inspect:maybe_inspect - pill_bytes - in - `Finished - with - | Stop _ -> `Stopped - in - - let elapsed = Unix.gettimeofday () -. start in - let nouns = !processed_nouns in - let bytes = !processed_bytes in - let mib = mib_of_bytes bytes in - let nouns_rate = float_of_int nouns /. elapsed in - let mib_rate = mib /. elapsed in - let depth_now = !current_depth in - let depth_max = !peak_depth in - - begin - match result with - | `Finished -> Printf.printf "Completed full cue.\n" - | `Stopped -> - Printf.printf "Stopped early (%s).\n" - (Option.value ~default:"manual stop" !stop_reason) - end; - - Printf.printf - "Processed %d nouns in %.2fs (%.2f MiB) \n -> %.0f nouns/s, %.2f MiB/s\n Depth: current=%d peak=%d\n" - nouns elapsed mib nouns_rate mib_rate depth_now depth_max; - if limits.verbose then - Printf.printf - " Largest atom: value_bits=%d (~%.2f KiB), total_bits=%d\n Longest emit gap: %.3fs\n" - !largest_atom_bits - (float_of_int !largest_atom_bits /. 8. /. 1024.) - !largest_atom_total - !longest_emit_gap; - Stdlib.flush Stdlib.stdout - -let parse_limits () = - let pill_path = ref "solid.pill" in - let noun_limit = ref 200_000 in - let mib_limit = ref 0.0 in - let progress_interval = ref 50_000 in - let verbose = ref false in - let stop_atom_bits = ref 0 in - - let spec = - [ ( "--pill", - Arg.String (fun s -> pill_path := s), - "Path to pill (default: solid.pill)" ); - ( "--limit-nouns", - Arg.Int (fun n -> noun_limit := n), - "Stop after decoding at least this many nouns (default 200000, 0 to disable)" - ); - ( "--limit-mib", - Arg.Float (fun f -> mib_limit := f), - "Stop after reading this many MiB of data (default 0 = disable)" ); - ( "--progress-interval", - Arg.Int (fun i -> progress_interval := i), - "Number of nouns between progress callbacks (default 50000)" ) - ; ( "--verbose", - Arg.Unit (fun () -> verbose := true), - "Enable detailed logging of atoms and emit gaps" ) - ; ( "--stop-atom-bits", - Arg.Int (fun b -> stop_atom_bits := b), - "Abort when encountering an atom with this many value bits or more" ) - ] - in - - let usage = "bench_cue_pill [options]" in - Arg.parse spec (fun _ -> ()) usage; - - let max_nouns = if !noun_limit <= 0 then 0 else !noun_limit in - let max_bytes = - if !mib_limit <= 0. then None - else - let bytes = int_of_float (!mib_limit *. 1024. *. 1024.) in - Some bytes - in - - { - max_nouns; - max_bytes; - progress_interval = if !progress_interval <= 0 then 1 else !progress_interval; - pill_path = !pill_path; - verbose = !verbose; - stop_atom_bits = if !stop_atom_bits <= 0 then None else Some !stop_atom_bits; - } - -let () = run (parse_limits ()) diff --git a/ocaml/test/bench_nock.ml b/ocaml/test/bench_nock.ml deleted file mode 100644 index a71b3da..0000000 --- a/ocaml/test/bench_nock.ml +++ /dev/null @@ -1,132 +0,0 @@ -open Nock_lib.Noun -open Nock_lib.Nock - -(** Benchmark utilities *) - -let time_ms () = - Unix.gettimeofday () *. 1000.0 - -let bench_nock name subject formula iterations = - (* Warmup *) - for _i = 1 to 100 do - let _ = nock subject formula in () - done; - - (* Actual benchmark *) - Gc.compact (); - let start = time_ms () in - - for _i = 1 to iterations do - let _result = nock subject formula in () - done; - - let finish = time_ms () in - let total = finish -. start in - let per_iter = total /. (float_of_int iterations) in - let ops_per_sec = 1000.0 /. per_iter in - - Printf.printf "%-30s %8d iterations in %10.2f ms (%10.6f ms/iter, %10.0f ops/sec)\n" - name iterations total per_iter ops_per_sec - -(** Benchmarks *) - -let () = - Printf.printf "Nock Benchmark - OCaml Implementation\n"; - Printf.printf "======================================\n\n"; - - let iterations = 1_000_000 in (* 1M iterations for fast ops *) - let slow_iters = 100_000 in (* 100K for slower ops *) - - (* Benchmark 0: slot lookup *) - begin - let subject = cell (atom 42) (atom 99) in - let formula = cell (atom 0) (atom 2) in (* [0 2] - get head *) - bench_nock "Opcode 0: slot/fragment" subject formula iterations - end; - - (* Benchmark 1: constant *) - begin - let subject = atom 0 in - let formula = cell (atom 1) (atom 42) in (* [1 42] *) - bench_nock "Opcode 1: constant" subject formula iterations - end; - - (* Benchmark 3: is-cell *) - begin - let subject = atom 0 in - let formula = cell (atom 3) (cell (atom 1) (atom 42)) in (* [3 [1 42]] *) - bench_nock "Opcode 3: is-cell (atom)" subject formula iterations - end; - - (* Benchmark 4: increment *) - begin - let subject = atom 0 in - let formula = cell (atom 4) (cell (atom 1) (atom 1000)) in (* [4 [1 1000]] *) - bench_nock "Opcode 4: increment" subject formula iterations - end; - - (* Benchmark 5: equality *) - begin - let subject = atom 0 in - (* [5 [1 42] [1 42]] *) - let formula = cell (atom 5) (cell (cell (atom 1) (atom 42)) (cell (atom 1) (atom 42))) in - bench_nock "Opcode 5: equality (equal)" subject formula iterations - end; - - (* Benchmark 6: if-then-else *) - begin - let subject = atom 0 in - (* [6 [1 0] [1 11] [1 22]] *) - let formula = cell (atom 6) - (cell (cell (atom 1) (atom 0)) - (cell (cell (atom 1) (atom 11)) - (cell (atom 1) (atom 22)))) in - bench_nock "Opcode 6: if-then-else" subject formula iterations - end; - - (* Benchmark 7: composition *) - begin - let subject = atom 42 in - (* [7 [1 99] [0 1]] *) - let formula = cell (atom 7) (cell (cell (atom 1) (atom 99)) (cell (atom 0) (atom 1))) in - bench_nock "Opcode 7: composition" subject formula iterations - end; - - (* Benchmark 8: push *) - begin - let subject = atom 42 in - (* [8 [1 99] [0 1]] *) - let formula = cell (atom 8) (cell (cell (atom 1) (atom 99)) (cell (atom 0) (atom 1))) in - bench_nock "Opcode 8: push" subject formula iterations - end; - - (* Benchmark: Decrement-like operation (slower) *) - begin - (* [6 [5 [0 1] [1 0]] [1 0] [8 [1 0] [4 [0 3]]]] *) - (* This is: if(subject == 0) 0 else subject+1 (simplified) *) - let dec_fol = cell (atom 6) - (cell (cell (atom 5) (cell (cell (atom 0) (atom 1)) (cell (atom 1) (atom 0)))) - (cell (cell (atom 1) (atom 0)) - (cell (atom 8) (cell (cell (atom 1) (atom 0)) (cell (atom 4) (cell (atom 0) (atom 3))))))) in - - let subject = atom 10 in - bench_nock "Complex: decrement loop" subject dec_fol slow_iters - end; - - (* Benchmark: Tree construction *) - begin - let subject = atom 0 in - (* [[1 1] [1 2]] - constructs a cell *) - let formula = cell (cell (atom 1) (atom 1)) (cell (atom 1) (atom 2)) in - bench_nock "Cell construction" subject formula iterations - end; - - (* Benchmark: Deep slot lookup *) - begin - (* Build a deep tree: [[[[1 2] 3] 4] 5] *) - let subject = cell (cell (cell (cell (atom 1) (atom 2)) (atom 3)) (atom 4)) (atom 5) in - let formula = cell (atom 0) (atom 16) in (* slot 16 = deepest left (1) *) - bench_nock "Deep slot lookup (depth 4)" subject formula iterations - end; - - Printf.printf "\n" diff --git a/ocaml/test/bench_serial.ml b/ocaml/test/bench_serial.ml deleted file mode 100644 index a8e5bdf..0000000 --- a/ocaml/test/bench_serial.ml +++ /dev/null @@ -1,160 +0,0 @@ -open Nock_lib.Noun -open Nock_lib.Serial - -(** Benchmark utilities *) - -let time_it f = - let start = Unix.gettimeofday () in - let result = f () in - let elapsed = Unix.gettimeofday () -. start in - (result, elapsed) - -let benchmark name iterations f = - (* Warmup *) - for _i = 1 to min 100 (iterations / 10) do - let _ = f () in - () - done; - - (* Actual benchmark *) - let times = ref [] in - for _i = 1 to iterations do - let (_, elapsed) = time_it f in - times := elapsed :: !times - done; - - let total = List.fold_left (+.) 0.0 !times in - let avg = total /. float_of_int iterations in - let sorted = List.sort compare !times in - let median = List.nth sorted (iterations / 2) in - - Printf.printf "%-40s %d iters: avg=%.6f median=%.6f total=%.6f\n" - name iterations avg median total - -(** Benchmark cases *) - -let bench_atom_small () = - benchmark "jam/cue small atom (42)" 100000 (fun () -> - let n = atom 42 in - let j = jam n in - let c = cue j in - c - ) - -let bench_atom_large () = - benchmark "jam/cue large atom (2^64)" 10000 (fun () -> - let n = Atom (Z.shift_left Z.one 64) in - let j = jam n in - let c = cue j in - c - ) - -let bench_cell_simple () = - benchmark "jam/cue simple cell [1 2]" 100000 (fun () -> - let n = cell (atom 1) (atom 2) in - let j = jam n in - let c = cue j in - c - ) - -let bench_tree_balanced () = - let tree = - cell - (cell (cell (atom 1) (atom 2)) (cell (atom 3) (atom 4))) - (cell (cell (atom 5) (atom 6)) (cell (atom 7) (atom 8))) - in - benchmark "jam/cue balanced tree (depth 3)" 50000 (fun () -> - let j = jam tree in - let c = cue j in - c - ) - -let bench_list_structure () = - let rec make_list n = - if n = 0 then atom 0 - else cell (atom n) (make_list (n - 1)) - in - let list = make_list 20 in - benchmark "jam/cue list structure (20 elements)" 10000 (fun () -> - let j = jam list in - let c = cue j in - c - ) - -let bench_deep_nesting () = - let rec make_deep n = - if n = 0 then atom 0 - else cell (atom n) (make_deep (n - 1)) - in - let deep = make_deep 100 in - benchmark "jam/cue deep nesting (100 levels)" 1000 (fun () -> - let j = jam deep in - let c = cue j in - c - ) - -let bench_jam_only_small () = - let n = atom 42 in - benchmark "jam only (small atom)" 100000 (fun () -> - let j = jam n in - j - ) - -let bench_cue_only_small () = - let n = atom 42 in - let j = jam n in - (* Copy the bytes to avoid any mutation issues *) - let j_copy = Bytes.copy j in - benchmark "cue only (small atom)" 100000 (fun () -> - let c = cue j_copy in - c - ) - -let bench_jam_only_tree () = - let tree = - cell - (cell (cell (atom 1) (atom 2)) (cell (atom 3) (atom 4))) - (cell (cell (atom 5) (atom 6)) (cell (atom 7) (atom 8))) - in - benchmark "jam only (balanced tree)" 50000 (fun () -> - let j = jam tree in - j - ) - -let bench_cue_only_tree () = - let tree = - cell - (cell (cell (atom 1) (atom 2)) (cell (atom 3) (atom 4))) - (cell (cell (atom 5) (atom 6)) (cell (atom 7) (atom 8))) - in - let j = jam tree in - (* Copy the bytes to avoid any mutation issues *) - let j_copy = Bytes.copy j in - benchmark "cue only (balanced tree)" 50000 (fun () -> - let c = cue j_copy in - c - ) - -(** Run all benchmarks *) -let () = - Printf.printf "========================================\n"; - Printf.printf "Jam/Cue Serialization Benchmarks\n"; - Printf.printf "========================================\n\n"; - - Printf.printf "Round-trip benchmarks:\n"; - bench_atom_small (); - bench_atom_large (); - bench_cell_simple (); - bench_tree_balanced (); - bench_list_structure (); - bench_deep_nesting (); - - Printf.printf "\nJam-only benchmarks:\n"; - bench_jam_only_small (); - bench_jam_only_tree (); - - Printf.printf "\nCue-only benchmarks:\n"; - bench_cue_only_small (); - bench_cue_only_tree (); - - Printf.printf "\n========================================\n" diff --git a/ocaml/test/cache_solid.ml b/ocaml/test/cache_solid.ml deleted file mode 100644 index 7ad7df0..0000000 --- a/ocaml/test/cache_solid.ml +++ /dev/null @@ -1,78 +0,0 @@ -(* Cache Solid Pill - Cue once and save marshalled OCaml noun - * - * This cues the solid pill once (slow) and saves the resulting - * noun using OCaml's Marshal for fast loading later - *) - -open Nock_lib - -let cache_solid env = - Printf.printf "Caching solid pill...\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Load and cue solid pill *) - Printf.printf "Step 1: Loading solid.pill (8.7 MB)...\n"; - let file_path = Eio.Path.(fs / "solid.pill") in - let pill_bytes = Eio.Path.load file_path |> Bytes.of_string in - Printf.printf " Loaded %d bytes\n\n" (Bytes.length pill_bytes); - - Printf.printf "Step 2: Cuing (this will take several minutes)...\n"; - let start = Unix.gettimeofday () in - let last_tick = ref start in - let last_nouns = ref 0 in - let last_depth = ref 0 in - let last_peak = ref 0 in - let bytes_seen = ref 0 in - - let total_bytes = Bytes.length pill_bytes in - - let progress ~nouns ~bits ~depth ~max_depth = - last_nouns := nouns; - last_depth := depth; - last_peak := max_depth; - bytes_seen := bits / 8; - - let now = Unix.gettimeofday () in - if now -. !last_tick >= 1.0 then begin - let mb = float_of_int !bytes_seen /. (1024. *. 1024.) in - let pct = (float_of_int !bytes_seen /. float_of_int total_bytes) *. 100. in - Printf.printf " %.1fs | %.2f MiB (%.1f%%) | nouns=%d depth=%d/%d\n%!" - (now -. start) mb pct !last_nouns !last_depth !last_peak; - last_tick := now - end - in - - let pill = - Serial.cue - ~progress - ~progress_interval:50_000 - pill_bytes - in - - let elapsed = Unix.gettimeofday () -. start in - Printf.printf - " ✓ Cued in %.1fs (%.2f MiB, nouns=%d, max depth=%d)\n\n" - elapsed - (float_of_int total_bytes /. (1024. *. 1024.)) - !last_nouns - !last_peak; - - Printf.printf "Step 3: Marshalling noun to solid.noun...\n"; - let out_channel = open_out_bin "solid.noun" in - Marshal.to_channel out_channel pill []; - close_out out_channel; - Printf.printf " ✓ Saved to solid.noun\n\n"; - - Printf.printf "Step 4: Testing reload speed...\n"; - let start = Unix.gettimeofday () in - let in_channel = open_in_bin "solid.noun" in - let _reloaded = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - let elapsed = Unix.gettimeofday () -. start in - Printf.printf " ✓ Reloaded in %.4fs (much faster!)\n\n" elapsed; - - Printf.printf "Done! Use solid.noun for fast testing.\n" - -let () = Eio_main.run cache_solid diff --git a/ocaml/test/compare_events_3_4.ml b/ocaml/test/compare_events_3_4.ml deleted file mode 100644 index b134d68..0000000 --- a/ocaml/test/compare_events_3_4.ml +++ /dev/null @@ -1,161 +0,0 @@ -(* Compare Events 3 and 4 structures in detail *) - -open Nock_lib - -let rec describe_noun noun max_depth current_depth = - if current_depth > max_depth then "..." - else - match noun with - | Noun.Atom a -> - if Z.numbits a <= 32 then - Printf.sprintf "Atom(%s/0x%s)" (Z.to_string a) (Z.format "x" a) - else - Printf.sprintf "Atom(%d bits)" (Z.numbits a) - | Noun.Cell (h, t) -> - Printf.sprintf "[%s %s]" - (describe_noun h max_depth (current_depth + 1)) - (describe_noun t max_depth (current_depth + 1)) - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let compare _env = - Printf.printf "Loading solid pill...\n"; - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (_tag, events) -> - let event_list = to_list [] events in - Printf.printf "Found %d events\n\n" (List.length event_list); - - (* Compare Event 3 and Event 4 *) - let event3 = List.nth_opt event_list 3 in - let event4 = List.nth_opt event_list 4 in - - begin match (event3, event4) with - | (Some (Noun.Cell (wire3, card3)), Some (Noun.Cell (wire4, card4))) -> - Printf.printf "═══════════════════════════════════════════\n"; - Printf.printf " EVENT 3 (%%park) - SUCCEEDS\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - - Printf.printf "Wire structure:\n"; - Printf.printf " %s\n\n" (describe_noun wire3 3 0); - - begin match card3 with - | Noun.Cell (term3, data3) -> - Printf.printf "Card term: %s\n" (describe_noun term3 2 0); - begin match term3 with - | Noun.Atom a -> - let bytes = Z.to_bits a in - Printf.printf " ASCII: '%s'\n" bytes - | _ -> () - end; - - Printf.printf "\nCard data structure (depth 4):\n"; - Printf.printf " %s\n\n" (describe_noun data3 4 0); - - (* Try to understand data3 structure *) - begin match data3 with - | Noun.Cell (d3_h, d3_t) -> - Printf.printf "Data breakdown:\n"; - Printf.printf " Head: %s\n" (describe_noun d3_h 3 0); - Printf.printf " Tail: %s\n" (describe_noun d3_t 3 0) - | _ -> () - end - - | _ -> Printf.printf "Card is not [term data]\n" - end; - - Printf.printf "\n═══════════════════════════════════════════\n"; - Printf.printf " EVENT 4 (%%esse) - FAILS\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - - Printf.printf "Wire structure:\n"; - Printf.printf " %s\n\n" (describe_noun wire4 3 0); - - begin match card4 with - | Noun.Cell (term4, data4) -> - Printf.printf "Card term: %s\n" (describe_noun term4 2 0); - begin match term4 with - | Noun.Atom a -> - let bytes = Z.to_bits a in - Printf.printf " ASCII: '%s'\n" bytes - | _ -> () - end; - - Printf.printf "\nCard data structure (depth 4):\n"; - Printf.printf " %s\n\n" (describe_noun data4 4 0); - - (* Try to understand data4 structure *) - begin match data4 with - | Noun.Cell (d4_h, d4_t) -> - Printf.printf "Data breakdown:\n"; - Printf.printf " Head: %s\n" (describe_noun d4_h 3 0); - Printf.printf " Tail: %s\n" (describe_noun d4_t 3 0) - | _ -> () - end - - | _ -> Printf.printf "Card is not [term data]\n" - end; - - Printf.printf "\n═══════════════════════════════════════════\n"; - Printf.printf " COMPARISON\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - - (* Compare wire structures *) - let wire3_is_cell = match wire3 with Noun.Cell _ -> true | _ -> false in - let wire4_is_cell = match wire4 with Noun.Cell _ -> true | _ -> false in - - Printf.printf "Wire types:\n"; - Printf.printf " Event 3: %s\n" (if wire3_is_cell then "Cell (path)" else "Atom"); - Printf.printf " Event 4: %s\n\n" (if wire4_is_cell then "Cell (path)" else "Atom"); - - (* Compare card structures *) - begin match (card3, card4) with - | (Noun.Cell (term3, data3), Noun.Cell (term4, data4)) -> - Printf.printf "Card terms:\n"; - Printf.printf " Event 3: %s\n" (describe_noun term3 1 0); - Printf.printf " Event 4: %s\n\n" (describe_noun term4 1 0); - - (* Compare data types *) - let data3_type = match data3 with Noun.Atom _ -> "Atom" | Noun.Cell _ -> "Cell" in - let data4_type = match data4 with Noun.Atom _ -> "Atom" | Noun.Cell _ -> "Cell" in - - Printf.printf "Data types:\n"; - Printf.printf " Event 3: %s\n" (data3_type); - Printf.printf " Event 4: %s\n\n" (data4_type); - - Printf.printf "KEY DIFFERENCES:\n"; - if data3_type <> data4_type then - Printf.printf " ⚠️ Different data types! (%s vs %s)\n" data3_type data4_type; - - (* Size comparison *) - let rec noun_size noun = - match noun with - | Noun.Atom a -> Z.numbits a - | Noun.Cell (h, t) -> (noun_size h) + (noun_size t) - in - let size3 = noun_size data3 in - let size4 = noun_size data4 in - Printf.printf " Event 3 data size: %d bits\n" size3; - Printf.printf " Event 4 data size: %d bits\n" size4 - - | _ -> () - end - - | _ -> - Printf.printf "Could not extract both events\n" - end - - | Noun.Atom _ -> - Printf.printf "Pill is atom\n" - -let () = - Printf.printf "\n═══════════════════════════════════════════\n"; - Printf.printf " Compare Events 3 and 4\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - Eio_main.run compare diff --git a/ocaml/test/debug_event4_slam.ml b/ocaml/test/debug_event4_slam.ml deleted file mode 100644 index 3aa2150..0000000 --- a/ocaml/test/debug_event4_slam.ml +++ /dev/null @@ -1,155 +0,0 @@ -(* Debug exactly what happens when we slam Event 4 *) - -open Nock_lib - -let slam_on gate event = - Printf.printf " Building slam...\n"; - let battery = Noun.head gate in - Printf.printf " Battery: %s\n" (match battery with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - - let payload = Noun.tail gate in - Printf.printf " Payload: %s\n" (match payload with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - - let context = Noun.tail payload in - Printf.printf " Context (slot 7): %s\n" (match context with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - - let new_core = Noun.cell battery (Noun.cell event context) in - Printf.printf " New core: built\n"; - - let kick_formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - Printf.printf " Kick formula: [9 2 0 1]\n"; - - Printf.printf " Executing Nock...\n%!"; - Nock.nock_on new_core kick_formula - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let debug _env = - Printf.printf "Loading solid pill...\n"; - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (_tag, events) -> - let event_list = to_list [] events in - - (* Get Event 1 (initial kernel) *) - let kernel1 = List.nth event_list 1 in - - (* Slam Event 3 to get kernel after Event 3 *) - let event3 = List.nth event_list 3 in - - Printf.printf "\n=== SLAMMING EVENT 3 ===\n\n"; - let poke_gate3 = Noun.slot (Z.of_int 23) kernel1 in - let now3 = Noun.atom 0 in - let poke_arg3 = Noun.cell now3 event3 in - - let result3 = slam_on poke_gate3 poke_arg3 in - - let kernel_after_3 = match result3 with - | Noun.Cell (_effects, new_kernel) -> - Printf.printf "✓ Event 3 succeeded\n\n"; - new_kernel - | Noun.Atom _ -> - Printf.printf "✗ Event 3 returned atom\n"; - kernel1 - in - - (* Now try Event 4 *) - let event4 = List.nth event_list 4 in - - Printf.printf "=== SLAMMING EVENT 4 ===\n\n"; - - Printf.printf "Event 4 structure:\n"; - begin match event4 with - | Noun.Cell (wire, card) -> - Printf.printf " [wire card]\n"; - Printf.printf " Wire: %s\n" (match wire with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - begin match card with - | Noun.Cell (term, data) -> - Printf.printf " Card: [term data]\n"; - Printf.printf " Term: %s\n" (match term with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - Printf.printf " Data: %s\n\n" (match data with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - | _ -> () - end - | _ -> Printf.printf " Not [wire card]\n\n" - end; - - Printf.printf "Kernel after Event 3:\n"; - begin try - let _poke23 = Noun.slot (Z.of_int 23) kernel_after_3 in - Printf.printf " ✓ Has slot 23\n" - with _ -> - Printf.printf " ✗ No slot 23\n" - end; - - begin try - let _poke42 = Noun.slot (Z.of_int 42) kernel_after_3 in - Printf.printf " ✓ Has slot 42\n\n" - with _ -> - Printf.printf " ✗ No slot 42\n\n" - end; - - Printf.printf "Attempting Event 4 slam...\n"; - begin try - let poke_gate4 = Noun.slot (Z.of_int 23) kernel_after_3 in - Printf.printf " ✓ Found poke gate at slot 23\n"; - - let now4 = Noun.atom 0 in - let poke_arg4 = Noun.cell now4 event4 in - Printf.printf " Poke arg: [now ovum]\n\n"; - - let result4 = slam_on poke_gate4 poke_arg4 in - - begin match result4 with - | Noun.Cell (_effects, _new_kernel) -> - Printf.printf "\n🎉 EVENT 4 SUCCEEDED!\n" - | Noun.Atom _ -> - Printf.printf "\nResult is atom\n" - end - - with - | Noun.Exit -> - Printf.printf "\n✗ Nock Exit - examining gate structure...\n\n"; - - (* Try to understand why it failed *) - begin try - let poke_gate4 = Noun.slot (Z.of_int 23) kernel_after_3 in - Printf.printf "Poke gate structure:\n"; - begin match poke_gate4 with - | Noun.Cell (battery, payload) -> - Printf.printf " Battery: %s\n" (match battery with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - begin match payload with - | Noun.Cell (sample, context) -> - Printf.printf " Payload: [sample context]\n"; - Printf.printf " Sample: %s\n" (match sample with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - Printf.printf " Context: %s\n" (match context with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell") - | _ -> - Printf.printf " Payload: %s (not [sample context])\n" - (match payload with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell") - end - | Noun.Atom _ -> - Printf.printf " Poke gate is an atom!\n" - end - with e -> - Printf.printf "Error examining gate: %s\n" (Printexc.to_string e) - end - - | e -> - Printf.printf "\n✗ Error: %s\n" (Printexc.to_string e) - end - - | Noun.Atom _ -> - Printf.printf "Pill is atom\n" - -let () = - Printf.printf "\n═══════════════════════════════════════════\n"; - Printf.printf " Debug Event 4 Slam\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - Eio_main.run debug diff --git a/ocaml/test/dune b/ocaml/test/dune index 3f23caa..8087a38 100644 --- a/ocaml/test/dune +++ b/ocaml/test/dune @@ -1,288 +1,288 @@ -(test - (name test_nock) - (modules test_nock) - (libraries nock_lib zarith)) - -(test - (name test_serial) - (modules test_serial) - (libraries nock_lib zarith)) - -(test - (name test_jam_debug) - (modules test_jam_debug) - (libraries nock_lib zarith)) - -(test - (name bench_nock) - (modules bench_nock) - (libraries nock_lib zarith unix)) - -(test - (name bench_serial) - (modules bench_serial) - (libraries nock_lib zarith unix)) - -(executable - (name bench_cue_pill) - (modules bench_cue_pill) - (libraries nock_lib unix)) - -(executable - (name test_roundtrip) - (modules test_roundtrip) - (libraries nock_lib zarith)) - -(executable - (name test_bench_one) - (modules test_bench_one) - (libraries nock_lib zarith)) - -(executable - (name jam_compare) - (modules jam_compare) - (libraries nock_lib zarith)) - -(executable - (name test_hex) - (libraries nock_lib)) - -(executable - (name test_eventlog) - (modules test_eventlog) - (libraries nock_lib eio_main)) - -(executable - (name test_state) - (modules test_state) - (libraries nock_lib eio_main unix)) - -(executable - (name test_multicore) - (modules test_multicore) - (libraries nock_lib eio_main unix)) - -(executable - (name test_runtime) - (modules test_runtime) - (libraries nock_lib io_drivers eio_main unix)) - -(executable - (name test_parallel_nock) - (modules test_parallel_nock) - (libraries nock_lib eio_main unix domainslib)) - -(executable - (name test_ames) - (modules test_ames) - (libraries nock_lib io_drivers eio_main unix)) - -(executable - (name test_http) - (modules test_http) - (libraries nock_lib io_drivers eio_main unix)) - -(executable - (name test_clay) - (modules test_clay) - (libraries nock_lib io_drivers eio_main unix)) - -(executable - (name test_dill_iris) - (modules test_dill_iris) - (libraries nock_lib io_drivers eio_main unix)) - -(executable - (name test_arvo) - (modules test_arvo) - (libraries nock_lib eio_main unix)) - -(executable - (name test_arvo_structure) - (modules test_arvo_structure) - (libraries nock_lib eio_main unix)) - -(executable - (name test_poke_formulas) - (modules test_poke_formulas) - (libraries nock_lib eio_main unix)) - -(executable - (name test_arms) - (modules test_arms) - (libraries nock_lib eio_main unix)) - -(executable - (name test_pill_depth) - (modules test_pill_depth) - (libraries nock_lib eio_main unix)) - -(executable - (name test_real_arvo) - (modules test_real_arvo) - (libraries nock_lib eio_main unix)) - -(executable - (name test_cvere_poke) - (modules test_cvere_poke) - (libraries nock_lib eio_main unix)) - -(executable - (name test_arvo_real_poke) - (modules test_arvo_real_poke) - (libraries nock_lib eio_main unix)) - -(executable - (name test_solid_structure) - (modules test_solid_structure) - (libraries nock_lib eio_main unix)) - -(executable - (name test_boot_solid_events) - (modules test_boot_solid_events) - (libraries nock_lib eio_main unix)) - -(executable - (name test_poke_solid_arvo) - (modules test_poke_solid_arvo) - (libraries nock_lib eio_main unix)) - -(executable - (name test_brass_cue) - (modules test_brass_cue) - (libraries nock_lib eio_main unix)) - -(executable - (name test_arvo_poke_correct) - (modules test_arvo_poke_correct) - (libraries nock_lib eio_main unix)) - -(executable - (name test_arvo_slots) - (modules test_arvo_slots) - (libraries nock_lib eio_main unix)) - -(executable - (name test_ivory_boot) - (modules test_ivory_boot) - (libraries nock_lib eio_main unix)) - -(executable - (name test_ivory_structure) - (modules test_ivory_structure) - (libraries nock_lib eio_main unix)) - -(executable - (name test_solid_boot) - (modules test_solid_boot) - (libraries nock_lib eio_main unix)) - -(executable - (name cache_solid) - (modules cache_solid) - (libraries nock_lib eio_main unix)) - -(executable - (name test_boot_arvo_properly) - (modules test_boot_arvo_properly) - (libraries nock_lib eio_main unix)) - -(executable - (name inspect_boot_events) - (modules inspect_boot_events) - (libraries nock_lib eio_main unix)) - -(executable - (name inspect_events_simple) - (modules inspect_events_simple) - (libraries nock_lib eio_main unix)) - -(executable - (name test_solid_cvere_pattern) - (modules test_solid_cvere_pattern) - (libraries nock_lib eio_main unix)) - -(executable - (name explore_kernel_structure) - (modules explore_kernel_structure) - (libraries nock_lib eio_main unix)) - -(executable - (name test_slam_directly) - (modules test_slam_directly) - (libraries nock_lib eio_main unix)) - -(executable - (name test_boot_with_slam) - (modules test_boot_with_slam) - (libraries nock_lib eio_main unix)) - -(executable - (name inspect_event4_detail) - (modules inspect_event4_detail) - (libraries nock_lib eio_main unix)) - -(executable - (name compare_events_3_4) - (modules compare_events_3_4) - (libraries nock_lib eio_main unix)) - -(executable - (name examine_event3_effects) - (modules examine_event3_effects) - (libraries nock_lib eio_main unix)) - -(executable - (name test_functional_bios) - (modules test_functional_bios) - (libraries nock_lib eio_main unix)) - -(executable - (name debug_event4_slam) - (modules debug_event4_slam) - (libraries nock_lib eio_main unix)) - -(executable - (name test_event4_slot42) - (modules test_event4_slot42) - (libraries nock_lib eio_main unix)) - -(executable - (name test_correct_boot) - (modules test_correct_boot) - (libraries nock_lib eio_main unix)) - -(executable - (name parse_solid_pill) - (modules parse_solid_pill) - (libraries nock_lib eio_main unix)) - -(executable - (name examine_pill_events) - (modules examine_pill_events) - (libraries nock_lib eio_main unix)) - -(executable - (name test_life_on_bot) - (modules test_life_on_bot) - (libraries nock_lib eio_main unix)) +; (test +; (name test_nock) +; (modules test_nock) +; (libraries nock_lib zarith)) + +; (test +; (name test_serial) +; (modules test_serial) +; (libraries nock_lib zarith)) + +; (test +; (name test_jam_debug) +; (modules test_jam_debug) +; (libraries nock_lib zarith)) + +; (test +; (name bench_nock) +; (modules bench_nock) +; (libraries nock_lib zarith unix)) + +; (test +; (name bench_serial) +; (modules bench_serial) +; (libraries nock_lib zarith unix)) + +; (executable +; (name bench_cue_pill) +; (modules bench_cue_pill) +; (libraries nock_lib unix)) + +; (executable +; (name test_roundtrip) +; (modules test_roundtrip) +; (libraries nock_lib zarith)) + +; (executable +; (name test_bench_one) +; (modules test_bench_one) +; (libraries nock_lib zarith)) + +; (executable +; (name jam_compare) +; (modules jam_compare) +; (libraries nock_lib zarith)) + +; (executable +; (name test_hex) +; (libraries nock_lib)) + +; (executable +; (name test_eventlog) +; (modules test_eventlog) +; (libraries nock_lib eio_main)) + +; (executable +; (name test_state) +; (modules test_state) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_multicore) +; (modules test_multicore) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_runtime) +; (modules test_runtime) +; (libraries nock_lib io_drivers eio_main unix)) + +; (executable +; (name test_parallel_nock) +; (modules test_parallel_nock) +; (libraries nock_lib eio_main unix domainslib)) + +; (executable +; (name test_ames) +; (modules test_ames) +; (libraries nock_lib io_drivers eio_main unix)) + +; (executable +; (name test_http) +; (modules test_http) +; (libraries nock_lib io_drivers eio_main unix)) + +; (executable +; (name test_clay) +; (modules test_clay) +; (libraries nock_lib io_drivers eio_main unix)) + +; (executable +; (name test_dill_iris) +; (modules test_dill_iris) +; (libraries nock_lib io_drivers eio_main unix)) + +; (executable +; (name test_arvo) +; (modules test_arvo) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_arvo_structure) +; (modules test_arvo_structure) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_poke_formulas) +; (modules test_poke_formulas) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_arms) +; (modules test_arms) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_pill_depth) +; (modules test_pill_depth) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_real_arvo) +; (modules test_real_arvo) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_cvere_poke) +; (modules test_cvere_poke) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_arvo_real_poke) +; (modules test_arvo_real_poke) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_solid_structure) +; (modules test_solid_structure) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_boot_solid_events) +; (modules test_boot_solid_events) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_poke_solid_arvo) +; (modules test_poke_solid_arvo) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_brass_cue) +; (modules test_brass_cue) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_arvo_poke_correct) +; (modules test_arvo_poke_correct) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_arvo_slots) +; (modules test_arvo_slots) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_ivory_boot) +; (modules test_ivory_boot) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_ivory_structure) +; (modules test_ivory_structure) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_solid_boot) +; (modules test_solid_boot) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name cache_solid) +; (modules cache_solid) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_boot_arvo_properly) +; (modules test_boot_arvo_properly) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name inspect_boot_events) +; (modules inspect_boot_events) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name inspect_events_simple) +; (modules inspect_events_simple) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_solid_cvere_pattern) +; (modules test_solid_cvere_pattern) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name explore_kernel_structure) +; (modules explore_kernel_structure) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_slam_directly) +; (modules test_slam_directly) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_boot_with_slam) +; (modules test_boot_with_slam) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name inspect_event4_detail) +; (modules inspect_event4_detail) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name compare_events_3_4) +; (modules compare_events_3_4) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name examine_event3_effects) +; (modules examine_event3_effects) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_functional_bios) +; (modules test_functional_bios) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name debug_event4_slam) +; (modules debug_event4_slam) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_event4_slot42) +; (modules test_event4_slot42) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_correct_boot) +; (modules test_correct_boot) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name parse_solid_pill) +; (modules parse_solid_pill) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name examine_pill_events) +; (modules examine_pill_events) +; (libraries nock_lib eio_main unix)) + +; (executable +; (name test_life_on_bot) +; (modules test_life_on_bot) +; (libraries nock_lib eio_main unix)) (executable (name test_two_stage_boot) (modules test_two_stage_boot) (libraries nock_lib eio_main unix)) -(executable - (name test_life_formula) - (modules test_life_formula) - (libraries nock_lib)) +; (executable +; (name test_life_formula) +; (modules test_life_formula) +; (libraries nock_lib)) -(executable - (name examine_ivory) - (modules examine_ivory) - (libraries nock_lib eio_main)) +; (executable +; (name examine_ivory) +; (modules examine_ivory) +; (libraries nock_lib eio_main)) -(executable - (name test_two_phase_boot) - (modules test_two_phase_boot) - (libraries nock_lib eio_main)) +; (executable +; (name test_two_phase_boot) +; (modules test_two_phase_boot) +; (libraries nock_lib eio_main)) diff --git a/ocaml/test/examine_event3_effects.ml b/ocaml/test/examine_event3_effects.ml deleted file mode 100644 index de2fec3..0000000 --- a/ocaml/test/examine_event3_effects.ml +++ /dev/null @@ -1,148 +0,0 @@ -(* Examine what effects Event 3 produces *) - -open Nock_lib - -let slam_on gate event = - let battery = Noun.head gate in - let context = Noun.tail (Noun.tail gate) in - let new_core = Noun.cell battery (Noun.cell event context) in - let kick_formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - Nock.nock_on new_core kick_formula - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let rec count_list noun = - match noun with - | Noun.Atom _ -> 0 - | Noun.Cell (_, rest) -> 1 + (count_list rest) - -let describe_noun noun max_depth current_depth = - let rec aux n d = - if d > max_depth then "..." - else - match n with - | Noun.Atom a -> - if Z.numbits a <= 32 then - Printf.sprintf "Atom(%s/0x%s)" (Z.to_string a) (Z.format "x" a) - else - Printf.sprintf "Atom(%d bits)" (Z.numbits a) - | Noun.Cell (h, t) -> - Printf.sprintf "[%s %s]" (aux h (d + 1)) (aux t (d + 1)) - in - aux noun current_depth - -let examine _env = - Printf.printf "Loading solid pill...\n"; - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (_tag, events) -> - let event_list = to_list [] events in - - (* Get Event 1 (kernel) *) - begin match List.nth_opt event_list 1 with - | Some kernel -> - (* Get Event 3 *) - begin match List.nth_opt event_list 3 with - | Some event3 -> - Printf.printf "\n═══════════════════════════════════════════\n"; - Printf.printf " Event 3 (%%park) Effects Analysis\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - - (* Poke Event 3 *) - let poke_gate = Noun.slot (Z.of_int 23) kernel in - let now = Noun.atom 0 in - let poke_arg = Noun.cell now event3 in - - Printf.printf "Slamming Event 3...\n"; - let result = slam_on poke_gate poke_arg in - - begin match result with - | Noun.Cell (effects, new_kernel) -> - Printf.printf "✓ Slam succeeded!\n\n"; - - (* Analyze effects *) - Printf.printf "Effects analysis:\n"; - let effect_count = count_list effects in - Printf.printf " Total effects: %d\n\n" effect_count; - - if effect_count = 0 then - Printf.printf " (No effects - effects is atom/nil)\n\n" - else begin - Printf.printf " Effect list:\n"; - let effects_list = to_list [] effects in - List.iteri (fun i eff -> - Printf.printf " Effect %d: %s\n" i - (describe_noun eff 2 0) - ) effects_list; - Printf.printf "\n" - end; - - (* Analyze new kernel *) - Printf.printf "New kernel analysis:\n"; - - (* Check if it still has slot 23 *) - begin try - let _poke23 = Noun.slot (Z.of_int 23) new_kernel in - Printf.printf " ✓ Has slot 23 (larval poke)\n" - with _ -> - Printf.printf " ✗ No slot 23\n" - end; - - (* Check if it NOW has slot 42 *) - begin try - let _poke42 = Noun.slot (Z.of_int 42) new_kernel in - Printf.printf " ✓ Has slot 42 (adult poke?)\n" - with _ -> - Printf.printf " ✗ No slot 42\n" - end; - - (* Check if kernel changed *) - let kernel_is_same = kernel == new_kernel in - Printf.printf " Kernel changed: %s\n" - (if kernel_is_same then "No (same object)" else "Yes (new object)"); - - (* Try to see if there's a metamorphosis indicator *) - Printf.printf "\nLooking for metamorphosis indicators...\n"; - - (* Check a few specific slots that might indicate state *) - let check_slot kernel slot_num name = - try - let _val = Noun.slot (Z.of_int slot_num) kernel in - Printf.printf " %s (slot %d): exists\n" name slot_num - with _ -> - Printf.printf " %s (slot %d): missing\n" name slot_num - in - - check_slot kernel 2 "Original head"; - check_slot kernel 3 "Original tail"; - check_slot new_kernel 2 "New head"; - check_slot new_kernel 3 "New tail"; - - | Noun.Atom _ -> - Printf.printf "✗ Result is atom (unexpected)\n" - end - - | None -> - Printf.printf "No Event 3\n" - end - - | None -> - Printf.printf "No Event 1\n" - end - - | Noun.Atom _ -> - Printf.printf "Pill is atom\n" - -let () = - Printf.printf "\n═══════════════════════════════════════════\n"; - Printf.printf " Examine Event 3 Effects\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - Eio_main.run examine diff --git a/ocaml/test/examine_ivory.ml b/ocaml/test/examine_ivory.ml deleted file mode 100644 index 490f735..0000000 --- a/ocaml/test/examine_ivory.ml +++ /dev/null @@ -1,86 +0,0 @@ -(* Examine ivory.pill structure *) - -open Nock_lib - -let main env = - Printf.printf "\n═══════════════════════════════════════\n"; - Printf.printf " Examining ivory.pill Structure\n"; - Printf.printf "═══════════════════════════════════════\n\n"; - - (* Load ivory pill *) - Printf.printf "[1] Loading ivory.pill...\\n%!"; - let fs = Eio.Stdenv.fs env in - let pill_bytes = Eio.Path.(load (fs / "ivory.pill")) |> Bytes.of_string in - Printf.printf " Size: %d bytes\n%!" (Bytes.length pill_bytes); - - (* Cue it *) - Printf.printf "[2] Cuing ivory pill...\n%!"; - let pill = Serial.cue pill_bytes in - Printf.printf " ✓ Cued\n\n"; - - (* Check structure *) - Printf.printf "[3] Structure analysis:\n"; - match pill with - | Noun.Cell (tag, tail) -> - (* Print tag *) - let tag_str = match tag with - | Noun.Atom z -> - let bytes = Z.to_bits z in - if String.length bytes <= 10 then bytes else Printf.sprintf "" (Z.numbits z) - | Noun.Cell _ -> "" - in - Printf.printf " Tag: %s\n" tag_str; - - (* Analyze tail *) - Printf.printf " Tail type: %s\n" (if Noun.is_cell tail then "CELL" else "ATOM"); - - (match tail with - | Noun.Atom z when Z.equal z Z.zero -> - Printf.printf " Tail value: 0 (NULL!)\n"; - Printf.printf "\n"; - Printf.printf " ✓ CONFIRMED: Embedded ivory has structure [\"ivory\" 0]\n"; - Printf.printf " This means u3v_life() is called with atom 0!\n" - - | Noun.Atom z -> - Printf.printf " Tail value: atom with %d bits\n" (Z.numbits z); - Printf.printf " Tail decimal: %s\n" (Z.to_string z) - - | Noun.Cell (h, t) -> - Printf.printf " Tail is a CELL\n"; - Printf.printf " Head type: %s\n" (if Noun.is_cell h then "cell" else "atom"); - Printf.printf " Tail type: %s\n" (if Noun.is_cell t then "cell" else "atom"); - - (* Check if it's the Arvo core structure *) - Printf.printf "\n Checking if tail is Arvo core...\n"; - begin try - let _slot2 = Noun.slot (Z.of_int 2) tail in - let _slot3 = Noun.slot (Z.of_int 3) tail in - Printf.printf " ✓ Has slot 2 and 3 (it's a cell with head and tail)\n"; - - (* Check for lifecycle formula at slot 2 *) - begin try - let slot2 = Noun.slot (Z.of_int 2) tail in - Printf.printf " Slot 2 type: %s\n" (if Noun.is_cell slot2 then "cell" else "atom"); - - (* The lifecycle formula should be [2 [0 3] [0 2]] *) - match slot2 with - | Noun.Cell (Noun.Atom op, _rest) when Z.equal op (Z.of_int 2) -> - Printf.printf " Slot 2 starts with opcode 2 - could be lifecycle formula!\n"; - Printf.printf "\n ✓ Tail appears to BE the Arvo core itself!\n"; - Printf.printf " This means the lifecycle formula operates on the CORE, not null!\n" - | Noun.Cell (Noun.Atom op, _rest) -> - Printf.printf " Slot 2 starts with opcode: %s\n" (Z.to_string op) - | _ -> - Printf.printf " Slot 2 doesn't match expected lifecycle formula pattern\n" - with _ -> - Printf.printf " Could not analyze slot 2\n" - end - with Noun.Exit -> - Printf.printf " ✗ Cannot access slots 2/3 - not a valid cell structure\n" - end - ) - - | Noun.Atom _ -> - Printf.printf " ✗ Pill is an atom (unexpected)\n" - -let () = Eio_main.run main diff --git a/ocaml/test/examine_pill_events.ml b/ocaml/test/examine_pill_events.ml deleted file mode 100644 index 8a11117..0000000 --- a/ocaml/test/examine_pill_events.ml +++ /dev/null @@ -1,88 +0,0 @@ -(* Examine what the bot/mod/use events actually contain *) - -open Nock_lib - -let describe_noun noun = - match noun with - | Noun.Atom a -> - if Z.numbits a <= 64 then - Printf.sprintf "Atom(%s)" (Z.to_string a) - else - Printf.sprintf "Atom(%d bits)" (Z.numbits a) - | Noun.Cell _ -> "Cell" - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let examine _env = - Printf.printf "Loading solid.noun...\n"; - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (_tag, events) -> - Printf.printf "\n=== solid.noun structure ===\n\n"; - - let event_list = to_list [] events in - Printf.printf "Total: %d items in list\n\n" (List.length event_list); - - List.iteri (fun i event -> - Printf.printf "Item %d: %s\n" i (describe_noun event) - ) event_list; - - (* Check if this matches what u3v_life expects *) - Printf.printf "\n=== Testing u3v_life on this list ===\n\n"; - - (* Functional BIOS formula: [2 [0 3] [0 2]] *) - let lyf = Noun.cell (Noun.atom 2) - (Noun.cell - (Noun.cell (Noun.atom 0) (Noun.atom 3)) - (Noun.cell (Noun.atom 0) (Noun.atom 2))) in - - Printf.printf "Running [2 [0 3] [0 2]] on events...\n%!"; - - begin try - (* What does [0 2] get from events? *) - let slot2 = Noun.slot (Z.of_int 2) events in - Printf.printf " Slot 2 of events: %s\n" (describe_noun slot2); - - (* What does [0 3] get from events? *) - let slot3 = Noun.slot (Z.of_int 3) events in - Printf.printf " Slot 3 of events: %s\n\n" (describe_noun slot3); - - let start = Unix.gettimeofday () in - let gat = Nock.nock_on events lyf in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf "✓ Formula succeeded in %.4fs!\n\n" elapsed; - - (* Extract slot 7 *) - let kernel = Noun.slot (Z.of_int 7) gat in - Printf.printf "✓ Extracted kernel from slot 7\n\n"; - - (* Check if kernel has slot 23 *) - begin try - let _poke = Noun.slot (Z.of_int 23) kernel in - Printf.printf "✓ Kernel has poke at slot 23\n"; - Printf.printf "\n🎉 This is the correct event list format!\n" - with _ -> - Printf.printf "✗ No slot 23\n" - end - - with - | Not_found -> - Printf.printf "✗ Slot not found\n" - | Noun.Exit -> - Printf.printf "✗ Nock Exit\n" - | e -> - Printf.printf "✗ Error: %s\n" (Printexc.to_string e) - end - - | Noun.Atom _ -> - Printf.printf "Pill is atom\n" - -let () = - Eio_main.run examine diff --git a/ocaml/test/explore_kernel_structure.ml b/ocaml/test/explore_kernel_structure.ml deleted file mode 100644 index 513d47f..0000000 --- a/ocaml/test/explore_kernel_structure.ml +++ /dev/null @@ -1,108 +0,0 @@ -(* Explore the structure of Event 1 kernel *) - -open Nock_lib - -let check_slot noun slot = - try - let _val = Noun.slot (Z.of_int slot) noun in - "✓" - with _ -> "✗" - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let explore _env = - Printf.printf "Exploring Event 1 kernel structure...\n\n"; - - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (_tag, events) -> - let event_list = to_list [] events in - - begin match List.nth_opt event_list 1 with - | Some kernel -> - Printf.printf "Event 1 (kernel) slot map:\n"; - Printf.printf " Slot 2 (head): %s\n" (check_slot kernel 2); - Printf.printf " Slot 3 (tail): %s\n" (check_slot kernel 3); - Printf.printf " Slot 4: %s\n" (check_slot kernel 4); - Printf.printf " Slot 5: %s\n" (check_slot kernel 5); - Printf.printf " Slot 6: %s\n" (check_slot kernel 6); - Printf.printf " Slot 7: %s\n" (check_slot kernel 7); - Printf.printf " Slot 20: %s\n" (check_slot kernel 20); - Printf.printf " Slot 23: %s\n" (check_slot kernel 23); - Printf.printf " Slot 42: %s\n" (check_slot kernel 42); - Printf.printf " Slot 87: %s\n" (check_slot kernel 87); - Printf.printf "\n"; - - (* Check if slots 23 and 42 are gates or formulas *) - Printf.printf "Checking slot 23:\n"; - begin try - let slot_23 = Noun.slot (Z.of_int 23) kernel in - match slot_23 with - | Noun.Atom a -> - Printf.printf " Atom: %s\n" (Z.to_string a) - | Noun.Cell (h, t) -> - Printf.printf " Cell (likely a formula or gate)\n"; - Printf.printf " Head: %s\n" (match h with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - Printf.printf " Tail: %s\n" (match t with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - - (* Check if it looks like a gate [battery payload] *) - (* Gate structure: [[formula] [sample context]] *) - begin try - let battery = Noun.head slot_23 in - let payload = Noun.tail slot_23 in - let sample = Noun.head payload in - let _context = Noun.tail payload in - Printf.printf " → Looks like a GATE (has battery/payload/sample/context)\n"; - Printf.printf " Battery: %s\n" (match battery with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - Printf.printf " Sample: %s\n" (match sample with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell") - with _ -> - Printf.printf " → Looks like a FORMULA (not gate structure)\n" - end - with _ -> - Printf.printf " ✗ Error accessing slot 23\n" - end; - - Printf.printf "\nChecking slot 42:\n"; - begin try - let slot_42 = Noun.slot (Z.of_int 42) kernel in - match slot_42 with - | Noun.Atom a -> - Printf.printf " Atom: %s\n" (Z.to_string a) - | Noun.Cell (h, t) -> - Printf.printf " Cell\n"; - Printf.printf " Head: %s\n" (match h with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - Printf.printf " Tail: %s\n" (match t with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - - begin try - let battery = Noun.head slot_42 in - let payload = Noun.tail slot_42 in - let sample = Noun.head payload in - let _context = Noun.tail payload in - Printf.printf " → Looks like a GATE\n"; - Printf.printf " Battery: %s\n" (match battery with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - Printf.printf " Sample: %s\n" (match sample with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell") - with _ -> - Printf.printf " → Looks like a FORMULA\n" - end - with _ -> - Printf.printf " ✗ Error accessing slot 42\n" - end - - | None -> - Printf.printf "No event 1\n" - end - - | Noun.Atom _ -> - Printf.printf "Pill is atom\n" - -let () = - Printf.printf "\n═══════════════════════════════════════════\n"; - Printf.printf " Explore Kernel Structure\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - Eio_main.run explore diff --git a/ocaml/test/inspect_boot_events.ml b/ocaml/test/inspect_boot_events.ml deleted file mode 100644 index 0a7ba92..0000000 --- a/ocaml/test/inspect_boot_events.ml +++ /dev/null @@ -1,48 +0,0 @@ -(* Inspect the structure of boot events *) - -open Nock_lib - -let rec inspect_noun prefix noun depth = - let indent = String.make (depth * 2) ' ' in - match noun with - | Noun.Atom a -> - if Z.numbits a <= 32 then - Printf.printf "%s%sAtom: %s (0x%s)\n" indent prefix - (Z.to_string a) (Z.format "x" a) - else - Printf.printf "%s%sAtom: large (%d bits)\n" indent prefix (Z.numbits a) - | Noun.Cell (h, t) -> - Printf.printf "%s%sCell:\n" indent prefix; - inspect_noun "head: " h (depth + 1); - inspect_noun "tail: " t (depth + 1) - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let inspect_events _env = - Printf.printf "Loading solid pill...\n"; - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (_tag, events) -> - let event_list = to_list [] events in - Printf.printf "Found %d events\n\n" (List.length event_list); - - List.iteri (fun i event -> - Printf.printf "═════ EVENT %d ═════\n" i; - inspect_noun "" event 0; - Printf.printf "\n" - ) event_list - - | Noun.Atom _ -> - Printf.printf "✗ Pill is an atom\n" - -let () = - Printf.printf "\n═══════════════════════════════════════════\n"; - Printf.printf " Inspect Boot Events Structure\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - Eio_main.run inspect_events diff --git a/ocaml/test/inspect_event4_detail.ml b/ocaml/test/inspect_event4_detail.ml deleted file mode 100644 index 4f4f30a..0000000 --- a/ocaml/test/inspect_event4_detail.ml +++ /dev/null @@ -1,132 +0,0 @@ -(* Inspect Event 4 in detail *) - -open Nock_lib - -let to_atom_if_small noun = - match noun with - | Noun.Atom a -> - if Z.numbits a <= 32 then - Printf.sprintf "Atom(%s / 0x%s)" (Z.to_string a) (Z.format "x" a) - else - Printf.sprintf "Atom(large, %d bits)" (Z.numbits a) - | Noun.Cell _ -> "Cell" - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let inspect _env = - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (_tag, events) -> - let event_list = to_list [] events in - - (* Event 3 *) - Printf.printf "=== EVENT 3 ===\n\n"; - begin match List.nth_opt event_list 3 with - | Some (Noun.Cell (wire, card)) -> - Printf.printf "Event 3: [wire card]\n\n"; - - Printf.printf "Wire:\n"; - Printf.printf " %s\n" (to_atom_if_small wire); - - (* If wire is a cell (path), show first few elements *) - begin match wire with - | Noun.Cell (w1, rest1) -> - Printf.printf " Head: %s\n" (to_atom_if_small w1); - begin match rest1 with - | Noun.Cell (w2, rest2) -> - Printf.printf " [1]: %s\n" (to_atom_if_small w2); - begin match rest2 with - | Noun.Cell (w3, _) -> - Printf.printf " [2]: %s\n" (to_atom_if_small w3) - | Noun.Atom a -> - Printf.printf " Tail: Atom(%s)\n" (Z.to_string a) - end - | Noun.Atom a -> - Printf.printf " Tail: Atom(%s)\n" (Z.to_string a) - end - | Noun.Atom _ -> () - end; - - Printf.printf "\nCard:\n"; - begin match card with - | Noun.Cell (term, data) -> - Printf.printf " [term data]\n"; - Printf.printf " Term: %s\n" (to_atom_if_small term); - (* Try to convert term to ASCII *) - begin match term with - | Noun.Atom a when Z.numbits a <= 32 -> - let bytes = Z.to_bits a in - Printf.printf " Term ASCII: '%s'\n" bytes - | _ -> () - end; - Printf.printf " Data: %s\n" (to_atom_if_small data) - | Noun.Atom a -> - Printf.printf " Atom: %s\n" (Z.to_string a) - end - - | _ -> Printf.printf "Event 3 not found or wrong format\n" - end; - - Printf.printf "\n═══════════════════════════════════════\n\n"; - - (* Event 4 *) - Printf.printf "=== EVENT 4 ===\n\n"; - begin match List.nth_opt event_list 4 with - | Some (Noun.Cell (wire, card)) -> - Printf.printf "Event 4: [wire card]\n\n"; - - Printf.printf "Wire:\n"; - Printf.printf " %s\n" (to_atom_if_small wire); - - begin match wire with - | Noun.Cell (w1, rest1) -> - Printf.printf " Head: %s\n" (to_atom_if_small w1); - begin match rest1 with - | Noun.Cell (w2, rest2) -> - Printf.printf " [1]: %s\n" (to_atom_if_small w2); - begin match rest2 with - | Noun.Cell (w3, _) -> - Printf.printf " [2]: %s\n" (to_atom_if_small w3) - | Noun.Atom a -> - Printf.printf " Tail: Atom(%s)\n" (Z.to_string a) - end - | Noun.Atom a -> - Printf.printf " Tail: Atom(%s)\n" (Z.to_string a) - end - | Noun.Atom _ -> () - end; - - Printf.printf "\nCard:\n"; - begin match card with - | Noun.Cell (term, data) -> - Printf.printf " [term data]\n"; - Printf.printf " Term: %s\n" (to_atom_if_small term); - (* Try to convert term to ASCII *) - begin match term with - | Noun.Atom a when Z.numbits a <= 32 -> - let bytes = Z.to_bits a in - Printf.printf " Term ASCII: '%s'\n" bytes - | _ -> () - end; - Printf.printf " Data: %s\n" (to_atom_if_small data) - | Noun.Atom a -> - Printf.printf " Atom: %s\n" (Z.to_string a) - end - - | _ -> Printf.printf "Event 4 not found or wrong format\n" - end - - | Noun.Atom _ -> - Printf.printf "Pill is atom\n" - -let () = - Printf.printf "\n═══════════════════════════════════════\n"; - Printf.printf " Inspect Events 3 and 4 in Detail\n"; - Printf.printf "═══════════════════════════════════════\n\n"; - Eio_main.run inspect diff --git a/ocaml/test/inspect_events_simple.ml b/ocaml/test/inspect_events_simple.ml deleted file mode 100644 index 0cb05c9..0000000 --- a/ocaml/test/inspect_events_simple.ml +++ /dev/null @@ -1,88 +0,0 @@ -(* Simple event structure inspector *) - -open Nock_lib - -let describe_noun noun = - match noun with - | Noun.Atom a -> - if Z.numbits a <= 32 then - Printf.sprintf "Atom(%s)" (Z.to_string a) - else - Printf.sprintf "Atom(large, %d bits)" (Z.numbits a) - | Noun.Cell _ -> "Cell" - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let inspect_events _env = - Printf.printf "Loading solid pill...\n"; - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (tag, events) -> - Printf.printf "Tag: %s\n\n" (describe_noun tag); - - let event_list = to_list [] events in - Printf.printf "Found %d events\n\n" (List.length event_list); - - List.iteri (fun i event -> - Printf.printf "Event %d: " i; - match event with - | Noun.Atom a -> - Printf.printf "Atom(%s)\n" (Z.to_string a) - | Noun.Cell (head, tail) -> - Printf.printf "Cell[%s, %s]\n" - (describe_noun head) (describe_noun tail) - ) event_list; - - (* Look more closely at events 3 and 4 *) - Printf.printf "\n=== Detailed look at events 3 and 4 ===\n\n"; - - begin match List.nth_opt event_list 3 with - | Some (Noun.Cell (wire, card)) -> - Printf.printf "Event 3:\n"; - Printf.printf " wire: %s\n" (describe_noun wire); - Printf.printf " card: "; - begin match card with - | Noun.Cell (term, data) -> - Printf.printf "Cell[%s, %s]\n" - (describe_noun term) (describe_noun data) - | Noun.Atom _ -> - Printf.printf "%s\n" (describe_noun card) - end - | Some (Noun.Atom _) -> - Printf.printf "Event 3 is an atom\n" - | None -> - Printf.printf "No event 3\n" - end; - - begin match List.nth_opt event_list 4 with - | Some (Noun.Cell (wire, card)) -> - Printf.printf "\nEvent 4:\n"; - Printf.printf " wire: %s\n" (describe_noun wire); - Printf.printf " card: "; - begin match card with - | Noun.Cell (term, data) -> - Printf.printf "Cell[%s, %s]\n" - (describe_noun term) (describe_noun data) - | Noun.Atom _ -> - Printf.printf "%s\n" (describe_noun card) - end - | Some (Noun.Atom _) -> - Printf.printf "Event 4 is an atom\n" - | None -> - Printf.printf "No event 4\n" - end - - | Noun.Atom _ -> - Printf.printf "✗ Pill is an atom\n" - -let () = - Printf.printf "\n═══════════════════════════════════════════\n"; - Printf.printf " Simple Event Structure Inspector\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - Eio_main.run inspect_events diff --git a/ocaml/test/jam_compare.ml b/ocaml/test/jam_compare.ml deleted file mode 100644 index bdbc306..0000000 --- a/ocaml/test/jam_compare.ml +++ /dev/null @@ -1,36 +0,0 @@ -open Nock_lib.Noun -open Nock_lib.Serial - -let () = - Printf.printf "# OCaml jam outputs (hex)\n"; - - (* Simple atoms *) - Printf.printf "0: %s\n" (bytes_to_hex (jam (atom 0))); - Printf.printf "1: %s\n" (bytes_to_hex (jam (atom 1))); - Printf.printf "2: %s\n" (bytes_to_hex (jam (atom 2))); - Printf.printf "42: %s\n" (bytes_to_hex (jam (atom 42))); - Printf.printf "255: %s\n" (bytes_to_hex (jam (atom 255))); - Printf.printf "256: %s\n" (bytes_to_hex (jam (atom 256))); - - (* Simple cells *) - Printf.printf "[1 2]: %s\n" (bytes_to_hex (jam (cell (atom 1) (atom 2)))); - Printf.printf "[0 0]: %s\n" (bytes_to_hex (jam (cell (atom 0) (atom 0)))); - Printf.printf "[42 43]: %s\n" (bytes_to_hex (jam (cell (atom 42) (atom 43)))); - - (* Nested cells *) - Printf.printf "[[1 2] 3]: %s\n" - (bytes_to_hex (jam (cell (cell (atom 1) (atom 2)) (atom 3)))); - Printf.printf "[1 [2 3]]: %s\n" - (bytes_to_hex (jam (cell (atom 1) (cell (atom 2) (atom 3))))); - - (* Balanced tree *) - Printf.printf "[[1 2] [3 4]]: %s\n" - (bytes_to_hex (jam (cell (cell (atom 1) (atom 2)) (cell (atom 3) (atom 4))))); - - (* Larger tree *) - Printf.printf "[[[1 2] [3 4]] [[5 6] [7 8]]]: %s\n" - (bytes_to_hex (jam ( - cell - (cell (cell (atom 1) (atom 2)) (cell (atom 3) (atom 4))) - (cell (cell (atom 5) (atom 6)) (cell (atom 7) (atom 8))) - ))) diff --git a/ocaml/test/old/bench_cue_pill.ml b/ocaml/test/old/bench_cue_pill.ml new file mode 100644 index 0000000..064f0c5 --- /dev/null +++ b/ocaml/test/old/bench_cue_pill.ml @@ -0,0 +1,218 @@ +open Nock_lib + +exception Stop of string + +type limits = { + max_nouns : int; + max_bytes : int option; + progress_interval : int; + pill_path : string; + verbose : bool; + stop_atom_bits : int option; +} + +let read_file_bytes path = + let ic = open_in_bin path in + let len = in_channel_length ic in + let data = really_input_string ic len in + close_in ic; + Bytes.of_string data + +let mib_of_bytes bytes = float_of_int bytes /. (1024. *. 1024.) + +let run limits = + let pill_bytes = read_file_bytes limits.pill_path in + let total_bytes = Bytes.length pill_bytes in + + Printf.printf "Benchmarking cue on %s (%.2f MiB)\n" limits.pill_path + (mib_of_bytes total_bytes); + Stdlib.flush Stdlib.stdout; + + let start = Unix.gettimeofday () in + let last_print = ref start in + let processed_nouns = ref 0 in + let processed_bytes = ref 0 in + let current_depth = ref 0 in + let peak_depth = ref 0 in + let stop_reason = ref None in + let largest_atom_bits = ref 0 in + let largest_atom_total = ref 0 in + let longest_emit_gap = ref 0.0 in + let last_emit_time = ref start in + + let needs_inspect = limits.verbose || Option.is_some limits.stop_atom_bits in + let maybe_inspect = + if not needs_inspect then None + else + let atom_log_threshold_bits = 1024 in + Some + (fun event -> + match event with + | Serial.Cue_atom_begin { position; value_bits } -> + (match limits.stop_atom_bits with + | Some threshold when value_bits >= threshold -> + stop_reason := + Some + (Printf.sprintf + "encountered large atom (%d bits) at position %d" + value_bits position); + raise (Stop "atom limit") + | _ -> ()); + if limits.verbose && value_bits >= atom_log_threshold_bits then + Printf.printf + " [atom-start] pos=%d value_bits=%d (~%.2f KiB)\n%!" + position value_bits + (float_of_int value_bits /. 8. /. 1024.) + | Serial.Cue_atom_end { position; total_bits; value_bits } -> + if value_bits > !largest_atom_bits then begin + largest_atom_bits := value_bits; + largest_atom_total := total_bits; + if limits.verbose then + Printf.printf + " [atom-end] pos=%d value_bits=%d total_bits=%d (~%.2f KiB)\n%!" + position value_bits total_bits + (float_of_int value_bits /. 8. /. 1024.) + end; + | Serial.Cue_emit { nouns; depth; max_depth } -> + let now = Unix.gettimeofday () in + let gap = now -. !last_emit_time in + if gap > !longest_emit_gap then longest_emit_gap := gap; + if limits.verbose && gap > 0.2 then + Printf.printf + " [emit] gap %.3fs before noun %d (depth=%d peak=%d)\n%!" + gap nouns depth max_depth; + last_emit_time := now + | Serial.Cue_backref _ -> ()) + in + + let progress ~nouns ~bits ~depth ~max_depth = + processed_nouns := nouns; + processed_bytes := bits / 8; + current_depth := depth; + peak_depth := max_depth; + + let now = Unix.gettimeofday () in + if now -. !last_print >= 0.5 then begin + let elapsed = now -. start in + let mib = mib_of_bytes !processed_bytes in + let nouns_rate = float_of_int nouns /. elapsed in + let mib_rate = mib /. elapsed in + Printf.printf + " %.1fs | nouns=%d (%.0f/s) | %.2f MiB (%.2f MiB/s) | depth=%d/%d\n%!" + elapsed nouns nouns_rate mib mib_rate depth max_depth; + last_print := now + end; + + if limits.max_nouns > 0 && nouns >= limits.max_nouns then begin + stop_reason := Some (Printf.sprintf "reached noun limit %d" limits.max_nouns); + raise (Stop "noun limit") + end; + + begin + match limits.max_bytes with + | None -> () + | Some byte_limit -> + if !processed_bytes >= byte_limit then begin + stop_reason := + Some + (Printf.sprintf "reached byte limit %.2f MiB" + (mib_of_bytes byte_limit)); + raise (Stop "byte limit") + end + end + in + + let result = + try + let _ = + Serial.cue ~progress + ~progress_interval:limits.progress_interval + ?inspect:maybe_inspect + pill_bytes + in + `Finished + with + | Stop _ -> `Stopped + in + + let elapsed = Unix.gettimeofday () -. start in + let nouns = !processed_nouns in + let bytes = !processed_bytes in + let mib = mib_of_bytes bytes in + let nouns_rate = float_of_int nouns /. elapsed in + let mib_rate = mib /. elapsed in + let depth_now = !current_depth in + let depth_max = !peak_depth in + + begin + match result with + | `Finished -> Printf.printf "Completed full cue.\n" + | `Stopped -> + Printf.printf "Stopped early (%s).\n" + (Option.value ~default:"manual stop" !stop_reason) + end; + + Printf.printf + "Processed %d nouns in %.2fs (%.2f MiB) \n -> %.0f nouns/s, %.2f MiB/s\n Depth: current=%d peak=%d\n" + nouns elapsed mib nouns_rate mib_rate depth_now depth_max; + if limits.verbose then + Printf.printf + " Largest atom: value_bits=%d (~%.2f KiB), total_bits=%d\n Longest emit gap: %.3fs\n" + !largest_atom_bits + (float_of_int !largest_atom_bits /. 8. /. 1024.) + !largest_atom_total + !longest_emit_gap; + Stdlib.flush Stdlib.stdout + +let parse_limits () = + let pill_path = ref "solid.pill" in + let noun_limit = ref 200_000 in + let mib_limit = ref 0.0 in + let progress_interval = ref 50_000 in + let verbose = ref false in + let stop_atom_bits = ref 0 in + + let spec = + [ ( "--pill", + Arg.String (fun s -> pill_path := s), + "Path to pill (default: solid.pill)" ); + ( "--limit-nouns", + Arg.Int (fun n -> noun_limit := n), + "Stop after decoding at least this many nouns (default 200000, 0 to disable)" + ); + ( "--limit-mib", + Arg.Float (fun f -> mib_limit := f), + "Stop after reading this many MiB of data (default 0 = disable)" ); + ( "--progress-interval", + Arg.Int (fun i -> progress_interval := i), + "Number of nouns between progress callbacks (default 50000)" ) + ; ( "--verbose", + Arg.Unit (fun () -> verbose := true), + "Enable detailed logging of atoms and emit gaps" ) + ; ( "--stop-atom-bits", + Arg.Int (fun b -> stop_atom_bits := b), + "Abort when encountering an atom with this many value bits or more" ) + ] + in + + let usage = "bench_cue_pill [options]" in + Arg.parse spec (fun _ -> ()) usage; + + let max_nouns = if !noun_limit <= 0 then 0 else !noun_limit in + let max_bytes = + if !mib_limit <= 0. then None + else + let bytes = int_of_float (!mib_limit *. 1024. *. 1024.) in + Some bytes + in + + { + max_nouns; + max_bytes; + progress_interval = if !progress_interval <= 0 then 1 else !progress_interval; + pill_path = !pill_path; + verbose = !verbose; + stop_atom_bits = if !stop_atom_bits <= 0 then None else Some !stop_atom_bits; + } + +let () = run (parse_limits ()) diff --git a/ocaml/test/old/bench_nock.ml b/ocaml/test/old/bench_nock.ml new file mode 100644 index 0000000..a71b3da --- /dev/null +++ b/ocaml/test/old/bench_nock.ml @@ -0,0 +1,132 @@ +open Nock_lib.Noun +open Nock_lib.Nock + +(** Benchmark utilities *) + +let time_ms () = + Unix.gettimeofday () *. 1000.0 + +let bench_nock name subject formula iterations = + (* Warmup *) + for _i = 1 to 100 do + let _ = nock subject formula in () + done; + + (* Actual benchmark *) + Gc.compact (); + let start = time_ms () in + + for _i = 1 to iterations do + let _result = nock subject formula in () + done; + + let finish = time_ms () in + let total = finish -. start in + let per_iter = total /. (float_of_int iterations) in + let ops_per_sec = 1000.0 /. per_iter in + + Printf.printf "%-30s %8d iterations in %10.2f ms (%10.6f ms/iter, %10.0f ops/sec)\n" + name iterations total per_iter ops_per_sec + +(** Benchmarks *) + +let () = + Printf.printf "Nock Benchmark - OCaml Implementation\n"; + Printf.printf "======================================\n\n"; + + let iterations = 1_000_000 in (* 1M iterations for fast ops *) + let slow_iters = 100_000 in (* 100K for slower ops *) + + (* Benchmark 0: slot lookup *) + begin + let subject = cell (atom 42) (atom 99) in + let formula = cell (atom 0) (atom 2) in (* [0 2] - get head *) + bench_nock "Opcode 0: slot/fragment" subject formula iterations + end; + + (* Benchmark 1: constant *) + begin + let subject = atom 0 in + let formula = cell (atom 1) (atom 42) in (* [1 42] *) + bench_nock "Opcode 1: constant" subject formula iterations + end; + + (* Benchmark 3: is-cell *) + begin + let subject = atom 0 in + let formula = cell (atom 3) (cell (atom 1) (atom 42)) in (* [3 [1 42]] *) + bench_nock "Opcode 3: is-cell (atom)" subject formula iterations + end; + + (* Benchmark 4: increment *) + begin + let subject = atom 0 in + let formula = cell (atom 4) (cell (atom 1) (atom 1000)) in (* [4 [1 1000]] *) + bench_nock "Opcode 4: increment" subject formula iterations + end; + + (* Benchmark 5: equality *) + begin + let subject = atom 0 in + (* [5 [1 42] [1 42]] *) + let formula = cell (atom 5) (cell (cell (atom 1) (atom 42)) (cell (atom 1) (atom 42))) in + bench_nock "Opcode 5: equality (equal)" subject formula iterations + end; + + (* Benchmark 6: if-then-else *) + begin + let subject = atom 0 in + (* [6 [1 0] [1 11] [1 22]] *) + let formula = cell (atom 6) + (cell (cell (atom 1) (atom 0)) + (cell (cell (atom 1) (atom 11)) + (cell (atom 1) (atom 22)))) in + bench_nock "Opcode 6: if-then-else" subject formula iterations + end; + + (* Benchmark 7: composition *) + begin + let subject = atom 42 in + (* [7 [1 99] [0 1]] *) + let formula = cell (atom 7) (cell (cell (atom 1) (atom 99)) (cell (atom 0) (atom 1))) in + bench_nock "Opcode 7: composition" subject formula iterations + end; + + (* Benchmark 8: push *) + begin + let subject = atom 42 in + (* [8 [1 99] [0 1]] *) + let formula = cell (atom 8) (cell (cell (atom 1) (atom 99)) (cell (atom 0) (atom 1))) in + bench_nock "Opcode 8: push" subject formula iterations + end; + + (* Benchmark: Decrement-like operation (slower) *) + begin + (* [6 [5 [0 1] [1 0]] [1 0] [8 [1 0] [4 [0 3]]]] *) + (* This is: if(subject == 0) 0 else subject+1 (simplified) *) + let dec_fol = cell (atom 6) + (cell (cell (atom 5) (cell (cell (atom 0) (atom 1)) (cell (atom 1) (atom 0)))) + (cell (cell (atom 1) (atom 0)) + (cell (atom 8) (cell (cell (atom 1) (atom 0)) (cell (atom 4) (cell (atom 0) (atom 3))))))) in + + let subject = atom 10 in + bench_nock "Complex: decrement loop" subject dec_fol slow_iters + end; + + (* Benchmark: Tree construction *) + begin + let subject = atom 0 in + (* [[1 1] [1 2]] - constructs a cell *) + let formula = cell (cell (atom 1) (atom 1)) (cell (atom 1) (atom 2)) in + bench_nock "Cell construction" subject formula iterations + end; + + (* Benchmark: Deep slot lookup *) + begin + (* Build a deep tree: [[[[1 2] 3] 4] 5] *) + let subject = cell (cell (cell (cell (atom 1) (atom 2)) (atom 3)) (atom 4)) (atom 5) in + let formula = cell (atom 0) (atom 16) in (* slot 16 = deepest left (1) *) + bench_nock "Deep slot lookup (depth 4)" subject formula iterations + end; + + Printf.printf "\n" diff --git a/ocaml/test/old/bench_serial.ml b/ocaml/test/old/bench_serial.ml new file mode 100644 index 0000000..a8e5bdf --- /dev/null +++ b/ocaml/test/old/bench_serial.ml @@ -0,0 +1,160 @@ +open Nock_lib.Noun +open Nock_lib.Serial + +(** Benchmark utilities *) + +let time_it f = + let start = Unix.gettimeofday () in + let result = f () in + let elapsed = Unix.gettimeofday () -. start in + (result, elapsed) + +let benchmark name iterations f = + (* Warmup *) + for _i = 1 to min 100 (iterations / 10) do + let _ = f () in + () + done; + + (* Actual benchmark *) + let times = ref [] in + for _i = 1 to iterations do + let (_, elapsed) = time_it f in + times := elapsed :: !times + done; + + let total = List.fold_left (+.) 0.0 !times in + let avg = total /. float_of_int iterations in + let sorted = List.sort compare !times in + let median = List.nth sorted (iterations / 2) in + + Printf.printf "%-40s %d iters: avg=%.6f median=%.6f total=%.6f\n" + name iterations avg median total + +(** Benchmark cases *) + +let bench_atom_small () = + benchmark "jam/cue small atom (42)" 100000 (fun () -> + let n = atom 42 in + let j = jam n in + let c = cue j in + c + ) + +let bench_atom_large () = + benchmark "jam/cue large atom (2^64)" 10000 (fun () -> + let n = Atom (Z.shift_left Z.one 64) in + let j = jam n in + let c = cue j in + c + ) + +let bench_cell_simple () = + benchmark "jam/cue simple cell [1 2]" 100000 (fun () -> + let n = cell (atom 1) (atom 2) in + let j = jam n in + let c = cue j in + c + ) + +let bench_tree_balanced () = + let tree = + cell + (cell (cell (atom 1) (atom 2)) (cell (atom 3) (atom 4))) + (cell (cell (atom 5) (atom 6)) (cell (atom 7) (atom 8))) + in + benchmark "jam/cue balanced tree (depth 3)" 50000 (fun () -> + let j = jam tree in + let c = cue j in + c + ) + +let bench_list_structure () = + let rec make_list n = + if n = 0 then atom 0 + else cell (atom n) (make_list (n - 1)) + in + let list = make_list 20 in + benchmark "jam/cue list structure (20 elements)" 10000 (fun () -> + let j = jam list in + let c = cue j in + c + ) + +let bench_deep_nesting () = + let rec make_deep n = + if n = 0 then atom 0 + else cell (atom n) (make_deep (n - 1)) + in + let deep = make_deep 100 in + benchmark "jam/cue deep nesting (100 levels)" 1000 (fun () -> + let j = jam deep in + let c = cue j in + c + ) + +let bench_jam_only_small () = + let n = atom 42 in + benchmark "jam only (small atom)" 100000 (fun () -> + let j = jam n in + j + ) + +let bench_cue_only_small () = + let n = atom 42 in + let j = jam n in + (* Copy the bytes to avoid any mutation issues *) + let j_copy = Bytes.copy j in + benchmark "cue only (small atom)" 100000 (fun () -> + let c = cue j_copy in + c + ) + +let bench_jam_only_tree () = + let tree = + cell + (cell (cell (atom 1) (atom 2)) (cell (atom 3) (atom 4))) + (cell (cell (atom 5) (atom 6)) (cell (atom 7) (atom 8))) + in + benchmark "jam only (balanced tree)" 50000 (fun () -> + let j = jam tree in + j + ) + +let bench_cue_only_tree () = + let tree = + cell + (cell (cell (atom 1) (atom 2)) (cell (atom 3) (atom 4))) + (cell (cell (atom 5) (atom 6)) (cell (atom 7) (atom 8))) + in + let j = jam tree in + (* Copy the bytes to avoid any mutation issues *) + let j_copy = Bytes.copy j in + benchmark "cue only (balanced tree)" 50000 (fun () -> + let c = cue j_copy in + c + ) + +(** Run all benchmarks *) +let () = + Printf.printf "========================================\n"; + Printf.printf "Jam/Cue Serialization Benchmarks\n"; + Printf.printf "========================================\n\n"; + + Printf.printf "Round-trip benchmarks:\n"; + bench_atom_small (); + bench_atom_large (); + bench_cell_simple (); + bench_tree_balanced (); + bench_list_structure (); + bench_deep_nesting (); + + Printf.printf "\nJam-only benchmarks:\n"; + bench_jam_only_small (); + bench_jam_only_tree (); + + Printf.printf "\nCue-only benchmarks:\n"; + bench_cue_only_small (); + bench_cue_only_tree (); + + Printf.printf "\n========================================\n" diff --git a/ocaml/test/old/cache_solid.ml b/ocaml/test/old/cache_solid.ml new file mode 100644 index 0000000..7ad7df0 --- /dev/null +++ b/ocaml/test/old/cache_solid.ml @@ -0,0 +1,78 @@ +(* Cache Solid Pill - Cue once and save marshalled OCaml noun + * + * This cues the solid pill once (slow) and saves the resulting + * noun using OCaml's Marshal for fast loading later + *) + +open Nock_lib + +let cache_solid env = + Printf.printf "Caching solid pill...\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Load and cue solid pill *) + Printf.printf "Step 1: Loading solid.pill (8.7 MB)...\n"; + let file_path = Eio.Path.(fs / "solid.pill") in + let pill_bytes = Eio.Path.load file_path |> Bytes.of_string in + Printf.printf " Loaded %d bytes\n\n" (Bytes.length pill_bytes); + + Printf.printf "Step 2: Cuing (this will take several minutes)...\n"; + let start = Unix.gettimeofday () in + let last_tick = ref start in + let last_nouns = ref 0 in + let last_depth = ref 0 in + let last_peak = ref 0 in + let bytes_seen = ref 0 in + + let total_bytes = Bytes.length pill_bytes in + + let progress ~nouns ~bits ~depth ~max_depth = + last_nouns := nouns; + last_depth := depth; + last_peak := max_depth; + bytes_seen := bits / 8; + + let now = Unix.gettimeofday () in + if now -. !last_tick >= 1.0 then begin + let mb = float_of_int !bytes_seen /. (1024. *. 1024.) in + let pct = (float_of_int !bytes_seen /. float_of_int total_bytes) *. 100. in + Printf.printf " %.1fs | %.2f MiB (%.1f%%) | nouns=%d depth=%d/%d\n%!" + (now -. start) mb pct !last_nouns !last_depth !last_peak; + last_tick := now + end + in + + let pill = + Serial.cue + ~progress + ~progress_interval:50_000 + pill_bytes + in + + let elapsed = Unix.gettimeofday () -. start in + Printf.printf + " ✓ Cued in %.1fs (%.2f MiB, nouns=%d, max depth=%d)\n\n" + elapsed + (float_of_int total_bytes /. (1024. *. 1024.)) + !last_nouns + !last_peak; + + Printf.printf "Step 3: Marshalling noun to solid.noun...\n"; + let out_channel = open_out_bin "solid.noun" in + Marshal.to_channel out_channel pill []; + close_out out_channel; + Printf.printf " ✓ Saved to solid.noun\n\n"; + + Printf.printf "Step 4: Testing reload speed...\n"; + let start = Unix.gettimeofday () in + let in_channel = open_in_bin "solid.noun" in + let _reloaded = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + let elapsed = Unix.gettimeofday () -. start in + Printf.printf " ✓ Reloaded in %.4fs (much faster!)\n\n" elapsed; + + Printf.printf "Done! Use solid.noun for fast testing.\n" + +let () = Eio_main.run cache_solid diff --git a/ocaml/test/old/compare_events_3_4.ml b/ocaml/test/old/compare_events_3_4.ml new file mode 100644 index 0000000..b134d68 --- /dev/null +++ b/ocaml/test/old/compare_events_3_4.ml @@ -0,0 +1,161 @@ +(* Compare Events 3 and 4 structures in detail *) + +open Nock_lib + +let rec describe_noun noun max_depth current_depth = + if current_depth > max_depth then "..." + else + match noun with + | Noun.Atom a -> + if Z.numbits a <= 32 then + Printf.sprintf "Atom(%s/0x%s)" (Z.to_string a) (Z.format "x" a) + else + Printf.sprintf "Atom(%d bits)" (Z.numbits a) + | Noun.Cell (h, t) -> + Printf.sprintf "[%s %s]" + (describe_noun h max_depth (current_depth + 1)) + (describe_noun t max_depth (current_depth + 1)) + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let compare _env = + Printf.printf "Loading solid pill...\n"; + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (_tag, events) -> + let event_list = to_list [] events in + Printf.printf "Found %d events\n\n" (List.length event_list); + + (* Compare Event 3 and Event 4 *) + let event3 = List.nth_opt event_list 3 in + let event4 = List.nth_opt event_list 4 in + + begin match (event3, event4) with + | (Some (Noun.Cell (wire3, card3)), Some (Noun.Cell (wire4, card4))) -> + Printf.printf "═══════════════════════════════════════════\n"; + Printf.printf " EVENT 3 (%%park) - SUCCEEDS\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + + Printf.printf "Wire structure:\n"; + Printf.printf " %s\n\n" (describe_noun wire3 3 0); + + begin match card3 with + | Noun.Cell (term3, data3) -> + Printf.printf "Card term: %s\n" (describe_noun term3 2 0); + begin match term3 with + | Noun.Atom a -> + let bytes = Z.to_bits a in + Printf.printf " ASCII: '%s'\n" bytes + | _ -> () + end; + + Printf.printf "\nCard data structure (depth 4):\n"; + Printf.printf " %s\n\n" (describe_noun data3 4 0); + + (* Try to understand data3 structure *) + begin match data3 with + | Noun.Cell (d3_h, d3_t) -> + Printf.printf "Data breakdown:\n"; + Printf.printf " Head: %s\n" (describe_noun d3_h 3 0); + Printf.printf " Tail: %s\n" (describe_noun d3_t 3 0) + | _ -> () + end + + | _ -> Printf.printf "Card is not [term data]\n" + end; + + Printf.printf "\n═══════════════════════════════════════════\n"; + Printf.printf " EVENT 4 (%%esse) - FAILS\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + + Printf.printf "Wire structure:\n"; + Printf.printf " %s\n\n" (describe_noun wire4 3 0); + + begin match card4 with + | Noun.Cell (term4, data4) -> + Printf.printf "Card term: %s\n" (describe_noun term4 2 0); + begin match term4 with + | Noun.Atom a -> + let bytes = Z.to_bits a in + Printf.printf " ASCII: '%s'\n" bytes + | _ -> () + end; + + Printf.printf "\nCard data structure (depth 4):\n"; + Printf.printf " %s\n\n" (describe_noun data4 4 0); + + (* Try to understand data4 structure *) + begin match data4 with + | Noun.Cell (d4_h, d4_t) -> + Printf.printf "Data breakdown:\n"; + Printf.printf " Head: %s\n" (describe_noun d4_h 3 0); + Printf.printf " Tail: %s\n" (describe_noun d4_t 3 0) + | _ -> () + end + + | _ -> Printf.printf "Card is not [term data]\n" + end; + + Printf.printf "\n═══════════════════════════════════════════\n"; + Printf.printf " COMPARISON\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + + (* Compare wire structures *) + let wire3_is_cell = match wire3 with Noun.Cell _ -> true | _ -> false in + let wire4_is_cell = match wire4 with Noun.Cell _ -> true | _ -> false in + + Printf.printf "Wire types:\n"; + Printf.printf " Event 3: %s\n" (if wire3_is_cell then "Cell (path)" else "Atom"); + Printf.printf " Event 4: %s\n\n" (if wire4_is_cell then "Cell (path)" else "Atom"); + + (* Compare card structures *) + begin match (card3, card4) with + | (Noun.Cell (term3, data3), Noun.Cell (term4, data4)) -> + Printf.printf "Card terms:\n"; + Printf.printf " Event 3: %s\n" (describe_noun term3 1 0); + Printf.printf " Event 4: %s\n\n" (describe_noun term4 1 0); + + (* Compare data types *) + let data3_type = match data3 with Noun.Atom _ -> "Atom" | Noun.Cell _ -> "Cell" in + let data4_type = match data4 with Noun.Atom _ -> "Atom" | Noun.Cell _ -> "Cell" in + + Printf.printf "Data types:\n"; + Printf.printf " Event 3: %s\n" (data3_type); + Printf.printf " Event 4: %s\n\n" (data4_type); + + Printf.printf "KEY DIFFERENCES:\n"; + if data3_type <> data4_type then + Printf.printf " ⚠️ Different data types! (%s vs %s)\n" data3_type data4_type; + + (* Size comparison *) + let rec noun_size noun = + match noun with + | Noun.Atom a -> Z.numbits a + | Noun.Cell (h, t) -> (noun_size h) + (noun_size t) + in + let size3 = noun_size data3 in + let size4 = noun_size data4 in + Printf.printf " Event 3 data size: %d bits\n" size3; + Printf.printf " Event 4 data size: %d bits\n" size4 + + | _ -> () + end + + | _ -> + Printf.printf "Could not extract both events\n" + end + + | Noun.Atom _ -> + Printf.printf "Pill is atom\n" + +let () = + Printf.printf "\n═══════════════════════════════════════════\n"; + Printf.printf " Compare Events 3 and 4\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + Eio_main.run compare diff --git a/ocaml/test/old/debug_event4_slam.ml b/ocaml/test/old/debug_event4_slam.ml new file mode 100644 index 0000000..3aa2150 --- /dev/null +++ b/ocaml/test/old/debug_event4_slam.ml @@ -0,0 +1,155 @@ +(* Debug exactly what happens when we slam Event 4 *) + +open Nock_lib + +let slam_on gate event = + Printf.printf " Building slam...\n"; + let battery = Noun.head gate in + Printf.printf " Battery: %s\n" (match battery with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + + let payload = Noun.tail gate in + Printf.printf " Payload: %s\n" (match payload with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + + let context = Noun.tail payload in + Printf.printf " Context (slot 7): %s\n" (match context with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + + let new_core = Noun.cell battery (Noun.cell event context) in + Printf.printf " New core: built\n"; + + let kick_formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + Printf.printf " Kick formula: [9 2 0 1]\n"; + + Printf.printf " Executing Nock...\n%!"; + Nock.nock_on new_core kick_formula + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let debug _env = + Printf.printf "Loading solid pill...\n"; + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (_tag, events) -> + let event_list = to_list [] events in + + (* Get Event 1 (initial kernel) *) + let kernel1 = List.nth event_list 1 in + + (* Slam Event 3 to get kernel after Event 3 *) + let event3 = List.nth event_list 3 in + + Printf.printf "\n=== SLAMMING EVENT 3 ===\n\n"; + let poke_gate3 = Noun.slot (Z.of_int 23) kernel1 in + let now3 = Noun.atom 0 in + let poke_arg3 = Noun.cell now3 event3 in + + let result3 = slam_on poke_gate3 poke_arg3 in + + let kernel_after_3 = match result3 with + | Noun.Cell (_effects, new_kernel) -> + Printf.printf "✓ Event 3 succeeded\n\n"; + new_kernel + | Noun.Atom _ -> + Printf.printf "✗ Event 3 returned atom\n"; + kernel1 + in + + (* Now try Event 4 *) + let event4 = List.nth event_list 4 in + + Printf.printf "=== SLAMMING EVENT 4 ===\n\n"; + + Printf.printf "Event 4 structure:\n"; + begin match event4 with + | Noun.Cell (wire, card) -> + Printf.printf " [wire card]\n"; + Printf.printf " Wire: %s\n" (match wire with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + begin match card with + | Noun.Cell (term, data) -> + Printf.printf " Card: [term data]\n"; + Printf.printf " Term: %s\n" (match term with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + Printf.printf " Data: %s\n\n" (match data with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + | _ -> () + end + | _ -> Printf.printf " Not [wire card]\n\n" + end; + + Printf.printf "Kernel after Event 3:\n"; + begin try + let _poke23 = Noun.slot (Z.of_int 23) kernel_after_3 in + Printf.printf " ✓ Has slot 23\n" + with _ -> + Printf.printf " ✗ No slot 23\n" + end; + + begin try + let _poke42 = Noun.slot (Z.of_int 42) kernel_after_3 in + Printf.printf " ✓ Has slot 42\n\n" + with _ -> + Printf.printf " ✗ No slot 42\n\n" + end; + + Printf.printf "Attempting Event 4 slam...\n"; + begin try + let poke_gate4 = Noun.slot (Z.of_int 23) kernel_after_3 in + Printf.printf " ✓ Found poke gate at slot 23\n"; + + let now4 = Noun.atom 0 in + let poke_arg4 = Noun.cell now4 event4 in + Printf.printf " Poke arg: [now ovum]\n\n"; + + let result4 = slam_on poke_gate4 poke_arg4 in + + begin match result4 with + | Noun.Cell (_effects, _new_kernel) -> + Printf.printf "\n🎉 EVENT 4 SUCCEEDED!\n" + | Noun.Atom _ -> + Printf.printf "\nResult is atom\n" + end + + with + | Noun.Exit -> + Printf.printf "\n✗ Nock Exit - examining gate structure...\n\n"; + + (* Try to understand why it failed *) + begin try + let poke_gate4 = Noun.slot (Z.of_int 23) kernel_after_3 in + Printf.printf "Poke gate structure:\n"; + begin match poke_gate4 with + | Noun.Cell (battery, payload) -> + Printf.printf " Battery: %s\n" (match battery with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + begin match payload with + | Noun.Cell (sample, context) -> + Printf.printf " Payload: [sample context]\n"; + Printf.printf " Sample: %s\n" (match sample with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + Printf.printf " Context: %s\n" (match context with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell") + | _ -> + Printf.printf " Payload: %s (not [sample context])\n" + (match payload with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell") + end + | Noun.Atom _ -> + Printf.printf " Poke gate is an atom!\n" + end + with e -> + Printf.printf "Error examining gate: %s\n" (Printexc.to_string e) + end + + | e -> + Printf.printf "\n✗ Error: %s\n" (Printexc.to_string e) + end + + | Noun.Atom _ -> + Printf.printf "Pill is atom\n" + +let () = + Printf.printf "\n═══════════════════════════════════════════\n"; + Printf.printf " Debug Event 4 Slam\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + Eio_main.run debug diff --git a/ocaml/test/old/examine_event3_effects.ml b/ocaml/test/old/examine_event3_effects.ml new file mode 100644 index 0000000..de2fec3 --- /dev/null +++ b/ocaml/test/old/examine_event3_effects.ml @@ -0,0 +1,148 @@ +(* Examine what effects Event 3 produces *) + +open Nock_lib + +let slam_on gate event = + let battery = Noun.head gate in + let context = Noun.tail (Noun.tail gate) in + let new_core = Noun.cell battery (Noun.cell event context) in + let kick_formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + Nock.nock_on new_core kick_formula + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let rec count_list noun = + match noun with + | Noun.Atom _ -> 0 + | Noun.Cell (_, rest) -> 1 + (count_list rest) + +let describe_noun noun max_depth current_depth = + let rec aux n d = + if d > max_depth then "..." + else + match n with + | Noun.Atom a -> + if Z.numbits a <= 32 then + Printf.sprintf "Atom(%s/0x%s)" (Z.to_string a) (Z.format "x" a) + else + Printf.sprintf "Atom(%d bits)" (Z.numbits a) + | Noun.Cell (h, t) -> + Printf.sprintf "[%s %s]" (aux h (d + 1)) (aux t (d + 1)) + in + aux noun current_depth + +let examine _env = + Printf.printf "Loading solid pill...\n"; + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (_tag, events) -> + let event_list = to_list [] events in + + (* Get Event 1 (kernel) *) + begin match List.nth_opt event_list 1 with + | Some kernel -> + (* Get Event 3 *) + begin match List.nth_opt event_list 3 with + | Some event3 -> + Printf.printf "\n═══════════════════════════════════════════\n"; + Printf.printf " Event 3 (%%park) Effects Analysis\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + + (* Poke Event 3 *) + let poke_gate = Noun.slot (Z.of_int 23) kernel in + let now = Noun.atom 0 in + let poke_arg = Noun.cell now event3 in + + Printf.printf "Slamming Event 3...\n"; + let result = slam_on poke_gate poke_arg in + + begin match result with + | Noun.Cell (effects, new_kernel) -> + Printf.printf "✓ Slam succeeded!\n\n"; + + (* Analyze effects *) + Printf.printf "Effects analysis:\n"; + let effect_count = count_list effects in + Printf.printf " Total effects: %d\n\n" effect_count; + + if effect_count = 0 then + Printf.printf " (No effects - effects is atom/nil)\n\n" + else begin + Printf.printf " Effect list:\n"; + let effects_list = to_list [] effects in + List.iteri (fun i eff -> + Printf.printf " Effect %d: %s\n" i + (describe_noun eff 2 0) + ) effects_list; + Printf.printf "\n" + end; + + (* Analyze new kernel *) + Printf.printf "New kernel analysis:\n"; + + (* Check if it still has slot 23 *) + begin try + let _poke23 = Noun.slot (Z.of_int 23) new_kernel in + Printf.printf " ✓ Has slot 23 (larval poke)\n" + with _ -> + Printf.printf " ✗ No slot 23\n" + end; + + (* Check if it NOW has slot 42 *) + begin try + let _poke42 = Noun.slot (Z.of_int 42) new_kernel in + Printf.printf " ✓ Has slot 42 (adult poke?)\n" + with _ -> + Printf.printf " ✗ No slot 42\n" + end; + + (* Check if kernel changed *) + let kernel_is_same = kernel == new_kernel in + Printf.printf " Kernel changed: %s\n" + (if kernel_is_same then "No (same object)" else "Yes (new object)"); + + (* Try to see if there's a metamorphosis indicator *) + Printf.printf "\nLooking for metamorphosis indicators...\n"; + + (* Check a few specific slots that might indicate state *) + let check_slot kernel slot_num name = + try + let _val = Noun.slot (Z.of_int slot_num) kernel in + Printf.printf " %s (slot %d): exists\n" name slot_num + with _ -> + Printf.printf " %s (slot %d): missing\n" name slot_num + in + + check_slot kernel 2 "Original head"; + check_slot kernel 3 "Original tail"; + check_slot new_kernel 2 "New head"; + check_slot new_kernel 3 "New tail"; + + | Noun.Atom _ -> + Printf.printf "✗ Result is atom (unexpected)\n" + end + + | None -> + Printf.printf "No Event 3\n" + end + + | None -> + Printf.printf "No Event 1\n" + end + + | Noun.Atom _ -> + Printf.printf "Pill is atom\n" + +let () = + Printf.printf "\n═══════════════════════════════════════════\n"; + Printf.printf " Examine Event 3 Effects\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + Eio_main.run examine diff --git a/ocaml/test/old/examine_ivory.ml b/ocaml/test/old/examine_ivory.ml new file mode 100644 index 0000000..490f735 --- /dev/null +++ b/ocaml/test/old/examine_ivory.ml @@ -0,0 +1,86 @@ +(* Examine ivory.pill structure *) + +open Nock_lib + +let main env = + Printf.printf "\n═══════════════════════════════════════\n"; + Printf.printf " Examining ivory.pill Structure\n"; + Printf.printf "═══════════════════════════════════════\n\n"; + + (* Load ivory pill *) + Printf.printf "[1] Loading ivory.pill...\\n%!"; + let fs = Eio.Stdenv.fs env in + let pill_bytes = Eio.Path.(load (fs / "ivory.pill")) |> Bytes.of_string in + Printf.printf " Size: %d bytes\n%!" (Bytes.length pill_bytes); + + (* Cue it *) + Printf.printf "[2] Cuing ivory pill...\n%!"; + let pill = Serial.cue pill_bytes in + Printf.printf " ✓ Cued\n\n"; + + (* Check structure *) + Printf.printf "[3] Structure analysis:\n"; + match pill with + | Noun.Cell (tag, tail) -> + (* Print tag *) + let tag_str = match tag with + | Noun.Atom z -> + let bytes = Z.to_bits z in + if String.length bytes <= 10 then bytes else Printf.sprintf "" (Z.numbits z) + | Noun.Cell _ -> "" + in + Printf.printf " Tag: %s\n" tag_str; + + (* Analyze tail *) + Printf.printf " Tail type: %s\n" (if Noun.is_cell tail then "CELL" else "ATOM"); + + (match tail with + | Noun.Atom z when Z.equal z Z.zero -> + Printf.printf " Tail value: 0 (NULL!)\n"; + Printf.printf "\n"; + Printf.printf " ✓ CONFIRMED: Embedded ivory has structure [\"ivory\" 0]\n"; + Printf.printf " This means u3v_life() is called with atom 0!\n" + + | Noun.Atom z -> + Printf.printf " Tail value: atom with %d bits\n" (Z.numbits z); + Printf.printf " Tail decimal: %s\n" (Z.to_string z) + + | Noun.Cell (h, t) -> + Printf.printf " Tail is a CELL\n"; + Printf.printf " Head type: %s\n" (if Noun.is_cell h then "cell" else "atom"); + Printf.printf " Tail type: %s\n" (if Noun.is_cell t then "cell" else "atom"); + + (* Check if it's the Arvo core structure *) + Printf.printf "\n Checking if tail is Arvo core...\n"; + begin try + let _slot2 = Noun.slot (Z.of_int 2) tail in + let _slot3 = Noun.slot (Z.of_int 3) tail in + Printf.printf " ✓ Has slot 2 and 3 (it's a cell with head and tail)\n"; + + (* Check for lifecycle formula at slot 2 *) + begin try + let slot2 = Noun.slot (Z.of_int 2) tail in + Printf.printf " Slot 2 type: %s\n" (if Noun.is_cell slot2 then "cell" else "atom"); + + (* The lifecycle formula should be [2 [0 3] [0 2]] *) + match slot2 with + | Noun.Cell (Noun.Atom op, _rest) when Z.equal op (Z.of_int 2) -> + Printf.printf " Slot 2 starts with opcode 2 - could be lifecycle formula!\n"; + Printf.printf "\n ✓ Tail appears to BE the Arvo core itself!\n"; + Printf.printf " This means the lifecycle formula operates on the CORE, not null!\n" + | Noun.Cell (Noun.Atom op, _rest) -> + Printf.printf " Slot 2 starts with opcode: %s\n" (Z.to_string op) + | _ -> + Printf.printf " Slot 2 doesn't match expected lifecycle formula pattern\n" + with _ -> + Printf.printf " Could not analyze slot 2\n" + end + with Noun.Exit -> + Printf.printf " ✗ Cannot access slots 2/3 - not a valid cell structure\n" + end + ) + + | Noun.Atom _ -> + Printf.printf " ✗ Pill is an atom (unexpected)\n" + +let () = Eio_main.run main diff --git a/ocaml/test/old/examine_pill_events.ml b/ocaml/test/old/examine_pill_events.ml new file mode 100644 index 0000000..8a11117 --- /dev/null +++ b/ocaml/test/old/examine_pill_events.ml @@ -0,0 +1,88 @@ +(* Examine what the bot/mod/use events actually contain *) + +open Nock_lib + +let describe_noun noun = + match noun with + | Noun.Atom a -> + if Z.numbits a <= 64 then + Printf.sprintf "Atom(%s)" (Z.to_string a) + else + Printf.sprintf "Atom(%d bits)" (Z.numbits a) + | Noun.Cell _ -> "Cell" + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let examine _env = + Printf.printf "Loading solid.noun...\n"; + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (_tag, events) -> + Printf.printf "\n=== solid.noun structure ===\n\n"; + + let event_list = to_list [] events in + Printf.printf "Total: %d items in list\n\n" (List.length event_list); + + List.iteri (fun i event -> + Printf.printf "Item %d: %s\n" i (describe_noun event) + ) event_list; + + (* Check if this matches what u3v_life expects *) + Printf.printf "\n=== Testing u3v_life on this list ===\n\n"; + + (* Functional BIOS formula: [2 [0 3] [0 2]] *) + let lyf = Noun.cell (Noun.atom 2) + (Noun.cell + (Noun.cell (Noun.atom 0) (Noun.atom 3)) + (Noun.cell (Noun.atom 0) (Noun.atom 2))) in + + Printf.printf "Running [2 [0 3] [0 2]] on events...\n%!"; + + begin try + (* What does [0 2] get from events? *) + let slot2 = Noun.slot (Z.of_int 2) events in + Printf.printf " Slot 2 of events: %s\n" (describe_noun slot2); + + (* What does [0 3] get from events? *) + let slot3 = Noun.slot (Z.of_int 3) events in + Printf.printf " Slot 3 of events: %s\n\n" (describe_noun slot3); + + let start = Unix.gettimeofday () in + let gat = Nock.nock_on events lyf in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf "✓ Formula succeeded in %.4fs!\n\n" elapsed; + + (* Extract slot 7 *) + let kernel = Noun.slot (Z.of_int 7) gat in + Printf.printf "✓ Extracted kernel from slot 7\n\n"; + + (* Check if kernel has slot 23 *) + begin try + let _poke = Noun.slot (Z.of_int 23) kernel in + Printf.printf "✓ Kernel has poke at slot 23\n"; + Printf.printf "\n🎉 This is the correct event list format!\n" + with _ -> + Printf.printf "✗ No slot 23\n" + end + + with + | Not_found -> + Printf.printf "✗ Slot not found\n" + | Noun.Exit -> + Printf.printf "✗ Nock Exit\n" + | e -> + Printf.printf "✗ Error: %s\n" (Printexc.to_string e) + end + + | Noun.Atom _ -> + Printf.printf "Pill is atom\n" + +let () = + Eio_main.run examine diff --git a/ocaml/test/old/explore_kernel_structure.ml b/ocaml/test/old/explore_kernel_structure.ml new file mode 100644 index 0000000..513d47f --- /dev/null +++ b/ocaml/test/old/explore_kernel_structure.ml @@ -0,0 +1,108 @@ +(* Explore the structure of Event 1 kernel *) + +open Nock_lib + +let check_slot noun slot = + try + let _val = Noun.slot (Z.of_int slot) noun in + "✓" + with _ -> "✗" + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let explore _env = + Printf.printf "Exploring Event 1 kernel structure...\n\n"; + + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (_tag, events) -> + let event_list = to_list [] events in + + begin match List.nth_opt event_list 1 with + | Some kernel -> + Printf.printf "Event 1 (kernel) slot map:\n"; + Printf.printf " Slot 2 (head): %s\n" (check_slot kernel 2); + Printf.printf " Slot 3 (tail): %s\n" (check_slot kernel 3); + Printf.printf " Slot 4: %s\n" (check_slot kernel 4); + Printf.printf " Slot 5: %s\n" (check_slot kernel 5); + Printf.printf " Slot 6: %s\n" (check_slot kernel 6); + Printf.printf " Slot 7: %s\n" (check_slot kernel 7); + Printf.printf " Slot 20: %s\n" (check_slot kernel 20); + Printf.printf " Slot 23: %s\n" (check_slot kernel 23); + Printf.printf " Slot 42: %s\n" (check_slot kernel 42); + Printf.printf " Slot 87: %s\n" (check_slot kernel 87); + Printf.printf "\n"; + + (* Check if slots 23 and 42 are gates or formulas *) + Printf.printf "Checking slot 23:\n"; + begin try + let slot_23 = Noun.slot (Z.of_int 23) kernel in + match slot_23 with + | Noun.Atom a -> + Printf.printf " Atom: %s\n" (Z.to_string a) + | Noun.Cell (h, t) -> + Printf.printf " Cell (likely a formula or gate)\n"; + Printf.printf " Head: %s\n" (match h with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + Printf.printf " Tail: %s\n" (match t with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + + (* Check if it looks like a gate [battery payload] *) + (* Gate structure: [[formula] [sample context]] *) + begin try + let battery = Noun.head slot_23 in + let payload = Noun.tail slot_23 in + let sample = Noun.head payload in + let _context = Noun.tail payload in + Printf.printf " → Looks like a GATE (has battery/payload/sample/context)\n"; + Printf.printf " Battery: %s\n" (match battery with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + Printf.printf " Sample: %s\n" (match sample with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell") + with _ -> + Printf.printf " → Looks like a FORMULA (not gate structure)\n" + end + with _ -> + Printf.printf " ✗ Error accessing slot 23\n" + end; + + Printf.printf "\nChecking slot 42:\n"; + begin try + let slot_42 = Noun.slot (Z.of_int 42) kernel in + match slot_42 with + | Noun.Atom a -> + Printf.printf " Atom: %s\n" (Z.to_string a) + | Noun.Cell (h, t) -> + Printf.printf " Cell\n"; + Printf.printf " Head: %s\n" (match h with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + Printf.printf " Tail: %s\n" (match t with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + + begin try + let battery = Noun.head slot_42 in + let payload = Noun.tail slot_42 in + let sample = Noun.head payload in + let _context = Noun.tail payload in + Printf.printf " → Looks like a GATE\n"; + Printf.printf " Battery: %s\n" (match battery with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + Printf.printf " Sample: %s\n" (match sample with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell") + with _ -> + Printf.printf " → Looks like a FORMULA\n" + end + with _ -> + Printf.printf " ✗ Error accessing slot 42\n" + end + + | None -> + Printf.printf "No event 1\n" + end + + | Noun.Atom _ -> + Printf.printf "Pill is atom\n" + +let () = + Printf.printf "\n═══════════════════════════════════════════\n"; + Printf.printf " Explore Kernel Structure\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + Eio_main.run explore diff --git a/ocaml/test/old/inspect_boot_events.ml b/ocaml/test/old/inspect_boot_events.ml new file mode 100644 index 0000000..0a7ba92 --- /dev/null +++ b/ocaml/test/old/inspect_boot_events.ml @@ -0,0 +1,48 @@ +(* Inspect the structure of boot events *) + +open Nock_lib + +let rec inspect_noun prefix noun depth = + let indent = String.make (depth * 2) ' ' in + match noun with + | Noun.Atom a -> + if Z.numbits a <= 32 then + Printf.printf "%s%sAtom: %s (0x%s)\n" indent prefix + (Z.to_string a) (Z.format "x" a) + else + Printf.printf "%s%sAtom: large (%d bits)\n" indent prefix (Z.numbits a) + | Noun.Cell (h, t) -> + Printf.printf "%s%sCell:\n" indent prefix; + inspect_noun "head: " h (depth + 1); + inspect_noun "tail: " t (depth + 1) + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let inspect_events _env = + Printf.printf "Loading solid pill...\n"; + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (_tag, events) -> + let event_list = to_list [] events in + Printf.printf "Found %d events\n\n" (List.length event_list); + + List.iteri (fun i event -> + Printf.printf "═════ EVENT %d ═════\n" i; + inspect_noun "" event 0; + Printf.printf "\n" + ) event_list + + | Noun.Atom _ -> + Printf.printf "✗ Pill is an atom\n" + +let () = + Printf.printf "\n═══════════════════════════════════════════\n"; + Printf.printf " Inspect Boot Events Structure\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + Eio_main.run inspect_events diff --git a/ocaml/test/old/inspect_event4_detail.ml b/ocaml/test/old/inspect_event4_detail.ml new file mode 100644 index 0000000..4f4f30a --- /dev/null +++ b/ocaml/test/old/inspect_event4_detail.ml @@ -0,0 +1,132 @@ +(* Inspect Event 4 in detail *) + +open Nock_lib + +let to_atom_if_small noun = + match noun with + | Noun.Atom a -> + if Z.numbits a <= 32 then + Printf.sprintf "Atom(%s / 0x%s)" (Z.to_string a) (Z.format "x" a) + else + Printf.sprintf "Atom(large, %d bits)" (Z.numbits a) + | Noun.Cell _ -> "Cell" + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let inspect _env = + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (_tag, events) -> + let event_list = to_list [] events in + + (* Event 3 *) + Printf.printf "=== EVENT 3 ===\n\n"; + begin match List.nth_opt event_list 3 with + | Some (Noun.Cell (wire, card)) -> + Printf.printf "Event 3: [wire card]\n\n"; + + Printf.printf "Wire:\n"; + Printf.printf " %s\n" (to_atom_if_small wire); + + (* If wire is a cell (path), show first few elements *) + begin match wire with + | Noun.Cell (w1, rest1) -> + Printf.printf " Head: %s\n" (to_atom_if_small w1); + begin match rest1 with + | Noun.Cell (w2, rest2) -> + Printf.printf " [1]: %s\n" (to_atom_if_small w2); + begin match rest2 with + | Noun.Cell (w3, _) -> + Printf.printf " [2]: %s\n" (to_atom_if_small w3) + | Noun.Atom a -> + Printf.printf " Tail: Atom(%s)\n" (Z.to_string a) + end + | Noun.Atom a -> + Printf.printf " Tail: Atom(%s)\n" (Z.to_string a) + end + | Noun.Atom _ -> () + end; + + Printf.printf "\nCard:\n"; + begin match card with + | Noun.Cell (term, data) -> + Printf.printf " [term data]\n"; + Printf.printf " Term: %s\n" (to_atom_if_small term); + (* Try to convert term to ASCII *) + begin match term with + | Noun.Atom a when Z.numbits a <= 32 -> + let bytes = Z.to_bits a in + Printf.printf " Term ASCII: '%s'\n" bytes + | _ -> () + end; + Printf.printf " Data: %s\n" (to_atom_if_small data) + | Noun.Atom a -> + Printf.printf " Atom: %s\n" (Z.to_string a) + end + + | _ -> Printf.printf "Event 3 not found or wrong format\n" + end; + + Printf.printf "\n═══════════════════════════════════════\n\n"; + + (* Event 4 *) + Printf.printf "=== EVENT 4 ===\n\n"; + begin match List.nth_opt event_list 4 with + | Some (Noun.Cell (wire, card)) -> + Printf.printf "Event 4: [wire card]\n\n"; + + Printf.printf "Wire:\n"; + Printf.printf " %s\n" (to_atom_if_small wire); + + begin match wire with + | Noun.Cell (w1, rest1) -> + Printf.printf " Head: %s\n" (to_atom_if_small w1); + begin match rest1 with + | Noun.Cell (w2, rest2) -> + Printf.printf " [1]: %s\n" (to_atom_if_small w2); + begin match rest2 with + | Noun.Cell (w3, _) -> + Printf.printf " [2]: %s\n" (to_atom_if_small w3) + | Noun.Atom a -> + Printf.printf " Tail: Atom(%s)\n" (Z.to_string a) + end + | Noun.Atom a -> + Printf.printf " Tail: Atom(%s)\n" (Z.to_string a) + end + | Noun.Atom _ -> () + end; + + Printf.printf "\nCard:\n"; + begin match card with + | Noun.Cell (term, data) -> + Printf.printf " [term data]\n"; + Printf.printf " Term: %s\n" (to_atom_if_small term); + (* Try to convert term to ASCII *) + begin match term with + | Noun.Atom a when Z.numbits a <= 32 -> + let bytes = Z.to_bits a in + Printf.printf " Term ASCII: '%s'\n" bytes + | _ -> () + end; + Printf.printf " Data: %s\n" (to_atom_if_small data) + | Noun.Atom a -> + Printf.printf " Atom: %s\n" (Z.to_string a) + end + + | _ -> Printf.printf "Event 4 not found or wrong format\n" + end + + | Noun.Atom _ -> + Printf.printf "Pill is atom\n" + +let () = + Printf.printf "\n═══════════════════════════════════════\n"; + Printf.printf " Inspect Events 3 and 4 in Detail\n"; + Printf.printf "═══════════════════════════════════════\n\n"; + Eio_main.run inspect diff --git a/ocaml/test/old/inspect_events_simple.ml b/ocaml/test/old/inspect_events_simple.ml new file mode 100644 index 0000000..0cb05c9 --- /dev/null +++ b/ocaml/test/old/inspect_events_simple.ml @@ -0,0 +1,88 @@ +(* Simple event structure inspector *) + +open Nock_lib + +let describe_noun noun = + match noun with + | Noun.Atom a -> + if Z.numbits a <= 32 then + Printf.sprintf "Atom(%s)" (Z.to_string a) + else + Printf.sprintf "Atom(large, %d bits)" (Z.numbits a) + | Noun.Cell _ -> "Cell" + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let inspect_events _env = + Printf.printf "Loading solid pill...\n"; + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (tag, events) -> + Printf.printf "Tag: %s\n\n" (describe_noun tag); + + let event_list = to_list [] events in + Printf.printf "Found %d events\n\n" (List.length event_list); + + List.iteri (fun i event -> + Printf.printf "Event %d: " i; + match event with + | Noun.Atom a -> + Printf.printf "Atom(%s)\n" (Z.to_string a) + | Noun.Cell (head, tail) -> + Printf.printf "Cell[%s, %s]\n" + (describe_noun head) (describe_noun tail) + ) event_list; + + (* Look more closely at events 3 and 4 *) + Printf.printf "\n=== Detailed look at events 3 and 4 ===\n\n"; + + begin match List.nth_opt event_list 3 with + | Some (Noun.Cell (wire, card)) -> + Printf.printf "Event 3:\n"; + Printf.printf " wire: %s\n" (describe_noun wire); + Printf.printf " card: "; + begin match card with + | Noun.Cell (term, data) -> + Printf.printf "Cell[%s, %s]\n" + (describe_noun term) (describe_noun data) + | Noun.Atom _ -> + Printf.printf "%s\n" (describe_noun card) + end + | Some (Noun.Atom _) -> + Printf.printf "Event 3 is an atom\n" + | None -> + Printf.printf "No event 3\n" + end; + + begin match List.nth_opt event_list 4 with + | Some (Noun.Cell (wire, card)) -> + Printf.printf "\nEvent 4:\n"; + Printf.printf " wire: %s\n" (describe_noun wire); + Printf.printf " card: "; + begin match card with + | Noun.Cell (term, data) -> + Printf.printf "Cell[%s, %s]\n" + (describe_noun term) (describe_noun data) + | Noun.Atom _ -> + Printf.printf "%s\n" (describe_noun card) + end + | Some (Noun.Atom _) -> + Printf.printf "Event 4 is an atom\n" + | None -> + Printf.printf "No event 4\n" + end + + | Noun.Atom _ -> + Printf.printf "✗ Pill is an atom\n" + +let () = + Printf.printf "\n═══════════════════════════════════════════\n"; + Printf.printf " Simple Event Structure Inspector\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + Eio_main.run inspect_events diff --git a/ocaml/test/old/jam_compare.ml b/ocaml/test/old/jam_compare.ml new file mode 100644 index 0000000..bdbc306 --- /dev/null +++ b/ocaml/test/old/jam_compare.ml @@ -0,0 +1,36 @@ +open Nock_lib.Noun +open Nock_lib.Serial + +let () = + Printf.printf "# OCaml jam outputs (hex)\n"; + + (* Simple atoms *) + Printf.printf "0: %s\n" (bytes_to_hex (jam (atom 0))); + Printf.printf "1: %s\n" (bytes_to_hex (jam (atom 1))); + Printf.printf "2: %s\n" (bytes_to_hex (jam (atom 2))); + Printf.printf "42: %s\n" (bytes_to_hex (jam (atom 42))); + Printf.printf "255: %s\n" (bytes_to_hex (jam (atom 255))); + Printf.printf "256: %s\n" (bytes_to_hex (jam (atom 256))); + + (* Simple cells *) + Printf.printf "[1 2]: %s\n" (bytes_to_hex (jam (cell (atom 1) (atom 2)))); + Printf.printf "[0 0]: %s\n" (bytes_to_hex (jam (cell (atom 0) (atom 0)))); + Printf.printf "[42 43]: %s\n" (bytes_to_hex (jam (cell (atom 42) (atom 43)))); + + (* Nested cells *) + Printf.printf "[[1 2] 3]: %s\n" + (bytes_to_hex (jam (cell (cell (atom 1) (atom 2)) (atom 3)))); + Printf.printf "[1 [2 3]]: %s\n" + (bytes_to_hex (jam (cell (atom 1) (cell (atom 2) (atom 3))))); + + (* Balanced tree *) + Printf.printf "[[1 2] [3 4]]: %s\n" + (bytes_to_hex (jam (cell (cell (atom 1) (atom 2)) (cell (atom 3) (atom 4))))); + + (* Larger tree *) + Printf.printf "[[[1 2] [3 4]] [[5 6] [7 8]]]: %s\n" + (bytes_to_hex (jam ( + cell + (cell (cell (atom 1) (atom 2)) (cell (atom 3) (atom 4))) + (cell (cell (atom 5) (atom 6)) (cell (atom 7) (atom 8))) + ))) diff --git a/ocaml/test/old/parse_solid_pill.ml b/ocaml/test/old/parse_solid_pill.ml new file mode 100644 index 0000000..ef10785 --- /dev/null +++ b/ocaml/test/old/parse_solid_pill.ml @@ -0,0 +1,190 @@ +(* Parse solid pill structure to extract [bot mod use] *) + +open Nock_lib + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let parse_pill _env = + Printf.printf "═══════════════════════════════════════\n"; + Printf.printf " Parsing Solid Pill Structure\n"; + Printf.printf "═══════════════════════════════════════\n\n"; + + (* Load the pill *) + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + (* According to C Vere mars.c:1560, solid pill structure is: + * First we cue pil_p (the jammed pill data) + * Then we expect: [tag dat] + * Where: + * tag = %pill or %cash + * dat = [type [bot mod use]] or [[cache] [type [bot mod use]]] + *) + + Printf.printf "Step 1: Check outer structure\n"; + match pill with + | Noun.Cell (tag, rest) -> + Printf.printf " ✓ Pill is a cell [tag rest]\n"; + + (* Check what the tag is *) + begin match tag with + | Noun.Atom z -> + let tag_str = + try + let bytes = Z.to_bits z in + let len = String.length bytes in + if len > 0 && len <= 20 then + String.sub bytes 0 (min len 20) + else "too-long" + with _ -> "non-ascii" + in + Printf.printf " Tag (atom): %s\n" tag_str; + Printf.printf " Tag (hex): %s\n\n" (Z.format "x" z); + | Noun.Cell _ -> + Printf.printf " Tag is a cell (unexpected!)\n\n" + end; + + (* Now parse rest based on structure *) + Printf.printf "Step 2: Parse pill contents\n"; + + (* Try to extract as [type [bot mod use]] *) + begin match rest with + | Noun.Cell (typ, rest2) -> + Printf.printf " ✓ rest = [type rest2]\n"; + + begin match typ with + | Noun.Atom z -> + let typ_str = + try + let bytes = Z.to_bits z in + String.sub bytes 0 (min (String.length bytes) 20) + with _ -> "non-ascii" + in + Printf.printf " Type: %s\n\n" typ_str; + | Noun.Cell _ -> + Printf.printf " Type is cell\n\n" + end; + + (* Now try to parse rest2 as [bot mod use] *) + begin match rest2 with + | Noun.Cell (bot, rest3) -> + Printf.printf " ✓ Found bot (boot events)\n"; + let bot_list = to_list [] bot in + Printf.printf " Bot has %d events\n" (List.length bot_list); + + begin match rest3 with + | Noun.Cell (mod_, rest4) -> + Printf.printf " ✓ Found mod (module events)\n"; + let mod_list = to_list [] mod_ in + Printf.printf " Mod has %d events\n" (List.length mod_list); + + begin match rest4 with + | Noun.Cell (use, _) -> + Printf.printf " ✓ Found use (userspace events)\n"; + let use_list = to_list [] use in + Printf.printf " Use has %d events\n\n" (List.length use_list); + + (* Total events *) + let total = List.length bot_list + List.length mod_list + List.length use_list in + Printf.printf "═══════════════════════════════════════\n"; + Printf.printf " Summary\n"; + Printf.printf "═══════════════════════════════════════\n\n"; + Printf.printf "Total events: %d\n" total; + Printf.printf " Bot: %d events (lifecycle)\n" (List.length bot_list); + Printf.printf " Mod: %d events (vanes)\n" (List.length mod_list); + Printf.printf " Use: %d events (apps)\n\n" (List.length use_list); + + (* Concatenate all events *) + let all_events = bot_list @ mod_list @ use_list in + Printf.printf "Creating full event list...\n"; + + (* Convert list back to noun list (NOT a proper list yet) *) + let rec make_noun_list events = + match events with + | [] -> Noun.atom 0 (* null terminator *) + | [e] -> Noun.cell e (Noun.atom 0) + | e :: rest -> Noun.cell e (make_noun_list rest) + in + + let event_noun = make_noun_list all_events in + Printf.printf "✓ Event list created\n\n"; + + (* Now test functional BIOS formula! *) + Printf.printf "═══════════════════════════════════════\n"; + Printf.printf " Testing Functional BIOS Formula\n"; + Printf.printf "═══════════════════════════════════════\n\n"; + + Printf.printf "Formula: [2 [0 3] [0 2]]\n"; + Printf.printf "Subject: %d-event list\n\n" total; + + (* Build lifecycle formula: [2 [0 3] [0 2]] *) + let lyf = Noun.cell (Noun.atom 2) + (Noun.cell + (Noun.cell (Noun.atom 0) (Noun.atom 3)) + (Noun.cell (Noun.atom 0) (Noun.atom 2))) in + + Printf.printf "Running formula...\n%!"; + + begin try + let start = Unix.gettimeofday () in + let gat = Nock.nock_on event_noun lyf in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf "✓ Formula completed in %.4fs!\n\n" elapsed; + + (* Extract slot 7 *) + Printf.printf "Extracting kernel from slot 7...\n"; + let kernel = Noun.slot (Z.of_int 7) gat in + + Printf.printf "✓ Kernel extracted!\n\n"; + + Printf.printf "═══════════════════════════════════════\n"; + Printf.printf " 🎉 SUCCESS! Functional BIOS Works! 🎉\n"; + Printf.printf "═══════════════════════════════════════\n\n"; + + Printf.printf "The kernel has been computed from the event list\n"; + Printf.printf "using the functional BIOS formula.\n\n"; + + (* Check kernel has slot 23 *) + begin try + let _poke = Noun.slot (Z.of_int 23) kernel in + Printf.printf "✓ Kernel has poke gate at slot 23\n" + with _ -> + Printf.printf "✗ No slot 23 in kernel\n" + end + + with + | Noun.Exit -> + Printf.printf "✗ Formula failed (Nock Exit)\n" + | e -> + Printf.printf "✗ Error: %s\n" (Printexc.to_string e) + end + + | Noun.Atom _ -> + Printf.printf " ✗ rest4 is atom (expected use)\n" + end + + | Noun.Atom _ -> + Printf.printf " ✗ rest3 is atom (expected [mod use])\n" + end + + | Noun.Atom _ -> + Printf.printf " ✗ rest2 is atom (expected [bot mod use])\n" + end + + | Noun.Atom _ -> + Printf.printf " ✗ rest is atom\n" + end + + | Noun.Atom _ -> + Printf.printf "✗ Pill is an atom (expected cell)\n" + +let () = + Printf.printf "\n═══════════════════════════════════════\n"; + Printf.printf " Parse Solid Pill Structure\n"; + Printf.printf "═══════════════════════════════════════\n\n"; + Eio_main.run parse_pill diff --git a/ocaml/test/old/test_ames.ml b/ocaml/test/old/test_ames.ml new file mode 100644 index 0000000..d50a799 --- /dev/null +++ b/ocaml/test/old/test_ames.ml @@ -0,0 +1,150 @@ +(* Test Ames UDP Networking Driver *) + +open Io_drivers + +let test_ames_creation env = + Printf.printf "Test: Ames driver creation...\n"; + + Eio.Switch.run @@ fun sw -> + + let config = Ames.{ + port = 12345; + our_ship = "~zod"; + galaxy_table = []; + } in + + let ames = Ames.create ~env ~sw config in + let stats = Ames.get_stats ames in + + Printf.printf " Created Ames on port %d\n" config.port; + Printf.printf " Initial stats - sent: %Ld, recv: %Ld\n" + stats.packets_sent stats.packets_recv; + + assert (stats.packets_sent = 0L); + assert (stats.packets_recv = 0L); + + Printf.printf " ✓ Ames creation works!\n\n" + +let test_ames_send_recv env = + Printf.printf "Test: Ames send/receive...\n"; + + Eio.Switch.run @@ fun sw -> + + (* Create two Ames instances on different ports *) + let config1 = Ames.{ + port = 23456; + our_ship = "~zod"; + galaxy_table = []; + } in + + let config2 = Ames.{ + port = 23457; + our_ship = "~nec"; + galaxy_table = []; + } in + + let ames1 = Ames.create ~env ~sw config1 in + let _ames2 = Ames.create ~env ~sw config2 in + + Printf.printf " Created two Ames instances\n"; + Printf.printf " Ames1 (%s) on port %d\n" config1.our_ship config1.port; + Printf.printf " Ames2 (%s) on port %d\n" config2.our_ship config2.port; + + (* Create test packet *) + let packet = Ames.{ + header = { + version = 1; + sender = "~zod"; + receiver = "~nec"; + sequence = 1L; + }; + payload = Bytes.of_string "Hello from ~zod!"; + } in + + (* Send packet from ames1 to ames2 *) + let dest = `Udp (Eio.Net.Ipaddr.V4.loopback, config2.port) in + Ames.send_packet ames1 dest packet; + + Printf.printf " Sent packet from %s to %s\n" config1.our_ship config2.our_ship; + + (* Give it a moment to arrive *) + Eio.Time.sleep (Eio.Stdenv.clock env) 0.1; + + let stats1 = Ames.get_stats ames1 in + Printf.printf " Ames1 stats - sent: %Ld, recv: %Ld\n" + stats1.packets_sent stats1.packets_recv; + + assert (stats1.packets_sent = 1L); + + Printf.printf " ✓ Ames send works!\n\n" + +let _test_ames_with_runtime env = + Printf.printf "Test: Ames with runtime event queue...\n"; + + Eio.Switch.run @@ fun sw -> + + (* Create event stream for runtime *) + let event_stream = Eio.Stream.create 100 in + + let config = Ames.{ + port = 34567; + our_ship = "~zod"; + galaxy_table = []; + } in + + let ames = Ames.create ~env ~sw config in + + Printf.printf " Starting Ames driver with event queue\n"; + + (* Run Ames driver (spawns receive fiber) *) + Ames.run ames ~sw ~event_stream; + + (* Send a packet to ourselves *) + let packet = Ames.{ + header = { + version = 1; + sender = "~nec"; + receiver = "~zod"; + sequence = 42L; + }; + payload = Bytes.of_string "Test message"; + } in + + let dest = `Udp (Eio.Net.Ipaddr.V4.loopback, config.port) in + Ames.send_packet ames dest packet; + + Printf.printf " Sent test packet to ourselves\n"; + + (* Wait a bit for the packet to be received *) + Eio.Time.sleep (Eio.Stdenv.clock env) 0.2; + + (* Try to receive event from queue with timeout *) + (match Eio.Time.with_timeout (Eio.Stdenv.clock env) 0.5 (fun () -> + Ok (Eio.Stream.take event_stream) + ) with + | Ok ovum -> + Printf.printf " Received event from Ames!\n"; + Printf.printf " Wire: %s\n" (Format.asprintf "%a" Nock_lib.Noun.pp_noun ovum.Nock_lib.Effects.wire) + | Error `Timeout -> + Printf.printf " (Timeout - no event received)\n" + ); + + let stats = Ames.get_stats ames in + Printf.printf " Final stats - sent: %Ld, recv: %Ld\n" + stats.packets_sent stats.packets_recv; + + Printf.printf " ✓ Ames with runtime integration works!\n\n" + +let () = + Printf.printf "\n🚀🚀🚀 === AMES NETWORKING TESTS === 🚀🚀🚀\n\n"; + + Eio_main.run @@ fun env -> + test_ames_creation env; + test_ames_send_recv env; + + Printf.printf "🎉🎉🎉 === AMES TESTS PASSED! === 🎉🎉🎉\n\n"; + Printf.printf "Ames UDP driver is working!\n"; + Printf.printf "- Async socket creation ✓\n"; + Printf.printf "- Packet send ✓\n"; + Printf.printf "\nReady for ship-to-ship communication! 🚀\n"; + Printf.printf "\n(Note: Runtime integration test with infinite receive loop available in test_ames_with_runtime)\n" diff --git a/ocaml/test/old/test_arms.ml b/ocaml/test/old/test_arms.ml new file mode 100644 index 0000000..0847f6f --- /dev/null +++ b/ocaml/test/old/test_arms.ml @@ -0,0 +1,73 @@ +(* Test Different Arms + * + * Try calling different arms of the Arvo kernel + *) + +open Nock_lib + +let test_arm arm_num kernel = + Printf.printf "Testing arm %d: " arm_num; + + try + let formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom arm_num) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + + let _result = Nock.nock_on kernel formula in + Printf.printf "✓ Success!\n"; + true + with e -> + Printf.printf "✗ %s\n" (Printexc.to_string e); + false + +let test_arms env = + Printf.printf "🔍 Testing Different Arms of Arvo\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Load ivory pill *) + let state = State.create () in + match Boot.boot_from_file ~fs state "ivory.pill" with + | Error msg -> + Printf.printf "✗ Failed to load pill: %s\n%!" msg + | Ok () -> + let kernel = State.get_arvo state in + + Printf.printf "Trying arms 2 through 10...\n\n"; + + for arm = 2 to 10 do + let _ = test_arm arm kernel in + () + done; + + Printf.printf "\nNow trying specific formulas:\n\n"; + + (* Try the actual C Vere poke formula from u3v_poke *) + Printf.printf "C Vere style (simplified): "; + try + (* Subject is [now kernel] typically *) + let now = Noun.atom 0 in + let poke_subject = Noun.cell now kernel in + + (* Formula to replace sample and call *) + (* [8 kernel-with-new-sample [9 2 [0 1]]] *) + let formula = Noun.cell (Noun.atom 8) + (Noun.cell kernel + (Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))))) in + + let _result = Nock.nock_on poke_subject formula in + Printf.printf "✓ Success!\n" + with e -> + Printf.printf "✗ %s\n" (Printexc.to_string e) + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Testing Arms of Arvo Kernel\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_arms diff --git a/ocaml/test/old/test_arvo.ml b/ocaml/test/old/test_arvo.ml new file mode 100644 index 0000000..8325589 --- /dev/null +++ b/ocaml/test/old/test_arvo.ml @@ -0,0 +1,69 @@ +(* Test Real Arvo Execution + * + * Load ivory pill and try to poke Arvo with a test event + *) + +open Nock_lib + +let test_load_and_poke env = + Printf.printf "🧪 Testing Real Arvo Execution\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Load ivory pill *) + Printf.printf "Loading ivory pill...\n%!"; + let state = State.create () in + + match Boot.boot_from_file ~fs state "ivory.pill" with + | Error msg -> + Printf.printf "✗ Failed to load pill: %s\n%!" msg; + failwith "Pill load failed" + + | Ok () -> + Printf.printf "✓ Ivory kernel loaded!\n\n"; + + (* Create a simple test event (ovum) *) + Printf.printf "Creating test event...\n%!"; + let test_event = Noun.cell + (Noun.atom 0) (* wire: simple routing *) + (Noun.cell + (Noun.atom 1) (* vane tag *) + (Noun.atom 42)) (* simple data *) + in + + Printf.printf "Test event: [wire card]\n%!"; + Printf.printf " wire: 0\n%!"; + Printf.printf " card: [1 42]\n\n%!"; + + (* Try to poke Arvo! *) + Printf.printf "🚀 Poking Arvo with test event...\n%!"; + + try + let start = Unix.gettimeofday () in + let effects = State.poke state test_event in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf "✓ Poke succeeded in %.4f seconds!\n\n" elapsed; + + Printf.printf "Effects returned: %d\n%!" (List.length effects); + Printf.printf "New event number: %Ld\n\n%!" (State.event_num state); + + Printf.printf "🎉 ARVO IS RUNNING!\n%!"; + + with e -> + Printf.printf "✗ Poke failed with exception:\n%!"; + Printf.printf " %s\n\n%!" (Printexc.to_string e); + Printf.printf "This is expected - we need to figure out:\n%!"; + Printf.printf " 1. Correct event format\n%!"; + Printf.printf " 2. Correct poke formula\n%!"; + Printf.printf " 3. How to parse results\n%!" + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Testing Real Arvo Execution with Ivory Pill\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_load_and_poke diff --git a/ocaml/test/old/test_arvo_poke_correct.ml b/ocaml/test/old/test_arvo_poke_correct.ml new file mode 100644 index 0000000..23259b9 --- /dev/null +++ b/ocaml/test/old/test_arvo_poke_correct.ml @@ -0,0 +1,128 @@ +(* Test Arvo poke with CORRECT interface from docs *) + +open Nock_lib + +let extract_arvo () = + Printf.printf "Loading Arvo from solid pill...\n"; + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + (* Extract event 1 - the initial kernel *) + match pill with + | Noun.Cell (_tag, events) -> + let rec nth n noun = + match noun with + | Noun.Atom _ -> None + | Noun.Cell (item, rest) -> + if n = 0 then Some item else nth (n - 1) rest + in + begin match nth 1 events with + | Some (Noun.Cell (_wire, card)) -> Some card + | _ -> None + end + | _ -> None + +let test_poke _env = + Printf.printf "🎯 Testing Arvo Poke (Correct Interface)\n\n"; + Printf.printf "Based on docs/runtime/api.md:\n"; + Printf.printf " ++ poke |/ {now/@da ovo/ovum} :: 42\n"; + Printf.printf " ++ ovum {p/wire q/card}\n"; + Printf.printf " ++ card {p/@tas q/*}\n\n"; + + match extract_arvo () with + | None -> Printf.printf "✗ Failed to extract Arvo\n" + | Some arvo -> + try + (* The poke gate is at AXIS 42, not 23! *) + Printf.printf "Looking for poke gate at axis 42...\n"; + let poke_gate = Noun.slot (Z.of_int 42) arvo in + Printf.printf "✓ Found poke gate at axis 42!\n\n"; + + (* Build proper ovum: [wire card] *) + (* wire = / (empty path, represented as 0) *) + (* card = [term data] = [%test 42] *) + Printf.printf "Building ovum: [wire card]\n"; + Printf.printf " wire: / (atom 0)\n"; + Printf.printf " card: [%%test 42]\n"; + + let wire = Noun.atom 0 in (* / path *) + let term_test = Noun.Atom (Z.of_string "1953719668") in (* 'test' as atom *) + let data = Noun.atom 42 in + let card = Noun.cell term_test data in + let ovum = Noun.cell wire card in + + Printf.printf "\nBuilding poke arguments: [now ovum]\n"; + (* now = current time as @da (atom) - use a fake timestamp *) + let now = Noun.atom 0 in (* epoch *) + let poke_arg = Noun.cell now ovum in + + Printf.printf " now: 0 (epoch)\n"; + Printf.printf " ovum: [0 [1953719668 42]]\n\n"; + + (* Build subject for gate call: [sample gate] *) + (* Standard gate call: [9 2 [0 2] [0 3]] *) + Printf.printf "Calling poke gate...\n"; + let subject = Noun.cell poke_arg poke_gate in + let formula = Noun.cell + (Noun.atom 9) + (Noun.cell + (Noun.atom 2) + (Noun.cell + (Noun.cell (Noun.atom 0) (Noun.atom 2)) + (Noun.cell (Noun.atom 0) (Noun.atom 3)))) + in + + let start = Unix.gettimeofday () in + let result = Nock.nock_on subject formula in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf "✓ Poke succeeded in %.4fs!\n\n" elapsed; + + (* Parse result: [effects new-kernel] *) + begin match result with + | Noun.Cell (effects, new_kernel) -> + Printf.printf "Result: [effects new-kernel]\n"; + Printf.printf " Effects: %s\n" + (match effects with Noun.Atom _ -> "atom/nil" | Noun.Cell _ -> "cell/list"); + Printf.printf " New kernel: %s\n\n" + (match new_kernel with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + + (* Verify new kernel still has poke gate *) + begin try + let _new_poke = Noun.slot (Z.of_int 42) new_kernel in + Printf.printf "✓ New kernel has poke gate at axis 42\n\n"; + Printf.printf "🎉 ARVO POKE IS FULLY WORKING!\n\n"; + Printf.printf "This means we can:\n"; + Printf.printf " ✅ Send events to Arvo\n"; + Printf.printf " ✅ Receive effects (output events)\n"; + Printf.printf " ✅ Get updated kernel state\n"; + Printf.printf " ✅ Build a complete Urbit runtime!\n" + with _ -> + Printf.printf "⚠️ New kernel missing poke gate\n" + end + + | Noun.Atom _ -> + Printf.printf "Result is an atom (unexpected)\n"; + Printf.printf "This might mean the gate signature doesn't match\n" + end + + with + | Noun.Exit -> + Printf.printf "✗ Nock failed (Exit)\n\n"; + Printf.printf "Possible issues:\n"; + Printf.printf " - Event format still wrong\n"; + Printf.printf " - Gate formula incorrect\n"; + Printf.printf " - Arvo kernel not fully initialized\n" + | Not_found -> + Printf.printf "✗ No gate at axis 42\n"; + Printf.printf "This kernel might not be Arvo\n" + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Test Arvo Poke (Correct Interface from Docs)\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_poke diff --git a/ocaml/test/old/test_arvo_real_poke.ml b/ocaml/test/old/test_arvo_real_poke.ml new file mode 100644 index 0000000..af707fe --- /dev/null +++ b/ocaml/test/old/test_arvo_real_poke.ml @@ -0,0 +1,103 @@ +(* Test REAL Arvo poke - actually call into the kernel *) + +open Nock_lib + +let test_real_poke env = + Printf.printf "🚀 Testing Real Arvo Poke\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Load ivory pill *) + Printf.printf "Loading ivory pill...\n%!"; + let state = State.create () in + + match Boot.boot_from_file ~fs state "ivory.pill" with + | Error msg -> + Printf.printf "✗ Failed to load pill: %s\n%!" msg; + failwith "Pill load failed" + + | Ok () -> + Printf.printf "✓ Ivory kernel loaded!\n\n"; + + (* Get the kernel *) + let kernel = state.roc in + + (* Try to find the poke gate at slot 23 (traditional Arvo location) *) + Printf.printf "Looking for poke gate...\n"; + + try + (* Try slot 23 *) + let gate = Noun.slot (Z.of_int 23) kernel in + Printf.printf "✓ Found gate at slot 23\n\n"; + + (* Create test event: [wire card] *) + let event = Noun.cell + (Noun.atom 0) (* wire *) + (Noun.cell (Noun.atom 1) (Noun.atom 42)) (* card *) + in + + Printf.printf "Calling Arvo with event [0 [1 42]]...\n"; + + (* Try the standard gate call formula: [9 2 [0 2] [0 3]] + * This means: + * - 9 2: call gate at axis 2 (of the subject) + * - [0 2]: get sample (event) at axis 2 + * - [0 3]: get context (gate) at axis 3 + * + * Subject is: [event gate] + *) + let subject = Noun.cell event gate in + let formula = Noun.cell + (Noun.atom 9) + (Noun.cell + (Noun.atom 2) + (Noun.cell + (Noun.cell (Noun.atom 0) (Noun.atom 2)) + (Noun.cell (Noun.atom 0) (Noun.atom 3)))) + in + + Printf.printf "Running nock...\n"; + let result = Nock.nock_on subject formula in + Printf.printf "✓ Poke succeeded!\n\n"; + + (* Check result structure *) + begin match result with + | Noun.Cell (effects, new_kernel) -> + Printf.printf "Result is a cell: [effects new_kernel]\n"; + Printf.printf "Effects: %s\n" + (match effects with + | Noun.Atom _ -> "atom" + | Noun.Cell _ -> "cell"); + Printf.printf "New kernel: %s\n" + (match new_kernel with + | Noun.Atom _ -> "atom" + | Noun.Cell _ -> "cell"); + Printf.printf "\n🎉 ARVO POKE SUCCESSFUL!\n" + + | Noun.Atom _ -> + Printf.printf "Result is an atom (unexpected)\n" + end + + with Noun.Exit -> + Printf.printf "✗ Nock execution failed (Exit)\n"; + Printf.printf "Slot 23 might not be the right location\n\n"; + + (* Try to explore the kernel structure *) + Printf.printf "Let me explore the kernel structure...\n"; + for i = 2 to 30 do + try + let slot_val = Noun.slot (Z.of_int i) kernel in + let is_cell = match slot_val with Noun.Cell _ -> "cell" | Noun.Atom _ -> "atom" in + Printf.printf " Slot %d: %s\n" i is_cell + with _ -> () + done + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Testing REAL Arvo Poke (Actually Call Into Kernel)\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_real_poke diff --git a/ocaml/test/old/test_arvo_slots.ml b/ocaml/test/old/test_arvo_slots.ml new file mode 100644 index 0000000..5ec9f76 --- /dev/null +++ b/ocaml/test/old/test_arvo_slots.ml @@ -0,0 +1,74 @@ +(* Test Available Slots on Arvo Core + * + * Check what slots are available on the Arvo core we found + *) + +open Nock_lib + +let test_slot slot arvo = + try + let value = Noun.slot (Z.of_int slot) arvo in + Printf.printf " Slot %2d: exists (%s)\n" slot + (if Noun.is_cell value then "cell" else "atom"); + Some value + with _ -> + Printf.printf " Slot %2d: does not exist\n" slot; + None + +let test_arvo_slots env = + Printf.printf "🔍 Testing Available Slots on Arvo Core\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Load solid pill *) + let state = State.create () in + match Boot.boot_from_file ~fs state "solid.pill" with + | Error msg -> + Printf.printf "✗ Failed to load pill: %s\n%!" msg + | Ok () -> + let pill_root = State.get_arvo state in + + Printf.printf "=== Testing PILL ROOT ===\n\n"; + Printf.printf "Testing slots 2-30 on pill root:\n\n"; + List.iter (fun slot -> ignore (test_slot slot pill_root)) + (List.init 29 (fun i -> i + 2)); + + Printf.printf "\n\n=== Testing ARVO CORE (at depth 8) ===\n\n"; + + (* Navigate to real Arvo *) + let path = [3; 3; 2; 3; 2; 3; 3; 2] in + let rec navigate noun = function + | [] -> noun + | slot :: rest -> + navigate (Noun.slot (Z.of_int slot) noun) rest + in + let arvo = navigate pill_root path in + + Printf.printf "Testing slots 2-30 on Arvo core:\n\n"; + List.iter (fun slot -> ignore (test_slot slot arvo)) + (List.init 29 (fun i -> i + 2)); + + Printf.printf "\nLooking for formula slots that might be poke...\n\n"; + + (* Check if any slot contains a formula (cell starting with opcode) *) + for slot = 2 to 30 do + match test_slot slot arvo with + | Some value when Noun.is_cell value -> + (match Noun.head value with + | Noun.Atom z when Z.numbits z < 8 -> + let opcode = Z.to_int z in + if opcode >= 0 && opcode <= 11 then + Printf.printf " Slot %d contains formula with opcode %d\n" slot opcode + | _ -> ()) + | _ -> () + done + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Testing Arvo Core Slots\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_arvo_slots diff --git a/ocaml/test/old/test_arvo_structure.ml b/ocaml/test/old/test_arvo_structure.ml new file mode 100644 index 0000000..cbd9f65 --- /dev/null +++ b/ocaml/test/old/test_arvo_structure.ml @@ -0,0 +1,116 @@ +(* Examine Arvo Kernel Structure + * + * Load the ivory pill and inspect the kernel to understand: + * - Is it a gate (cell)? + * - Where is the battery? + * - What's the structure? + *) + +open Nock_lib + +let rec describe_noun_structure noun depth = + if depth > 5 then + "..." + else + match noun with + | Noun.Atom z -> + if Z.numbits z > 64 then + Printf.sprintf "Atom(huge: %d bits)" (Z.numbits z) + else + Printf.sprintf "Atom(%s)" (Z.to_string z) + | Noun.Cell (a, b) -> + Printf.sprintf "Cell(\n%s%s,\n%s%s)" + (String.make (depth * 2) ' ') + (describe_noun_structure a (depth + 1)) + (String.make (depth * 2) ' ') + (describe_noun_structure b (depth + 1)) + +let test_arvo_structure env = + Printf.printf "🔍 Examining Arvo Kernel Structure\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Load ivory pill *) + Printf.printf "Loading ivory pill...\n%!"; + let state = State.create () in + + match Boot.boot_from_file ~fs state "ivory.pill" with + | Error msg -> + Printf.printf "✗ Failed to load pill: %s\n%!" msg + | Ok () -> + Printf.printf "✓ Pill loaded!\n\n"; + + let kernel = State.get_arvo state in + + (* Check if it's a cell *) + Printf.printf "Kernel structure:\n"; + if Noun.is_cell kernel then begin + Printf.printf " ✓ Kernel is a CELL (likely a gate!)\n\n"; + + let head = Noun.head kernel in + let tail = Noun.tail kernel in + + Printf.printf "Head (slot 2 - battery?):\n"; + if Noun.is_cell head then + Printf.printf " Cell (battery with multiple arms)\n" + else + (match head with + | Noun.Atom z -> Printf.printf " Atom: %s\n" (Z.to_string z) + | _ -> ()); + + Printf.printf "\nTail (slot 3 - sample + context?):\n"; + if Noun.is_cell tail then begin + Printf.printf " Cell (has sample and context)\n"; + let sample = Noun.head tail in + let context = Noun.tail tail in + + Printf.printf "\n Sample (slot 6):\n"; + Printf.printf " %s\n" (describe_noun_structure sample 2); + + Printf.printf "\n Context (slot 7):\n"; + if Noun.is_atom context then + (match context with + | Noun.Atom z -> Printf.printf " Atom: %s\n" (Z.to_string z) + | _ -> ()) + else + Printf.printf " Cell (nested context)\n" + end else + (match tail with + | Noun.Atom z -> Printf.printf " Atom: %s\n" (Z.to_string z) + | _ -> ()); + + (* Test: Try to call arm 2 with current sample *) + Printf.printf "\n🧪 Testing gate call with opcode 9...\n"; + Printf.printf "Formula: [9 2 0 1] (call arm 2 of whole subject)\n\n"; + + try + let formula = Noun.cell + (Noun.atom 9) + (Noun.cell (Noun.atom 2) (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + + let start = Unix.gettimeofday () in + let _result = Nock.nock_on kernel formula in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf "✓ Gate call succeeded in %.4f seconds!\n" elapsed; + Printf.printf "This proves Arvo is a proper gate!\n\n" + with e -> + Printf.printf "✗ Gate call failed: %s\n" (Printexc.to_string e); + Printf.printf "Kernel might not be a standard gate structure\n\n" + + end else begin + (match kernel with + | Noun.Atom z -> Printf.printf " Kernel is an ATOM: %s\n" (Z.to_string z) + | _ -> ()); + Printf.printf " This is unexpected - Arvo should be a gate (cell)\n" + end + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Examining Arvo Kernel Structure from Ivory Pill\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_arvo_structure diff --git a/ocaml/test/old/test_bench_one.ml b/ocaml/test/old/test_bench_one.ml new file mode 100644 index 0000000..1a73be5 --- /dev/null +++ b/ocaml/test/old/test_bench_one.ml @@ -0,0 +1,15 @@ +open Nock_lib.Noun +open Nock_lib.Serial + +let () = + Printf.printf "Running single bench iteration...\n"; + for i = 1 to 10 do + Printf.printf "Iter %d: " i; + flush stdout; + let n = atom 42 in + let j = jam n in + let c = cue j in + Format.printf "%a\n" pp_noun c; + flush stdout + done; + Printf.printf "Done!\n" diff --git a/ocaml/test/old/test_boot_arvo_properly.ml b/ocaml/test/old/test_boot_arvo_properly.ml new file mode 100644 index 0000000..559264f --- /dev/null +++ b/ocaml/test/old/test_boot_arvo_properly.ml @@ -0,0 +1,220 @@ +(* Boot Arvo properly through all 5 solid pill events *) + +open Nock_lib + +let boot_arvo _env = + Printf.printf "🚀 Booting Arvo Through All 5 Events\n\n"; + + (* Load solid pill *) + Printf.printf "Loading solid pill from cache...\n"; + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + Printf.printf "✓ Loaded\n\n"; + + match pill with + | Noun.Cell (_tag, events) -> + (* Convert to list *) + let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + in + + let event_list = to_list [] events in + Printf.printf "Found %d events\n\n" (List.length event_list); + + (* Start with no kernel *) + let kernel = ref None in + + (* Process each event *) + List.iteri (fun i event -> + Printf.printf "=== Event %d ===\n" i; + + match event with + | Noun.Atom a -> + Printf.printf "Atom: %s\n" (Z.to_string a); + if i = 0 then + Printf.printf " (Boot sequence tag)\n" + else if i = 2 then + Printf.printf " (Separator)\n"; + Printf.printf "\n" + + | Noun.Cell _ -> + if i = 1 then begin + (* Event 1: The kernel itself (not wrapped in [wire card]) *) + Printf.printf "Cell: Initial kernel\n"; + Printf.printf " → Setting as kernel\n"; + kernel := Some event; (* The whole event IS the kernel *) + + (* Verify it has poke gate at axis 42 *) + begin try + let _gate = Noun.slot (Z.of_int 42) event in + Printf.printf " ✓ Has poke gate at axis 42\n" + with _ -> + Printf.printf " ✗ No poke gate found\n" + end; + Printf.printf "\n" + + end else if i > 1 then begin + (* Events 3 and 4: Boot events as [wire card] *) + Printf.printf "Cell: [wire card]\n"; + match !kernel with + | None -> + Printf.printf " ✗ No kernel to poke yet\n\n" + + | Some k -> + Printf.printf " → Poking kernel with event\n"; + + try + (* Get poke gate at axis 42 *) + let poke_gate = Noun.slot (Z.of_int 42) k in + Printf.printf " Found poke gate at axis 42\n"; + + (* Build poke arguments: [now ovum] *) + (* ovum is the event itself: [wire card] *) + let now = Noun.atom 0 in (* Use epoch for now *) + let ovum = event in + let poke_arg = Noun.cell now ovum in + + (* Build subject: [sample gate] *) + let subject = Noun.cell poke_arg poke_gate in + + (* Standard gate call: [9 2 [0 2] [0 3]] *) + let formula = Noun.cell + (Noun.atom 9) + (Noun.cell + (Noun.atom 2) + (Noun.cell + (Noun.cell (Noun.atom 0) (Noun.atom 2)) + (Noun.cell (Noun.atom 0) (Noun.atom 3)))) + in + + Printf.printf " Executing poke...\n%!"; + let start = Unix.gettimeofday () in + let result = Nock.nock_on subject formula in + let elapsed = Unix.gettimeofday () -. start in + Printf.printf " ✓ Completed in %.3fs\n" elapsed; + + (* Parse result: [effects new-kernel] *) + begin match result with + | Noun.Cell (effects, new_kernel) -> + Printf.printf " Result: [effects new-kernel]\n"; + + (* Count effects *) + let rec count_list n noun = + match noun with + | Noun.Atom _ -> n + | Noun.Cell (_, rest) -> count_list (n + 1) rest + in + let effect_count = count_list 0 effects in + Printf.printf " Effects: %d\n" effect_count; + + (* Update kernel *) + kernel := Some new_kernel; + Printf.printf " ✓ Kernel updated\n" + + | Noun.Atom _ -> + Printf.printf " ✗ Result is atom (unexpected)\n" + end; + + Printf.printf "\n" + + with + | Noun.Exit -> + Printf.printf " ✗ Nock execution failed (Exit)\n"; + Printf.printf " This event might not be in the right format\n"; + Printf.printf "\n" + | Not_found -> + Printf.printf " ✗ No poke gate at axis 42\n\n" + end + ) event_list; + + (* Final kernel check *) + Printf.printf "═══════════════════════════════════════════════════════\n\n"; + + begin match !kernel with + | None -> + Printf.printf "✗ No final kernel\n" + + | Some k -> + Printf.printf "🎉 Arvo Boot Complete!\n\n"; + + (* Verify poke gate *) + begin try + let _gate = Noun.slot (Z.of_int 42) k in + Printf.printf "✓ Final kernel has poke gate at axis 42\n\n"; + + (* Try a test poke! *) + Printf.printf "Testing final kernel with a poke...\n"; + + let poke_gate = Noun.slot (Z.of_int 42) k in + + (* Build test ovum: [wire card] *) + let wire = Noun.atom 0 in (* / *) + let term_test = Noun.Atom (Z.of_string "1953719668") in (* 'test' *) + let data = Noun.atom 42 in + let card = Noun.cell term_test data in + let ovum = Noun.cell wire card in + + let now = Noun.atom 0 in + let poke_arg = Noun.cell now ovum in + + let subject = Noun.cell poke_arg poke_gate in + let formula = Noun.cell + (Noun.atom 9) + (Noun.cell + (Noun.atom 2) + (Noun.cell + (Noun.cell (Noun.atom 0) (Noun.atom 2)) + (Noun.cell (Noun.atom 0) (Noun.atom 3)))) + in + + Printf.printf " Poking with test event [0 [%%test 42]]...\n%!"; + let start = Unix.gettimeofday () in + let result = Nock.nock_on subject formula in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf " ✓ Poke succeeded in %.4fs!\n\n" elapsed; + + begin match result with + | Noun.Cell (effects, new_kernel) -> + let rec count_list n noun = + match noun with + | Noun.Atom _ -> n + | Noun.Cell (_, rest) -> count_list (n + 1) rest + in + Printf.printf " Effects produced: %d\n" (count_list 0 effects); + Printf.printf " New kernel: %s\n\n" + (match new_kernel with Noun.Cell _ -> "cell ✓" | Noun.Atom _ -> "atom"); + + Printf.printf "🎊 ARVO IS FULLY OPERATIONAL! 🎊\n\n"; + Printf.printf "We can now:\n"; + Printf.printf " ✅ Send events to Arvo\n"; + Printf.printf " ✅ Receive effects\n"; + Printf.printf " ✅ Update kernel state\n"; + Printf.printf " ✅ Build a complete Urbit runtime!\n" + + | Noun.Atom _ -> + Printf.printf " Result is atom (unexpected)\n" + end + + with + | Noun.Exit -> + Printf.printf "✗ Test poke failed\n" + | Not_found -> + Printf.printf "✗ No poke gate in final kernel\n" + end + end + + | Noun.Atom _ -> + Printf.printf "✗ Pill is an atom\n" + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Boot Arvo Properly Through All Events\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run boot_arvo diff --git a/ocaml/test/old/test_boot_solid_events.ml b/ocaml/test/old/test_boot_solid_events.ml new file mode 100644 index 0000000..41fd32c --- /dev/null +++ b/ocaml/test/old/test_boot_solid_events.ml @@ -0,0 +1,136 @@ +(* Test processing solid pill boot events *) + +open Nock_lib + +let test_boot_events _env = + Printf.printf "🚀 Processing Solid Pill Boot Events\n\n"; + + (* Load cached solid pill *) + Printf.printf "Loading solid pill from cache...\n"; + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + Printf.printf "✓ Loaded\n\n"; + + (* Extract events *) + match pill with + | Noun.Cell (_tag, events) -> + Printf.printf "Extracting boot events...\n"; + + (* Convert event list to array *) + let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + in + + let event_list = to_list [] events in + Printf.printf "✓ Found %d events\n\n" (List.length event_list); + + (* Process each event *) + Printf.printf "Processing events:\n\n"; + + let kernel = ref None in + + List.iteri (fun i event -> + Printf.printf "Event %d:\n" i; + + match event with + | Noun.Atom a -> + Printf.printf " Type: Atom (%s)\n" (Z.to_string a); + Printf.printf " (Skipping atom event)\n\n" + + | Noun.Cell (wire, card) -> + Printf.printf " Type: Cell [wire card]\n"; + Printf.printf " Wire: %s\n" + (match wire with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + Printf.printf " Card: %s\n" + (match card with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + + (* For the first event, card is the initial kernel *) + if i = 1 then begin + Printf.printf " → Setting as initial kernel\n"; + kernel := Some card + end + (* For subsequent events, we need to poke the kernel *) + else if i > 1 then begin + match !kernel with + | None -> + Printf.printf " ✗ No kernel to poke yet\n" + + | Some k -> + Printf.printf " → Poking kernel with event\n"; + + try + (* Try to find poke gate at slot 23 *) + let gate = Noun.slot (Z.of_int 23) k in + Printf.printf " Found gate at slot 23\n"; + + (* Build subject: [event gate] *) + let subject = Noun.cell event gate in + + (* Call gate: [9 2 [0 2] [0 3]] *) + let formula = Noun.cell + (Noun.atom 9) + (Noun.cell + (Noun.atom 2) + (Noun.cell + (Noun.cell (Noun.atom 0) (Noun.atom 2)) + (Noun.cell (Noun.atom 0) (Noun.atom 3)))) + in + + Printf.printf " Executing nock...\n%!"; + let start = Unix.gettimeofday () in + let result = Nock.nock_on subject formula in + let elapsed = Unix.gettimeofday () -. start in + Printf.printf " ✓ Completed in %.3fs\n" elapsed; + + (* Result should be [effects new-kernel] *) + begin match result with + | Noun.Cell (_effects, new_kernel) -> + Printf.printf " Result: [effects new_kernel]\n"; + kernel := Some new_kernel + + | Noun.Atom _ -> + Printf.printf " Result: atom (unexpected)\n" + end + + with + | Noun.Exit -> + Printf.printf " ✗ Nock failed (Exit)\n" + | Not_found -> + Printf.printf " ✗ No gate at slot 23\n" + end; + + Printf.printf "\n" + ) event_list; + + (* Check final kernel *) + begin match !kernel with + | None -> + Printf.printf "✗ No final kernel\n" + + | Some k -> + Printf.printf "🎉 Final Arvo kernel ready!\n\n"; + + (* Check for poke interface *) + begin try + let _gate = Noun.slot (Z.of_int 23) k in + Printf.printf "✓ Kernel has poke gate at slot 23\n"; + Printf.printf "\n🚀 ARVO IS READY TO USE!\n" + with _ -> + Printf.printf "✗ No poke gate in final kernel\n" + end + end + + | Noun.Atom _ -> + Printf.printf "✗ Pill is an atom\n" + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Boot Solid Pill Events\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_boot_events diff --git a/ocaml/test/old/test_boot_with_slam.ml b/ocaml/test/old/test_boot_with_slam.ml new file mode 100644 index 0000000..c87c5c8 --- /dev/null +++ b/ocaml/test/old/test_boot_with_slam.ml @@ -0,0 +1,202 @@ +(* Boot Arvo using slam on slot 23 *) + +open Nock_lib + +let slam_on gate event = + (* C Vere slam_on: [battery [new-sample context]] *) + let battery = Noun.head gate in + let context = Noun.tail (Noun.tail gate) in (* slot 7 *) + let new_core = Noun.cell battery (Noun.cell event context) in + + (* Kick arm 2: [9 2 0 1] *) + let kick_formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + + Nock.nock_on new_core kick_formula + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let boot_arvo _env = + Printf.printf "🚀 Booting Arvo with Slot 23 Slam\n\n"; + + (* Load solid pill *) + Printf.printf "Loading solid pill...\n"; + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (_tag, events) -> + let event_list = to_list [] events in + Printf.printf "Found %d events\n\n" (List.length event_list); + + (* Event 1 is the initial kernel *) + let kernel = ref None in + + List.iteri (fun i event -> + Printf.printf "=== Event %d ===\n" i; + + match event with + | Noun.Atom a -> + Printf.printf "Atom: %s\n\n" (Z.to_string a) + + | Noun.Cell _ -> + if i = 1 then begin + (* Event 1: Initial larval kernel *) + Printf.printf "Initial larval kernel\n"; + kernel := Some event; + + (* Verify slot 23 exists *) + begin try + let _poke = Noun.slot (Z.of_int 23) event in + Printf.printf " ✓ Has poke gate at slot 23\n\n" + with _ -> + Printf.printf " ✗ No poke at slot 23\n\n" + end + + end else if i > 2 then begin + (* Events 3-4: Larval initialization events *) + Printf.printf "Boot event (ovum)\n"; + + match !kernel with + | None -> + Printf.printf " ✗ No kernel yet\n\n" + + | Some k -> + begin try + let poke_gate = Noun.slot (Z.of_int 23) k in + + (* Build poke args: [now ovum] *) + (* The event itself should be the ovum [wire card] *) + let now = Noun.atom 0 in + let ovum = event in + let poke_arg = Noun.cell now ovum in + + Printf.printf " → Slamming poke at slot 23...\n"; + let start = Unix.gettimeofday () in + let result = slam_on poke_gate poke_arg in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf " ✓ Poke succeeded in %.4fs!\n" elapsed; + + (* Parse result: [effects new-kernel] *) + begin match result with + | Noun.Cell (_effects, new_kernel) -> + Printf.printf " Result: [effects new-kernel]\n"; + + (* Update kernel *) + kernel := Some new_kernel; + Printf.printf " ✓ Kernel updated\n" + + | Noun.Atom _ -> + Printf.printf " ✗ Result is atom (unexpected)\n" + end; + + Printf.printf "\n" + + with + | Noun.Exit -> + Printf.printf " ✗ Poke failed (Nock Exit)\n\n" + | e -> + Printf.printf " ✗ Error: %s\n\n" (Printexc.to_string e) + end + end else begin + Printf.printf "Separator/other\n\n" + end + ) event_list; + + (* Test final kernel *) + Printf.printf "═══════════════════════════════════════\n\n"; + + begin match !kernel with + | None -> + Printf.printf "✗ No final kernel\n" + + | Some k -> + Printf.printf "🎉 Boot Complete!\n\n"; + + (* Check which slots exist in final kernel *) + Printf.printf "Checking final kernel:\n"; + begin try + let _poke23 = Noun.slot (Z.of_int 23) k in + Printf.printf " ✓ Has slot 23 (larval poke)\n" + with _ -> + Printf.printf " ✗ No slot 23\n" + end; + + begin try + let _poke42 = Noun.slot (Z.of_int 42) k in + Printf.printf " ✓ Has slot 42 (adult poke)\n" + with _ -> + Printf.printf " ✗ No slot 42\n" + end; + + Printf.printf "\nTrying test poke on slot 42...\n"; + + (* Try slot 42 (adult Arvo) *) + begin try + let poke_gate = Noun.slot (Z.of_int 42) k in + let wire = Noun.atom 0 in + let card = Noun.cell (Noun.atom 1953719668) (Noun.atom 42) in + let ovum = Noun.cell wire card in + let now = Noun.atom 0 in + let poke_arg = Noun.cell now ovum in + + Printf.printf " Slamming slot 42...\n"; + let result = slam_on poke_gate poke_arg in + + begin match result with + | Noun.Cell _ -> + Printf.printf " 🎊 SLOT 42 WORKS! ARVO IS RUNNING!\n" + | Noun.Atom _ -> + Printf.printf " Result is atom\n" + end + + with + | Noun.Exit -> + Printf.printf " ✗ Slot 42 poke failed (Nock Exit)\n" + | e -> + Printf.printf " ✗ Error: %s\n" (Printexc.to_string e) + end; + + Printf.printf "\nTrying test poke on slot 23...\n"; + + (* Also try slot 23 *) + begin try + let poke_gate = Noun.slot (Z.of_int 23) k in + let wire = Noun.atom 0 in + let card = Noun.cell (Noun.atom 1953719668) (Noun.atom 42) in + let ovum = Noun.cell wire card in + let now = Noun.atom 0 in + let poke_arg = Noun.cell now ovum in + + Printf.printf " Slamming slot 23...\n"; + let result = slam_on poke_gate poke_arg in + + begin match result with + | Noun.Cell _ -> + Printf.printf " ✓ Slot 23 also works!\n" + | Noun.Atom _ -> + Printf.printf " Result is atom\n" + end + + with + | Noun.Exit -> + Printf.printf " ✗ Slot 23 poke failed (Nock Exit)\n" + | e -> + Printf.printf " ✗ Error: %s\n" (Printexc.to_string e) + end + end + + | Noun.Atom _ -> + Printf.printf "✗ Pill is atom\n" + +let () = + Printf.printf "\n═══════════════════════════════════════════\n"; + Printf.printf " Boot Arvo with Slot 23 Slam\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + Eio_main.run boot_arvo diff --git a/ocaml/test/old/test_brass_cue.ml b/ocaml/test/old/test_brass_cue.ml new file mode 100644 index 0000000..0a431cf --- /dev/null +++ b/ocaml/test/old/test_brass_cue.ml @@ -0,0 +1,89 @@ +(* Test cuing the massive brass/prod pill *) + +open Nock_lib + +let test_brass env = + Printf.printf "🚀 Testing Brass/Prod Pill Cue\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Load brass pill *) + Printf.printf "Loading prod.pill (169 MB - this may take a moment)...\n%!"; + let file_path = Eio.Path.(fs / "prod.pill") in + + let load_start = Unix.gettimeofday () in + let pill_bytes = Eio.Path.load file_path |> Bytes.of_string in + let load_time = Unix.gettimeofday () -. load_start in + + let size_mb = float_of_int (Bytes.length pill_bytes) /. 1024.0 /. 1024.0 in + Printf.printf "✓ Loaded %.1f MB in %.2fs\n\n" size_mb load_time; + + (* Cue with progress *) + Printf.printf "Starting cue (this is 20x bigger than solid pill!)...\n%!"; + + let last_tick = ref (Unix.gettimeofday ()) in + let start = Unix.gettimeofday () in + + let progress ~nouns ~bits ~depth ~max_depth = + let now = Unix.gettimeofday () in + if now -. !last_tick >= 1.0 then begin + let mb = float_of_int bits /. 8.0 /. 1024.0 /. 1024.0 in + let pct = (float_of_int bits /. 8.0) /. float_of_int (Bytes.length pill_bytes) *. 100.0 in + let elapsed = now -. start in + let throughput = mb /. elapsed in + Printf.printf " %.1fs | %.1f MB (%.1f%%) | %dk nouns | depth %d/%d | %.2f MB/s\n%!" + elapsed mb pct (nouns / 1000) depth max_depth throughput; + last_tick := now + end + in + + let pill = Serial.cue ~progress ~progress_interval:100_000 pill_bytes in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf "\n✓ Cued in %.1fs!\n\n" elapsed; + + let throughput = size_mb /. elapsed in + Printf.printf "Performance:\n"; + Printf.printf " Size: %.1f MB\n" size_mb; + Printf.printf " Time: %.1fs\n" elapsed; + Printf.printf " Throughput: %.2f MB/s\n\n" throughput; + + (* Compare to solid pill *) + let solid_time = 1.2 in + let solid_size = 8.7 in + let size_ratio = size_mb /. solid_size in + let time_ratio = elapsed /. solid_time in + + Printf.printf "Comparison to solid pill:\n"; + Printf.printf " Size ratio: %.1fx bigger\n" size_ratio; + Printf.printf " Time ratio: %.1fx slower\n" time_ratio; + Printf.printf " Scaling: %.1f%% linear\n" ((size_ratio /. time_ratio) *. 100.0); + + if time_ratio <= size_ratio *. 1.2 then + Printf.printf "\n🎉 Excellent scaling! Performance is near-linear!\n" + else + Printf.printf "\n⚠️ Non-linear scaling detected\n"; + + (* Check structure *) + Printf.printf "\nExamining structure...\n"; + match pill with + | Noun.Cell (tag, _events) -> + begin match tag with + | Noun.Atom a -> + Printf.printf " Tag: %s (hex: 0x%s)\n" (Z.to_string a) (Z.format "x" a); + if Z.equal a (Z.of_string "1819044208") then + Printf.printf " ✓ Valid 'llip' tag\n" + | _ -> Printf.printf " Tag: cell\n" + end + | _ -> + Printf.printf " ✗ Not a cell\n" + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Brass/Prod Pill Cue Test\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_brass diff --git a/ocaml/test/old/test_clay.ml b/ocaml/test/old/test_clay.ml new file mode 100644 index 0000000..8312f05 --- /dev/null +++ b/ocaml/test/old/test_clay.ml @@ -0,0 +1,243 @@ +(* Test Clay Filesystem Driver *) + +open Io_drivers + +let test_clay_creation _env = + Printf.printf "Test: Clay driver creation...\n"; + + let config = Clay.{ + pier_path = "/tmp/test_clay_pier"; + } in + + let clay = Clay.create config in + let stats = Clay.get_stats clay in + + Printf.printf " Created Clay driver for pier: %s\n" config.pier_path; + Printf.printf " Initial stats - files read: %Ld, written: %Ld\n" + stats.files_read stats.files_written; + + assert (stats.files_read = 0L); + assert (stats.files_written = 0L); + + Printf.printf " ✓ Clay driver creation works!\n\n" + +let test_file_read_write env = + Printf.printf "Test: File read/write...\n"; + + let config = Clay.{ + pier_path = "/tmp/test_clay_pier"; + } in + + let clay = Clay.create config in + + (* Write a file *) + let test_data = Bytes.of_string "Hello, Clay! This is a test file." in + + (match Clay.write_file clay ~env "test.txt" test_data with + | Clay.Success () -> + Printf.printf " Wrote test file\n" + | Clay.Error e -> + Printf.printf " ERROR writing: %s\n" e; + assert false + ); + + (* Read it back *) + (match Clay.read_file clay ~env "test.txt" with + | Clay.Success data -> + Printf.printf " Read test file (%d bytes)\n" (Bytes.length data); + assert (data = test_data); + Printf.printf " ✓ Data matches!\n" + | Clay.Error e -> + Printf.printf " ERROR reading: %s\n" e; + assert false + ); + + (* Check stats *) + let stats = Clay.get_stats clay in + Printf.printf " Stats - read: %Ld, written: %Ld, bytes read: %Ld, bytes written: %Ld\n" + stats.files_read stats.files_written stats.bytes_read stats.bytes_written; + + assert (stats.files_read = 1L); + assert (stats.files_written = 1L); + + Printf.printf " ✓ File read/write works!\n\n" + +let test_directory_operations env = + Printf.printf "Test: Directory operations...\n"; + + let config = Clay.{ + pier_path = "/tmp/test_clay_pier"; + } in + + let clay = Clay.create config in + + (* Create some test files in a directory *) + let test_files = [ + ("subdir/file1.txt", "Content 1"); + ("subdir/file2.txt", "Content 2"); + ("subdir/file3.txt", "Content 3"); + ] in + + List.iter (fun (path, content) -> + match Clay.write_file clay ~env path (Bytes.of_string content) with + | Clay.Success () -> () + | Clay.Error e -> + Printf.printf " ERROR: %s\n" e; + assert false + ) test_files; + + Printf.printf " Created %d test files in subdir/\n" (List.length test_files); + + (* List directory *) + (match Clay.list_directory clay ~env "subdir" with + | Clay.Success entries -> + Printf.printf " Directory listing (%d entries):\n" (List.length entries); + List.iter (fun entry -> + Printf.printf " - %s\n" entry + ) entries; + + assert (List.length entries = 3); + Printf.printf " ✓ All files found!\n" + + | Clay.Error e -> + Printf.printf " ERROR listing directory: %s\n" e; + assert false + ); + + Printf.printf " ✓ Directory operations work!\n\n" + +let test_parallel_operations env = + Printf.printf "Test: Parallel file operations (THE SPEEDUP!)...\n"; + + Eio.Switch.run @@ fun sw -> + + let config = Clay.{ + pier_path = "/tmp/test_clay_pier"; + } in + + let clay = Clay.create config in + + (* Create many test files to demonstrate parallel I/O *) + let num_files = 50 in + Printf.printf " Creating %d test files for parallel operations...\n" num_files; + + let test_files = List.init num_files (fun i -> + let path = Printf.sprintf "parallel/file_%03d.txt" i in + let content = Printf.sprintf "This is test file number %d with some content" i in + (path, Bytes.of_string content) + ) in + + (* Sequential write for comparison *) + Printf.printf "\n Sequential write test:\n"; + let seq_start = Unix.gettimeofday () in + List.iter (fun (path, data) -> + match Clay.write_file clay ~env path data with + | Clay.Success () -> () + | Clay.Error _ -> () + ) test_files; + let seq_time = Unix.gettimeofday () -. seq_start in + Printf.printf " Wrote %d files in %.4fs (%.0f files/sec)\n" + num_files seq_time (float_of_int num_files /. seq_time); + + (* Parallel write - THE INNOVATION! *) + Printf.printf "\n Parallel write test:\n"; + let par_start = Unix.gettimeofday () in + let _ = Clay.parallel_write clay ~env ~sw test_files in + let par_time = Unix.gettimeofday () -. par_start in + + let speedup = seq_time /. par_time in + Printf.printf " 💥 SPEEDUP: %.2fx faster than sequential!\n" speedup; + + (* Parallel read test *) + Printf.printf "\n Parallel read test:\n"; + let paths = List.map fst test_files in + let results = Clay.parallel_read clay ~env ~sw paths in + + Printf.printf " Successfully read %d/%d files\n" + (List.length results) (List.length paths); + + let stats = Clay.get_stats clay in + Printf.printf "\n Final stats:\n"; + Printf.printf " Files read: %Ld\n" stats.files_read; + Printf.printf " Files written: %Ld\n" stats.files_written; + Printf.printf " Bytes read: %Ld\n" stats.bytes_read; + Printf.printf " Bytes written: %Ld\n" stats.bytes_written; + + Printf.printf " ✓ Parallel operations work (and are FAST!)!\n\n" + +let test_batch_copy env = + Printf.printf "Test: Batch copy operations...\n"; + + Eio.Switch.run @@ fun sw -> + + let config = Clay.{ + pier_path = "/tmp/test_clay_pier"; + } in + + let clay = Clay.create config in + + (* Create source files *) + let source_files = List.init 10 (fun i -> + Printf.sprintf "batch_src/file_%d.txt" i + ) in + + List.iter (fun path -> + let content = Bytes.of_string (Printf.sprintf "Content of %s" path) in + match Clay.write_file clay ~env path content with + | Clay.Success () -> () + | Clay.Error _ -> () + ) source_files; + + Printf.printf " Created %d source files\n" (List.length source_files); + + (* Batch copy *) + (match Clay.batch_copy clay ~env ~sw source_files "batch_dest" with + | Clay.Success count -> + Printf.printf " Copied %d files in batch\n" count; + assert (count = List.length source_files) + | Clay.Error e -> + Printf.printf " ERROR: %s\n" e; + assert false + ); + + Printf.printf " ✓ Batch copy works!\n\n" + +let test_recursive_scan env = + Printf.printf "Test: Recursive directory scan...\n"; + + let config = Clay.{ + pier_path = "/tmp/test_clay_pier"; + } in + + let clay = Clay.create config in + + (* Scan entire pier *) + let all_files = Clay.scan_directory clay ~env "" in + + Printf.printf " Found %d files total in pier\n" (List.length all_files); + Printf.printf " First 10 files:\n"; + List.iteri (fun i file -> + if i < 10 then Printf.printf " %s\n" file + ) all_files; + + Printf.printf " ✓ Recursive scan works!\n\n" + +let () = + Printf.printf "\n🚀🚀🚀 === CLAY FILESYSTEM TESTS === 🚀🚀🚀\n\n"; + + Eio_main.run @@ fun env -> + test_clay_creation env; + test_file_read_write env; + test_directory_operations env; + test_parallel_operations env; + test_batch_copy env; + test_recursive_scan env; + + Printf.printf "🎉🎉🎉 === ALL CLAY TESTS PASSED! === 🎉🎉🎉\n\n"; + Printf.printf "Clay filesystem driver is working!\n"; + Printf.printf "- Async file read/write ✓\n"; + Printf.printf "- Directory operations ✓\n"; + Printf.printf "- PARALLEL file I/O (MASSIVE SPEEDUP!) ✓\n"; + Printf.printf "- Batch copy operations ✓\n"; + Printf.printf "- Recursive directory scanning ✓\n"; + Printf.printf "\n💥 C Vere blocking I/O < Overe async parallel I/O! 💥\n" diff --git a/ocaml/test/old/test_correct_boot.ml b/ocaml/test/old/test_correct_boot.ml new file mode 100644 index 0000000..c778d1b --- /dev/null +++ b/ocaml/test/old/test_correct_boot.ml @@ -0,0 +1,131 @@ +(* Boot using the CORRECT C Vere pattern: compute gates from formulas *) + +open Nock_lib + +let slam_on gate event = + let battery = Noun.head gate in + let context = Noun.tail (Noun.tail gate) in + let new_core = Noun.cell battery (Noun.cell event context) in + let kick_formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + Nock.nock_on new_core kick_formula + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let boot _env = + Printf.printf "🚀 Booting Arvo with CORRECT C Vere Pattern\n\n"; + + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (_tag, events) -> + let event_list = to_list [] events in + let kernel = ref (List.nth event_list 1) in + + Printf.printf "Initial kernel loaded\n\n"; + + (* Process Events 3 and 4 *) + List.iteri (fun i event -> + if i >= 3 && i <= 4 then begin + Printf.printf "═══ Event %d ═══\n" i; + + (* Step 1: Get formula at slot 23 *) + Printf.printf "Step 1: Get formula at slot 23...\n"; + let slot_23_formula = Noun.slot (Z.of_int 23) !kernel in + Printf.printf " ✓ Got formula\n"; + + (* Step 2: Compute poke gate by running formula *) + Printf.printf "Step 2: Compute poke gate...\n"; + let start_compute = Unix.gettimeofday () in + let poke_gate = Nock.nock_on !kernel slot_23_formula in + let elapsed_compute = Unix.gettimeofday () -. start_compute in + Printf.printf " ✓ Computed in %.4fs\n" elapsed_compute; + + (* Step 3: Slam the computed gate *) + Printf.printf "Step 3: Slam poke gate...\n"; + let now = Noun.atom 0 in + let poke_arg = Noun.cell now event in + + let start_slam = Unix.gettimeofday () in + begin try + let result = slam_on poke_gate poke_arg in + let elapsed_slam = Unix.gettimeofday () -. start_slam in + + Printf.printf " ✓ Slam succeeded in %.4fs!\n" elapsed_slam; + + (* Parse result *) + begin match result with + | Noun.Cell (_effects, new_kernel) -> + Printf.printf " Result: [effects new-kernel]\n"; + kernel := new_kernel; + Printf.printf " ✓ Kernel updated\n\n" + | Noun.Atom _ -> + Printf.printf " ✗ Result is atom\n\n" + end + + with + | Noun.Exit -> + Printf.printf " ✗ Slam failed (Nock Exit)\n\n" + | e -> + Printf.printf " ✗ Error: %s\n\n" (Printexc.to_string e) + end + end + ) event_list; + + (* Test final kernel *) + Printf.printf "═══════════════════════════════════════\n"; + Printf.printf " Testing Final Kernel\n"; + Printf.printf "═══════════════════════════════════════\n\n"; + + Printf.printf "Computing poke gate from slot 23...\n"; + begin try + let slot_23_formula = Noun.slot (Z.of_int 23) !kernel in + let poke_gate = Nock.nock_on !kernel slot_23_formula in + Printf.printf "✓ Computed poke gate\n\n"; + + Printf.printf "Testing with [0 [%%test 42]]...\n"; + let wire = Noun.atom 0 in + let card = Noun.cell (Noun.atom 1953719668) (Noun.atom 42) in + let ovum = Noun.cell wire card in + let now = Noun.atom 0 in + let poke_arg = Noun.cell now ovum in + + let result = slam_on poke_gate poke_arg in + + begin match result with + | Noun.Cell _ -> + Printf.printf "✓ Test poke succeeded!\n\n"; + Printf.printf "═══════════════════════════════════════\n"; + Printf.printf " 🎉 ARVO IS FULLY BOOTED! 🎉\n"; + Printf.printf "═══════════════════════════════════════\n\n"; + Printf.printf "Boot sequence complete:\n"; + Printf.printf " 1. Event 1: Initial kernel\n"; + Printf.printf " 2. Event 3: Boot initialization\n"; + Printf.printf " 3. Event 4: Final setup\n"; + Printf.printf " 4. Test poke: SUCCESS\n\n"; + Printf.printf "The kernel is ready to receive events!\n" + | Noun.Atom _ -> + Printf.printf "Result is atom\n" + end + + with + | Noun.Exit -> + Printf.printf "✗ Test poke failed\n" + | e -> + Printf.printf "✗ Error: %s\n" (Printexc.to_string e) + end + + | Noun.Atom _ -> + Printf.printf "Pill is atom\n" + +let () = + Printf.printf "\n═══════════════════════════════════════\n"; + Printf.printf " Boot with Correct C Vere Pattern\n"; + Printf.printf "═══════════════════════════════════════\n\n"; + Eio_main.run boot diff --git a/ocaml/test/old/test_cvere_poke.ml b/ocaml/test/old/test_cvere_poke.ml new file mode 100644 index 0000000..28b0c78 --- /dev/null +++ b/ocaml/test/old/test_cvere_poke.ml @@ -0,0 +1,105 @@ +(* Test C Vere Poke Pattern + * + * Implement the exact poke sequence from C Vere: + * 1. Get slot 23 from Arvo core (poke formula) + * 2. Run Nock to compute the poke gate + * 3. Slam: build [battery [event context]] and call arm 2 + *) + +open Nock_lib + +let slam_on gate event = + (* C Vere slam_on: u3nc(u3k(u3h(gat)), u3nc(sam, u3k(u3t(u3t(gat))))) *) + (* Build: [battery [new-sample context]] *) + let battery = Noun.head gate in + let context = Noun.tail (Noun.tail gate) in (* slot 7 *) + let new_core = Noun.cell battery (Noun.cell event context) in + + (* Kick: call arm 2 *) + let kick_formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + + Nock.nock_on new_core kick_formula + +let test_cvere_poke env = + Printf.printf "🎯 Testing C Vere Poke Pattern\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Load ivory pill *) + let state = State.create () in + match Boot.boot_from_file ~fs state "ivory.pill" with + | Error msg -> + Printf.printf "✗ Failed to load pill: %s\n%!" msg + | Ok () -> + let pill_root = State.get_arvo state in + + Printf.printf "Step 0: Navigate to real Arvo core\n"; + Printf.printf " Path: [3 3 2 3 2 3 3 2]\n"; + + (* Navigate to real Arvo *) + let path = [3; 3; 2; 3; 2; 3; 3; 2] in + let rec navigate noun = function + | [] -> noun + | slot :: rest -> + navigate (Noun.slot (Z.of_int slot) noun) rest + in + let arvo = navigate pill_root path in + Printf.printf " ✓ Found real Arvo core\n\n"; + + Printf.printf "Step 1: Get slot 23 from Arvo core\n"; + let slot_23_formula = Noun.slot (Z.of_int 23) arvo in + Printf.printf " ✓ Got formula from slot 23\n\n"; + + Printf.printf "Step 2: Run Nock to compute poke gate\n"; + Printf.printf " Subject: Arvo core\n"; + Printf.printf " Formula: slot 23 contents\n"; + + let poke_gate = Nock.nock_on arvo slot_23_formula in + Printf.printf " ✓ Computed poke gate\n\n"; + + Printf.printf "Step 3: Create test event (ovum)\n"; + let event = Noun.cell (Noun.atom 0) (Noun.atom 42) in + Printf.printf " Event: [0 42]\n\n"; + + Printf.printf "Step 4: Slam poke gate with event\n"; + Printf.printf " Building: [battery [event context]]\n"; + Printf.printf " Calling: arm 2\n\n"; + + let start = Unix.gettimeofday () in + (try + let result = slam_on poke_gate event in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf "🎉 POKE SUCCEEDED in %.4fs!\n\n" elapsed; + + (* Result should be [effects new-core] *) + if Noun.is_cell result then begin + Printf.printf "Result structure: Cell\n"; + let effects = Noun.head result in + let new_core = Noun.tail result in + + Printf.printf " Effects: %s\n" + (if Noun.is_cell effects then "Cell (list)" else "Atom"); + Printf.printf " New core: %s\n" + (if Noun.is_cell new_core then "Cell (updated Arvo)" else "Atom"); + + Printf.printf "\n✨ ARVO IS RUNNING!\n"; + Printf.printf "We can now poke Arvo with events!\n" + end else + Printf.printf "Result is atom (unexpected)\n" + + with e -> + Printf.printf "✗ Poke failed: %s\n" (Printexc.to_string e); + Printf.printf "Stack trace:\n%s\n" (Printexc.get_backtrace ())) + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Testing C Vere Poke Pattern on Arvo\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_cvere_poke diff --git a/ocaml/test/old/test_dill_iris.ml b/ocaml/test/old/test_dill_iris.ml new file mode 100644 index 0000000..ed974ae --- /dev/null +++ b/ocaml/test/old/test_dill_iris.ml @@ -0,0 +1,98 @@ +(* Test Dill and Iris Drivers *) + +open Io_drivers + +let test_dill_creation _env = + Printf.printf "Test: Dill driver creation...\n"; + + let config = Dill.{ + prompt = "~zod:dojo>"; + } in + + let dill = Dill.create config in + let stats = Dill.get_stats dill in + + Printf.printf " Created Dill driver with prompt: %s\n" config.prompt; + Printf.printf " Initial stats - lines read: %Ld, written: %Ld\n" + stats.lines_read stats.lines_written; + + assert (stats.lines_read = 0L); + assert (stats.lines_written = 0L); + + Printf.printf " ✓ Dill driver creation works!\n\n" + +let test_dill_output env = + Printf.printf "Test: Dill terminal output...\n"; + + let config = Dill.{ + prompt = "~zod:dojo>"; + } in + + let dill = Dill.create config in + + (* Write some output *) + Dill.write_output dill ~env "Hello from Dill!\n"; + Dill.write_output dill ~env "Terminal output is working!\n"; + + let stats = Dill.get_stats dill in + Printf.printf " Stats - lines written: %Ld, bytes written: %Ld\n" + stats.lines_written stats.bytes_written; + + assert (stats.lines_written = 2L); + + Printf.printf " ✓ Terminal output works!\n\n" + +let test_iris_creation _env = + Printf.printf "Test: Iris driver creation...\n"; + + let iris = Iris.create () in + let stats = Iris.get_stats iris in + + Printf.printf " Created Iris HTTP client driver\n"; + Printf.printf " Initial stats - requests: %Ld, active: %d\n" + stats.requests_total stats.requests_active; + + assert (stats.requests_total = 0L); + assert (stats.requests_active = 0); + + Printf.printf " ✓ Iris driver creation works!\n\n" + +let test_iris_url_parsing _env = + Printf.printf "Test: URL parsing...\n"; + + let test_cases = [ + ("http://example.com/path", "example.com", "/path"); + ("https://api.github.com/users", "api.github.com", "/users"); + ("http://localhost", "localhost", "/"); + ] in + + List.iter (fun (url, expected_host, expected_path) -> + let (host, path) = Iris.parse_url url in + Printf.printf " URL: %s -> host: %s, path: %s\n" url host path; + assert (host = expected_host); + assert (path = expected_path) + ) test_cases; + + Printf.printf " ✓ URL parsing works!\n\n" + +let () = + Printf.printf "\n🚀🚀🚀 === DILL & IRIS TESTS === 🚀🚀🚀\n\n"; + + Eio_main.run @@ fun env -> + test_dill_creation env; + test_dill_output env; + test_iris_creation env; + test_iris_url_parsing env; + + Printf.printf "🎉🎉🎉 === ALL DILL & IRIS TESTS PASSED! === 🎉🎉🎉\n\n"; + Printf.printf "Terminal and HTTP client drivers are working!\n"; + Printf.printf "\nDill (Terminal):\n"; + Printf.printf "- Driver creation ✓\n"; + Printf.printf "- Terminal output ✓\n"; + Printf.printf "- Async I/O ready for input fiber ✓\n"; + Printf.printf "\nIris (HTTP Client):\n"; + Printf.printf "- Driver creation ✓\n"; + Printf.printf "- URL parsing ✓\n"; + Printf.printf "- Async HTTP requests ready ✓\n"; + Printf.printf "\n🎉 ALL I/O DRIVERS COMPLETE! 🎉\n"; + Printf.printf "Ready to run a full Arvo kernel!\n" diff --git a/ocaml/test/old/test_event4_slot42.ml b/ocaml/test/old/test_event4_slot42.ml new file mode 100644 index 0000000..ce98863 --- /dev/null +++ b/ocaml/test/old/test_event4_slot42.ml @@ -0,0 +1,104 @@ +(* Test Event 4 using slot 42 instead of slot 23 *) + +open Nock_lib + +let slam_on gate event = + let battery = Noun.head gate in + let context = Noun.tail (Noun.tail gate) in + let new_core = Noun.cell battery (Noun.cell event context) in + let kick_formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + Nock.nock_on new_core kick_formula + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let test _env = + Printf.printf "🚀 Testing Event 4 with Slot 42\n\n"; + + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (_tag, events) -> + let event_list = to_list [] events in + + let kernel1 = List.nth event_list 1 in + let event3 = List.nth event_list 3 in + let event4 = List.nth event_list 4 in + + (* Slam Event 3 with slot 23 *) + Printf.printf "=== Event 3 (slot 23) ===\n"; + let poke_gate3 = Noun.slot (Z.of_int 23) kernel1 in + let result3 = slam_on poke_gate3 (Noun.cell (Noun.atom 0) event3) in + + let kernel_after_3 = match result3 with + | Noun.Cell (_effects, new_kernel) -> + Printf.printf "✓ Succeeded\n\n"; + new_kernel + | _ -> kernel1 + in + + (* Try Event 4 with SLOT 42 *) + Printf.printf "=== Event 4 (slot 42) ===\n"; + begin try + let poke_gate4 = Noun.slot (Z.of_int 42) kernel_after_3 in + Printf.printf "✓ Found poke gate at slot 42\n"; + + (* Check gate structure *) + begin match poke_gate4 with + | Noun.Cell (battery, payload) -> + Printf.printf " Battery: %s\n" (match battery with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + begin match payload with + | Noun.Cell (_sample, _context) -> + Printf.printf " Payload: cell [sample context] ✓\n\n" + | _ -> + Printf.printf " Payload: atom ✗\n\n" + end + | _ -> () + end; + + Printf.printf "Slamming Event 4...\n"; + let start = Unix.gettimeofday () in + let result4 = slam_on poke_gate4 (Noun.cell (Noun.atom 0) event4) in + let elapsed = Unix.gettimeofday () -. start in + + begin match result4 with + | Noun.Cell (_effects, _new_kernel) -> + Printf.printf "✓ Event 4 succeeded in %.4fs!\n\n" elapsed; + Printf.printf "═══════════════════════════════════════════\n"; + Printf.printf " 🎉🎉🎉 FULL BOOT SUCCESS! 🎉🎉🎉\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + Printf.printf "Boot sequence:\n"; + Printf.printf " 1. Event 1: Initial larval kernel\n"; + Printf.printf " 2. Event 3: Poked with slot 23 (larval)\n"; + Printf.printf " 3. Kernel metamorphosed!\n"; + Printf.printf " 4. Event 4: Poked with slot 42 (adult)\n\n"; + Printf.printf "The kernel has metamorphosed from larval to adult!\n"; + Printf.printf " - Larval poke: slot 23\n"; + Printf.printf " - Adult poke: slot 42\n" + | Noun.Atom _ -> + Printf.printf "Result is atom\n" + end + + with + | Noun.Exit -> + Printf.printf "✗ Still failed with slot 42\n" + | Not_found -> + Printf.printf "✗ No slot 42 found\n" + | e -> + Printf.printf "✗ Error: %s\n" (Printexc.to_string e) + end + + | Noun.Atom _ -> + Printf.printf "Pill is atom\n" + +let () = + Printf.printf "\n═══════════════════════════════════════════\n"; + Printf.printf " Test Event 4 with Slot 42\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + Eio_main.run test diff --git a/ocaml/test/old/test_eventlog.ml b/ocaml/test/old/test_eventlog.ml new file mode 100644 index 0000000..fd0e496 --- /dev/null +++ b/ocaml/test/old/test_eventlog.ml @@ -0,0 +1,155 @@ +(* Event Log Tests - Eio-based event persistence testing + * + * Tests: + * 1. Basic append and read + * 2. Jam/cue roundtrip through event log + * 3. Replay functionality + * 4. Multiple events in sequence + *) + +open Nock_lib + +let test_basic_append env = + Printf.printf "Test: Basic append and read...\n"; + Eio.Switch.run @@ fun sw -> + let fs = Eio.Stdenv.fs env in + + (* Create event log in tmp directory *) + let log = Eventlog.create ~sw ~fs "tmp/test_eventlog" in + + (* Create a simple noun *) + let noun1 = Noun.atom 42 in + + (* Append event *) + let event_num = Eventlog.append log ~sw noun1 in + Printf.printf " Appended event %Ld\n" event_num; + + (* Read it back *) + let noun2 = Eventlog.read_event log event_num in + Printf.printf " Read back event %Ld\n" event_num; + + (* Verify they match *) + if noun1 = noun2 then + Printf.printf " ✓ Basic append/read works!\n\n" + else + failwith "Noun mismatch!" + +let test_jam_cue_roundtrip env = + Printf.printf "Test: Jam/cue roundtrip through event log...\n"; + Eio.Switch.run @@ fun sw -> + let fs = Eio.Stdenv.fs env in + + (* Create event log *) + let log = Eventlog.create ~sw ~fs "tmp/test_eventlog_jam" in + + (* Create various nouns *) + let test_cases = [ + ("atom 0", Noun.atom 0); + ("atom 42", Noun.atom 42); + ("atom 1000000", Noun.atom 1000000); + ("cell [1 2]", Noun.cell (Noun.atom 1) (Noun.atom 2)); + ("nested [[1 2] [3 4]]", + Noun.cell + (Noun.cell (Noun.atom 1) (Noun.atom 2)) + (Noun.cell (Noun.atom 3) (Noun.atom 4))); + ] in + + List.iter (fun (name, noun) -> + let event_num = Eventlog.append log ~sw noun in + let recovered = Eventlog.read_event log event_num in + if noun = recovered then + Printf.printf " ✓ %s: roundtrip OK (event %Ld)\n" name event_num + else + failwith (Printf.sprintf "%s: roundtrip FAILED" name) + ) test_cases; + + Printf.printf "\n" + +let test_replay env = + Printf.printf "Test: Event replay...\n"; + Eio.Switch.run @@ fun sw -> + let fs = Eio.Stdenv.fs env in + + (* Create event log *) + let log = Eventlog.create ~sw ~fs "tmp/test_eventlog_replay" in + + (* Append several events *) + let nouns = [ + Noun.atom 1; + Noun.atom 2; + Noun.atom 3; + Noun.cell (Noun.atom 4) (Noun.atom 5); + ] in + + List.iter (fun noun -> + let _ = Eventlog.append log ~sw noun in + () + ) nouns; + + Printf.printf " Appended %d events\n" (List.length nouns); + + (* Create new log instance to test replay *) + let log2 = Eventlog.create ~sw ~fs "tmp/test_eventlog_replay" in + + (* Replay events *) + let replayed = ref [] in + Eventlog.replay log2 ~sw (fun num noun -> + Printf.printf " Replayed event %Ld\n" num; + replayed := noun :: !replayed + ); + + let replayed_list = List.rev !replayed in + + (* Verify all events were replayed correctly *) + if List.length replayed_list = List.length nouns then + Printf.printf " ✓ Replayed %d events correctly\n" (List.length nouns) + else + failwith (Printf.sprintf "Expected %d events, got %d" + (List.length nouns) (List.length replayed_list)); + + (* Verify content matches *) + List.iter2 (fun original replayed -> + if original <> replayed then + failwith "Replayed noun doesn't match original" + ) nouns replayed_list; + + Printf.printf " ✓ All replayed events match originals\n\n" + +let test_event_count env = + Printf.printf "Test: Event counting...\n"; + Eio.Switch.run @@ fun sw -> + let fs = Eio.Stdenv.fs env in + + let log = Eventlog.create ~sw ~fs "tmp/test_eventlog_count" in + + (* Initially should have 0 events *) + let count0 = Eventlog.event_count log in + Printf.printf " Initial count: %d\n" count0; + + (* Append 5 events *) + for i = 1 to 5 do + let _ = Eventlog.append log ~sw (Noun.atom i) in + () + done; + + let count5 = Eventlog.event_count log in + Printf.printf " After 5 appends: %d\n" count5; + + if count5 = 5 then + Printf.printf " ✓ Event count correct\n\n" + else + failwith (Printf.sprintf "Expected 5 events, got %d" count5) + +let () = + Eio_main.run @@ fun env -> + Printf.printf "\n=== Event Log Tests (Eio-based) ===\n\n"; + + (* Clean up old test directories *) + (try Unix.system "rm -rf tmp/test_eventlog*" |> ignore with _ -> ()); + + test_basic_append env; + test_jam_cue_roundtrip env; + test_replay env; + test_event_count env; + + Printf.printf "=== All tests passed! ✓ ===\n" diff --git a/ocaml/test/old/test_functional_bios.ml b/ocaml/test/old/test_functional_bios.ml new file mode 100644 index 0000000..5679c3f --- /dev/null +++ b/ocaml/test/old/test_functional_bios.ml @@ -0,0 +1,132 @@ +(* Test the functional BIOS formula [2 [0 3] [0 2]] on event list *) + +open Nock_lib + +let test_bios _env = + Printf.printf "🚀 Testing Functional BIOS Formula\n\n"; + + (* Load solid pill *) + Printf.printf "Loading solid pill...\n"; + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (_tag, events) -> + Printf.printf "Found events\n\n"; + + (* Build the functional BIOS formula: [2 [0 3] [0 2]] *) + Printf.printf "Building functional BIOS formula: [2 [0 3] [0 2]]\n"; + let bios_formula = Noun.cell + (Noun.atom 2) + (Noun.cell + (Noun.cell (Noun.atom 0) (Noun.atom 3)) + (Noun.cell (Noun.atom 0) (Noun.atom 2))) + in + Printf.printf "Formula: %s\n\n" + (match bios_formula with Noun.Cell _ -> "built" | _ -> "error"); + + (* Run the formula on the event list! *) + Printf.printf "Running formula on entire event list...\n"; + Printf.printf "(This processes ALL 5 events at once!)\n\n"; + + let start = Unix.gettimeofday () in + + begin try + let result = Nock.nock_on events bios_formula in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf "✓ Formula succeeded in %.4fs!\n\n" elapsed; + + (* Extract slot 7 from result *) + Printf.printf "Extracting slot 7 from result...\n"; + begin try + let kernel = Noun.slot (Z.of_int 7) result in + Printf.printf "✓ Got kernel at slot 7!\n\n"; + + (* Check what slots this kernel has *) + Printf.printf "Checking kernel slots:\n"; + + begin try + let _poke23 = Noun.slot (Z.of_int 23) kernel in + Printf.printf " ✓ Has slot 23 (larval poke)\n" + with _ -> + Printf.printf " ✗ No slot 23\n" + end; + + begin try + let _poke42 = Noun.slot (Z.of_int 42) kernel in + Printf.printf " ✓ Has slot 42 (adult poke)\n" + with _ -> + Printf.printf " ✗ No slot 42\n" + end; + + Printf.printf "\n🎉 FUNCTIONAL BIOS BOOT COMPLETE!\n\n"; + + (* Try a test poke on slot 42 *) + Printf.printf "Testing poke on slot 42...\n"; + + begin try + let poke_gate = Noun.slot (Z.of_int 42) kernel in + + (* Build test event *) + let wire = Noun.atom 0 in + let card = Noun.cell (Noun.atom 1953719668) (Noun.atom 42) in + let ovum = Noun.cell wire card in + let now = Noun.atom 0 in + let poke_arg = Noun.cell now ovum in + + (* Slam *) + let battery = Noun.head poke_gate in + let context = Noun.tail (Noun.tail poke_gate) in + let new_core = Noun.cell battery (Noun.cell poke_arg context) in + let kick_formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + + let poke_result = Nock.nock_on new_core kick_formula in + + begin match poke_result with + | Noun.Cell (_effects, _new_kernel) -> + Printf.printf " 🎊 SLOT 42 POKE WORKS!\n\n"; + Printf.printf "═══════════════════════════════════════════\n"; + Printf.printf " ARVO IS FULLY BOOTED AND OPERATIONAL!\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + Printf.printf "This means we can now:\n"; + Printf.printf " ✅ Run the functional BIOS formula\n"; + Printf.printf " ✅ Extract the booted kernel\n"; + Printf.printf " ✅ Poke events into Arvo\n"; + Printf.printf " ✅ Build a complete Urbit runtime!\n" + | Noun.Atom _ -> + Printf.printf " Result is atom\n" + end + + with + | Noun.Exit -> + Printf.printf " ✗ Poke failed (Nock Exit)\n" + | e -> + Printf.printf " ✗ Error: %s\n" (Printexc.to_string e) + end + + with + | Not_found -> + Printf.printf "✗ No slot 7 in result\n" + | e -> + Printf.printf "✗ Error accessing slot 7: %s\n" (Printexc.to_string e) + end + + with + | Noun.Exit -> + Printf.printf "✗ Formula failed (Nock Exit)\n" + | e -> + Printf.printf "✗ Error: %s\n" (Printexc.to_string e) + end + + | Noun.Atom _ -> + Printf.printf "✗ Pill is atom\n" + +let () = + Printf.printf "\n═══════════════════════════════════════════\n"; + Printf.printf " Test Functional BIOS Formula\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + Eio_main.run test_bios diff --git a/ocaml/test/old/test_hex.ml b/ocaml/test/old/test_hex.ml new file mode 100644 index 0000000..a228682 --- /dev/null +++ b/ocaml/test/old/test_hex.ml @@ -0,0 +1,26 @@ +open Nock_lib.Noun +open Nock_lib.Serial + +let () = + for i = 0 to 10 do + let n = atom i in + let jammed = jam n in + Printf.printf "jam(%d) = %s (%d bytes)\n" i (bytes_to_hex jammed) (Bytes.length jammed) + done + +let () = + Printf.printf "\nRound-trip tests:\n"; + for i = 0 to 50 do + let n = atom i in + let jammed = jam n in + let cued = cue jammed in + match cued with + | Atom a when Z.equal a (Z.of_int i) -> + Printf.printf "OK: %d\n" i + | Atom a -> + Printf.printf "FAIL: %d -> %s\n" i (Z.to_string a); + exit 1 + | Cell _ -> + Printf.printf "FAIL: %d -> cell\n" i; + exit 1 + done diff --git a/ocaml/test/old/test_http.ml b/ocaml/test/old/test_http.ml new file mode 100644 index 0000000..0649a86 --- /dev/null +++ b/ocaml/test/old/test_http.ml @@ -0,0 +1,186 @@ +(* Test Eyre HTTP Server Driver *) + +open Io_drivers + +let test_http_creation _env = + Printf.printf "Test: HTTP server creation...\n"; + + let config = Http.{ + port = 8080; + host = "localhost"; + } in + + let eyre = Http.create config in + let stats = Http.get_stats eyre in + + Printf.printf " Created HTTP server for %s:%d\n" config.host config.port; + Printf.printf " Initial stats - requests: %Ld, active: %d\n" + stats.requests_total stats.requests_active; + + assert (stats.requests_total = 0L); + assert (stats.requests_active = 0); + + Printf.printf " ✓ HTTP server creation works!\n\n" + +let test_http_request_parsing _env = + Printf.printf "Test: HTTP request parsing...\n"; + + (* Test simple GET request *) + let get_request = "GET /index.html HTTP/1.1\r\nHost: localhost\r\nUser-Agent: test\r\n\r\n" in + + (match Http.parse_request get_request with + | Ok req -> + Printf.printf " Parsed GET request:\n"; + Printf.printf " Method: %s\n" (Http.method_to_string req.method_); + Printf.printf " Path: %s\n" req.path; + Printf.printf " Version: %s\n" req.version; + Printf.printf " Headers: %d\n" (List.length req.headers); + + assert (req.method_ = Http.GET); + assert (req.path = "/index.html"); + assert (req.version = "HTTP/1.1") + + | Error err -> + Printf.printf " ERROR: %s\n" err; + assert false + ); + + (* Test POST request *) + let post_request = "POST /api/data HTTP/1.1\r\nContent-Length: 13\r\n\r\nHello, World!" in + + (match Http.parse_request post_request with + | Ok req -> + Printf.printf " Parsed POST request:\n"; + Printf.printf " Method: %s\n" (Http.method_to_string req.method_); + Printf.printf " Path: %s\n" req.path; + + assert (req.method_ = Http.POST); + assert (req.path = "/api/data") + + | Error err -> + Printf.printf " ERROR: %s\n" err; + assert false + ); + + Printf.printf " ✓ HTTP request parsing works!\n\n" + +let test_http_response_generation _env = + Printf.printf "Test: HTTP response generation...\n"; + + let response = Http.{ + status = 200; + status_text = "OK"; + headers = [ + ("Content-Type", "text/plain"); + ("Content-Length", "5"); + ]; + body = Bytes.of_string "Hello"; + } in + + let response_bytes = Http.generate_response response in + let response_str = Bytes.to_string response_bytes in + + Printf.printf " Generated response (%d bytes):\n" (Bytes.length response_bytes); + Printf.printf "%s\n" response_str; + + assert (String.starts_with ~prefix:"HTTP/1.1 200 OK" response_str); + assert (String.contains response_str '\n'); + + Printf.printf " ✓ HTTP response generation works!\n\n" + +let _test_http_server env = + Printf.printf "Test: HTTP server with client connection...\n"; + + let result = ref None in + + (* Use fiber to run client test with timeout *) + Eio.Switch.run @@ fun sw -> + + (* Create event stream for runtime *) + let event_stream = Eio.Stream.create 100 in + + let config = Http.{ + port = 9876; + host = "localhost"; + } in + + let eyre = Http.create config in + + Printf.printf " Starting HTTP server\n"; + + (* Run HTTP server (spawns accept fiber) *) + Http.run eyre ~env ~sw ~event_stream; + + (* Give server time to start *) + Eio.Time.sleep (Eio.Stdenv.clock env) 0.1; + + Printf.printf " Connecting to HTTP server...\n"; + + (* Run client test in fiber that will complete and allow switch to close *) + Eio.Fiber.fork ~sw (fun () -> + let net = Eio.Stdenv.net env in + let addr = `Tcp (Eio.Net.Ipaddr.V4.loopback, config.port) in + + let flow = Eio.Net.connect ~sw net addr in + + Printf.printf " Connected! Sending GET request...\n"; + + (* Send HTTP GET request *) + let request = "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n" in + Eio.Flow.write flow [Cstruct.of_string request]; + + (* Read response *) + let buf = Cstruct.create 4096 in + let recv_len = Eio.Flow.single_read flow buf in + let response = Cstruct.to_string (Cstruct.sub buf 0 recv_len) in + + Printf.printf " Received response (%d bytes):\n" recv_len; + let lines = String.split_on_char '\n' response in + List.iteri (fun i line -> + if i < 5 then (* Print first 5 lines *) + Printf.printf " %s\n" line + ) lines; + + assert (String.starts_with ~prefix:"HTTP/1.1 200 OK" response); + assert (String.contains response 'r'); + + Printf.printf " ✓ Received valid HTTP response!\n"; + + (* Check stats *) + let stats = Http.get_stats eyre in + Printf.printf " Final stats - requests: %Ld, active: %d\n" + stats.requests_total stats.requests_active; + + result := Some (); + ); + + (* Wait for client test to complete *) + Eio.Time.sleep (Eio.Stdenv.clock env) 0.3; + + (* Test completed, switch will close and cancel accept fiber *) + (match !result with + | Some () -> () + | None -> failwith "Client test did not complete" + ); + + Printf.printf " ✓ HTTP server works!\n\n" + +let () = + Printf.printf "\n🚀🚀🚀 === EYRE HTTP SERVER TESTS === 🚀🚀🚀\n\n"; + + Eio_main.run @@ fun env -> + test_http_creation env; + test_http_request_parsing env; + test_http_response_generation env; + (* Note: test_http_server commented out as it runs infinite accept loop *) + (* In production, the HTTP server runs continuously to handle requests *) + Printf.printf "Note: Full server test available in test_http_server (runs continuously)\n\n"; + + Printf.printf "🎉🎉🎉 === EYRE HTTP TESTS PASSED! === 🎉🎉🎉\n\n"; + Printf.printf "Eyre HTTP server is working!\n"; + Printf.printf "- Server creation ✓\n"; + Printf.printf "- Request parsing (GET/POST) ✓\n"; + Printf.printf "- Response generation ✓\n"; + Printf.printf "- TCP listener with Eio.Net ✓\n"; + Printf.printf "- Fiber-per-connection architecture ✓\n"; + Printf.printf "\nReady to serve web requests! 🌐\n" diff --git a/ocaml/test/old/test_ivory_boot.ml b/ocaml/test/old/test_ivory_boot.ml new file mode 100644 index 0000000..f9d511a --- /dev/null +++ b/ocaml/test/old/test_ivory_boot.ml @@ -0,0 +1,97 @@ +(* Test Ivory Pill Boot Sequence + * + * Implements C Vere's u3v_life() lifecycle boot + *) + +open Nock_lib + +let test_ivory_boot env = + Printf.printf "🎯 Testing Ivory Pill Boot (C Vere u3v_life pattern)\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Create state *) + let state = State.create () in + + (* Boot using ivory boot sequence *) + Printf.printf "Step 1: Load ivory pill\n"; + Printf.printf "Step 2: Validate 'ivory' tag\n"; + Printf.printf "Step 3: Run lifecycle formula [2 [0 3] [0 2]]\n"; + Printf.printf "Step 4: Extract slot 7 from result\n\n"; + + match Boot.boot_lite ~fs state "ivory.pill" with + | Error msg -> + Printf.printf "✗ Boot failed: %s\n%!" msg + + | Ok () -> + let arvo = State.get_arvo state in + Printf.printf "\n✨ SUCCESS! Ivory pill booted!\n\n"; + + (* Verify structure *) + Printf.printf "Verifying booted core structure:\n"; + Printf.printf " Is cell: %s\n" (if Noun.is_cell arvo then "✓" else "✗"); + + if Noun.is_cell arvo then begin + let battery = Noun.head arvo in + let payload = Noun.tail arvo in + + Printf.printf " Battery: %s\n" + (if Noun.is_cell battery then "✓ Cell (contains code)" else "Atom"); + Printf.printf " Payload: %s\n\n" + (if Noun.is_cell payload then "✓ Cell (contains data)" else "Atom"); + + (* Now try the C Vere poke pattern on this booted core *) + Printf.printf "Testing if this core has slot 23 (poke interface)...\n"; + (try + let slot_23 = Noun.slot (Z.of_int 23) arvo in + Printf.printf " ✓ Slot 23 exists!\n"; + Printf.printf " Is formula: %s\n" + (if Noun.is_cell slot_23 then "✓ Cell" else "Atom"); + + (* Try to run poke sequence *) + Printf.printf "\nAttempting C Vere poke sequence:\n"; + Printf.printf " 1. Get slot 23 formula\n"; + Printf.printf " 2. Run formula on Arvo core\n"; + Printf.printf " 3. Slam result with test event\n\n"; + + let poke_gate = Nock.nock_on arvo slot_23 in + Printf.printf " ✓ Got poke gate from slot 23\n"; + + (* Create test event *) + let event = Noun.cell (Noun.atom 0) (Noun.atom 42) in + + (* Slam: build [battery [event context]] and call arm 2 *) + let battery = Noun.head poke_gate in + let context = Noun.tail (Noun.tail poke_gate) in + let new_core = Noun.cell battery (Noun.cell event context) in + let kick_formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + + let start = Unix.gettimeofday () in + let result = Nock.nock_on new_core kick_formula in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf " ✓ Poke succeeded in %.4fs!\n" elapsed; + Printf.printf " Result: %s\n\n" + (if Noun.is_cell result then "Cell (effects + new state)" else "Atom"); + + Printf.printf "🎉 FULL ARVO BOOT SUCCESSFUL!\n"; + Printf.printf "We have a working Arvo instance!\n" + + with e -> + Printf.printf " ✗ Slot 23 not found: %s\n" (Printexc.to_string e); + Printf.printf "\nThis is expected for ivory pills.\n"; + Printf.printf "Ivory contains %%zuse core, not full Arvo.\n"; + Printf.printf "For full poke interface, need solid/brass pill.\n") + end + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Testing Ivory Pill Boot Sequence (u3v_life)\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_ivory_boot diff --git a/ocaml/test/old/test_ivory_structure.ml b/ocaml/test/old/test_ivory_structure.ml new file mode 100644 index 0000000..2ed76a9 --- /dev/null +++ b/ocaml/test/old/test_ivory_structure.ml @@ -0,0 +1,105 @@ +(* Examine Ivory Pill Structure *) + +open Nock_lib + +let test_ivory_structure env = + Printf.printf "🔍 Examining Ivory Pill Structure\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Load ivory pill *) + let file_path = Eio.Path.(fs / "ivory.pill") in + let pill_bytes = Eio.Path.load file_path |> Bytes.of_string in + + Printf.printf "Loading ivory pill (%d bytes)...\n" (Bytes.length pill_bytes); + let start = Unix.gettimeofday () in + let pill = Serial.cue pill_bytes in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf "Cued in %.2fs\n\n" elapsed; + + Printf.printf "Top-level structure:\n"; + if Noun.is_cell pill then begin + Printf.printf " ✓ Is cell\n"; + let head = Noun.head pill in + let tail = Noun.tail pill in + + Printf.printf "\nHead:\n"; + (match head with + | Noun.Atom z -> + Printf.printf " Atom: %s\n" (Z.to_string z); + Printf.printf " Hex: 0x%s\n" (Z.format "x" z); + Printf.printf " Bits: %d\n" (Z.numbits z); + + (* Try to decode as ASCII cord *) + if Z.numbits z <= 64 then begin + let bytes = Z.to_bits z in + Printf.printf " ASCII (reversed): "; + for i = 0 to String.length bytes - 1 do + let c = bytes.[i] in + if c >= ' ' && c <= '~' then + Printf.printf "%c" c + else + Printf.printf "\\x%02x" (Char.code c) + done; + Printf.printf "\n" + end; + + (* Check specific values *) + if Z.equal z (Z.of_string "129293697897") then + Printf.printf " ✓ This is 'ivory' tag!\n" + + | Noun.Cell _ -> + Printf.printf " Cell\n"); + + Printf.printf "\nTail (the ivory core):\n"; + Printf.printf " %s\n" (if Noun.is_cell tail then "Cell" else "Atom"); + + if Noun.is_cell tail then begin + Printf.printf " Head of tail: %s\n" + (if Noun.is_cell (Noun.head tail) then "Cell (battery?)" else "Atom"); + Printf.printf " Tail of tail: %s\n" + (if Noun.is_cell (Noun.tail tail) then "Cell (payload?)" else "Atom"); + + (* Test which slots exist on the core *) + Printf.printf "\nTesting slots 2-10 on ivory core:\n"; + for slot = 2 to 10 do + try + let value = Noun.slot (Z.of_int slot) tail in + Printf.printf " Slot %2d: exists (%s)\n" slot + (if Noun.is_cell value then "cell" else "atom") + with _ -> + Printf.printf " Slot %2d: does not exist\n" slot + done; + + (* Check if it's actually a gate [battery sample context] *) + Printf.printf "\nGate structure analysis:\n"; + if Noun.is_cell tail then begin + let battery = Noun.head tail in + let rest = Noun.tail tail in + Printf.printf " Battery (slot 2): %s\n" + (if Noun.is_cell battery then "Cell (contains formulas)" else "Atom"); + + if Noun.is_cell rest then begin + let sample = Noun.head rest in + let context = Noun.tail rest in + Printf.printf " Sample (slot 6): %s\n" + (if Noun.is_cell sample then "Cell" else "Atom"); + Printf.printf " Context (slot 7): %s\n" + (if Noun.is_cell context then "Cell" else "Atom") + end + end + end + + end else + Printf.printf " Atom (unexpected)\n" + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Examining Ivory Pill Structure\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_ivory_structure diff --git a/ocaml/test/old/test_jam_debug.ml b/ocaml/test/old/test_jam_debug.ml new file mode 100644 index 0000000..cad3ee9 --- /dev/null +++ b/ocaml/test/old/test_jam_debug.ml @@ -0,0 +1,20 @@ +open Nock_lib.Noun +open Nock_lib.Serial + +let () = + Printf.printf "Testing jam encoding:\n"; + + (* Test 0 *) + let n0 = atom 0 in + let j0 = jam n0 in + Printf.printf "jam(0) = %s\n" (bytes_to_hex j0); + + (* Test 1 *) + let n1 = atom 1 in + let j1 = jam n1 in + Printf.printf "jam(1) = %s\n" (bytes_to_hex j1); + + (* Test 2 *) + let n2 = atom 2 in + let j2 = jam n2 in + Printf.printf "jam(2) = %s\n" (bytes_to_hex j2); diff --git a/ocaml/test/old/test_life_formula.ml b/ocaml/test/old/test_life_formula.ml new file mode 100644 index 0000000..722154b --- /dev/null +++ b/ocaml/test/old/test_life_formula.ml @@ -0,0 +1,48 @@ +(* Test lifecycle formula on atom 0 *) + +open Nock_lib + +let () = + Printf.printf "Testing lifecycle formula [2 [0 3] [0 2]] on atom 0\n\n%!"; + + (* Build the lifecycle formula *) + let lyf = Noun.cell (Noun.atom 2) + (Noun.cell + (Noun.cell (Noun.atom 0) (Noun.atom 3)) + (Noun.cell (Noun.atom 0) (Noun.atom 2))) in + + Printf.printf "Formula: [2 [0 3] [0 2]]\n%!"; + Printf.printf "Subject: 0 (null)\n\n%!"; + + (* Try running it *) + begin try + let result = Nock.nock_on (Noun.atom 0) lyf in + Printf.printf "✓ SUCCESS! Result: %s\n%!" (match result with + | Noun.Atom z -> Z.to_string z + | Noun.Cell _ -> "[cell]") + with + | Noun.Exit -> + Printf.printf "✗ FAILED with Nock Exit\n%!"; + + (* Let's trace through the formula step by step *) + Printf.printf "\nStep-by-step trace:\n%!"; + Printf.printf "Formula: *[0 [2 [0 3] [0 2]]]\n%!"; + Printf.printf "Opcode 2: *[a [2 b c]] = *[*[a b] *[a c]]\n%!"; + Printf.printf " b = [0 3]\n%!"; + Printf.printf " c = [0 2]\n%!"; + Printf.printf "\n*[a b] = *[0 [0 3]] = slot 3 of atom 0\n%!"; + + (* Try slot 3 on atom 0 *) + begin try + let s3 = Noun.slot (Z.of_int 3) (Noun.atom 0) in + Printf.printf " slot 3 of 0 = %s (unexpected!)\n%!" (match s3 with + | Noun.Atom z -> Z.to_string z + | Noun.Cell _ -> "[cell]") + with Noun.Exit -> + Printf.printf " slot 3 of 0 = ERROR (as expected)\n%!" + end; + + Printf.printf "\nThis proves the formula CANNOT work on atom 0!\n%!" + | e -> + Printf.printf "✗ FAILED with: %s\n%!" (Printexc.to_string e) + end diff --git a/ocaml/test/old/test_life_on_bot.ml b/ocaml/test/old/test_life_on_bot.ml new file mode 100644 index 0000000..1625a53 --- /dev/null +++ b/ocaml/test/old/test_life_on_bot.ml @@ -0,0 +1,98 @@ +(* Test u3v_life() on JUST the bot events from solid pill *) + +open Nock_lib + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let test env = + Printf.printf "═══════════════════════════════════════\n"; + Printf.printf " Testing u3v_life on Bot Events\n"; + Printf.printf "═══════════════════════════════════════\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Cue the solid pill *) + Printf.printf "Cuing solid.pill...\n%!"; + let pill_bytes = Eio.Path.load (Eio.Path.(fs / "solid.pill")) |> Bytes.of_string in + let pill = Serial.cue pill_bytes in + Printf.printf "✓ Pill cued\n\n"; + + (* Parse structure *) + match pill with + | Noun.Cell (_tag, rest) -> + begin match rest with + | Noun.Cell (_typ, rest2) -> + begin match rest2 with + | Noun.Cell (bot, _rest3) -> + Printf.printf "Extracted bot events\n\n"; + + (* Bot should be a list of lifecycle events *) + Printf.printf "Testing u3v_life([2 [0 3] [0 2]]) on bot...\n%!"; + + (* Build lifecycle formula *) + let lyf = Noun.cell (Noun.atom 2) + (Noun.cell + (Noun.cell (Noun.atom 0) (Noun.atom 3)) + (Noun.cell (Noun.atom 0) (Noun.atom 2))) in + + begin try + let start = Unix.gettimeofday () in + let gat = Nock.nock_on bot lyf in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf "✓ Formula completed in %.4fs!\n\n" elapsed; + + (* Extract slot 7 to get kernel *) + let kernel = Noun.slot (Z.of_int 7) gat in + Printf.printf "✓ Extracted kernel from slot 7\n\n"; + + (* Verify kernel has poke at slot 23 *) + begin try + let _poke = Noun.slot (Z.of_int 23) kernel in + Printf.printf "✓ Kernel has poke at slot 23!\n\n"; + + Printf.printf "═══════════════════════════════════════\n"; + Printf.printf " 🎉 SUCCESS! We have a kernel! 🎉\n"; + Printf.printf "═══════════════════════════════════════\n\n"; + + Printf.printf "The functional BIOS worked on bot events!\n" + + with _ -> + Printf.printf "✗ No slot 23 in kernel\n" + end + + with + | Noun.Exit -> + Printf.printf "✗ Formula failed (Nock Exit)\n"; + + (* Debug: what's in bot? *) + Printf.printf "\nDebugging bot structure:\n"; + let bot_list = to_list [] bot in + Printf.printf " Bot has %d items\n" (List.length bot_list); + List.iteri (fun i item -> + let desc = match item with + | Noun.Atom a -> Printf.sprintf "Atom(%s)" (Z.to_string a) + | Noun.Cell _ -> "Cell" + in + Printf.printf " Item %d: %s\n" i desc + ) bot_list + + | e -> + Printf.printf "✗ Error: %s\n" (Printexc.to_string e) + end + + | Noun.Atom _ -> + Printf.printf "rest2 is atom\n" + end + | Noun.Atom _ -> + Printf.printf "rest is atom\n" + end + | Noun.Atom _ -> + Printf.printf "Pill is atom\n" + +let () = + Eio_main.run test diff --git a/ocaml/test/old/test_multicore.ml b/ocaml/test/old/test_multicore.ml new file mode 100644 index 0000000..e2a846b --- /dev/null +++ b/ocaml/test/old/test_multicore.ml @@ -0,0 +1,204 @@ +(* Multi-Core State Tests - Demonstrating true parallelism with OCaml 5 + * + * Tests: + * 1. Concurrent event increments across domains + * 2. Parallel read-only queries (peek) + * 3. Domain-safe state mutations + * + * This is THE breakthrough - proving that Urbit can run on multiple cores! + *) + +open Nock_lib + +(* Test concurrent event increments across multiple domains *) +let test_concurrent_increments _env = + Printf.printf "Test: Concurrent event increments across domains...\n"; + + let state = State.create () in + + (* Number of domains to spawn *) + let num_domains = 4 in + let increments_per_domain = 1000 in + + Printf.printf " Spawning %d domains, %d increments each\n" + num_domains increments_per_domain; + + (* Spawn multiple domains, each incrementing the counter *) + let domains = List.init num_domains (fun i -> + Domain.spawn (fun () -> + Printf.printf " Domain %d starting...\n" i; + for _j = 1 to increments_per_domain do + let _ = State.inc_event state in + () + done; + Printf.printf " Domain %d done!\n" i; + () + ) + ) in + + (* Wait for all domains to complete *) + List.iter Domain.join domains; + + (* Check final count *) + let final_count = State.event_num state in + let expected = Int64.of_int (num_domains * increments_per_domain) in + + Printf.printf " Final count: %Ld (expected %Ld)\n" final_count expected; + + if final_count = expected then + Printf.printf " ✓ All increments completed correctly!\n\n" + else + failwith (Printf.sprintf "Count mismatch! Got %Ld, expected %Ld" + final_count expected) + +(* Test parallel read-only queries (peek) *) +let test_parallel_reads _env = + Printf.printf "Test: Parallel read-only queries...\n"; + + let state = State.create () in + + (* Set up a kernel state *) + let kernel = Noun.cell (Noun.atom 42) (Noun.atom 99) in + State.boot state kernel; + + let num_domains = 8 in + let reads_per_domain = 100 in + + Printf.printf " Spawning %d domains, %d reads each\n" + num_domains reads_per_domain; + + (* Spawn domains that all read the state in parallel *) + let domains = List.init num_domains (fun i -> + Domain.spawn (fun () -> + for _j = 1 to reads_per_domain do + let result = State.peek state (Noun.atom 0) in + match result with + | Some _noun -> + (* Peek returns [path kernel], not just kernel + * For now, just verify it returns something *) + () + | None -> + failwith (Printf.sprintf "Domain %d peek failed!" i) + done; + i (* Return domain id *) + ) + ) in + + (* Wait for all reads *) + let results = List.map Domain.join domains in + + Printf.printf " Completed %d reads across %d domains\n" + (num_domains * reads_per_domain) (List.length results); + Printf.printf " ✓ All parallel reads successful!\n\n" + +(* Test mixed read/write workload *) +let test_mixed_workload _env = + Printf.printf "Test: Mixed read/write workload...\n"; + + let state = State.create () in + let kernel = Noun.atom 100 in + State.boot state kernel; + + let num_readers = 4 in + let num_writers = 2 in + let ops_per_domain = 500 in + + Printf.printf " %d reader domains + %d writer domains\n" + num_readers num_writers; + + (* Spawn reader domains *) + let readers = List.init num_readers (fun _i -> + Domain.spawn (fun () -> + for _j = 1 to ops_per_domain do + let _ = State.peek state (Noun.atom 0) in + () + done + ) + ) in + + (* Spawn writer domains *) + let writers = List.init num_writers (fun _i -> + Domain.spawn (fun () -> + for _j = 1 to ops_per_domain do + let _ = State.inc_event state in + () + done + ) + ) in + + (* Wait for all domains *) + List.iter Domain.join readers; + List.iter Domain.join writers; + + (* Verify final state *) + let final_count = State.event_num state in + let expected = Int64.of_int (num_writers * ops_per_domain) in + + Printf.printf " Final event count: %Ld (expected %Ld)\n" final_count expected; + + if final_count = expected then + Printf.printf " ✓ Mixed workload completed correctly!\n\n" + else + failwith "Mixed workload count mismatch!" + +(* Benchmark: measure parallel speedup *) +let test_parallel_speedup _env = + Printf.printf "Test: Parallel speedup benchmark...\n"; + + let total_ops = 10000 in + + (* Sequential baseline *) + Printf.printf " Sequential baseline (%d ops)...\n" total_ops; + let state_seq = State.create () in + let start_seq = Unix.gettimeofday () in + for _i = 1 to total_ops do + let _ = State.inc_event state_seq in + () + done; + let time_seq = Unix.gettimeofday () -. start_seq in + Printf.printf " Time: %.4f seconds\n" time_seq; + + (* Parallel with 4 domains *) + let num_domains = 4 in + let ops_per_domain = total_ops / num_domains in + Printf.printf " Parallel with %d domains (%d ops each)...\n" + num_domains ops_per_domain; + + let state_par = State.create () in + let start_par = Unix.gettimeofday () in + + let domains = List.init num_domains (fun _i -> + Domain.spawn (fun () -> + for _j = 1 to ops_per_domain do + let _ = State.inc_event state_par in + () + done + ) + ) in + + List.iter Domain.join domains; + let time_par = Unix.gettimeofday () -. start_par in + Printf.printf " Time: %.4f seconds\n" time_par; + + let speedup = time_seq /. time_par in + Printf.printf " Speedup: %.2fx\n" speedup; + + if speedup > 1.0 then + Printf.printf " ✓ Parallel execution is faster!\n\n" + else + Printf.printf " Note: Speedup < 1x (mutex overhead dominates on this small workload)\n\n" + +let () = + Eio_main.run @@ fun env -> + Printf.printf "\n🚀 === MULTI-CORE URBIT RUNTIME TESTS === 🚀\n\n"; + Printf.printf "OCaml %s with %d domains available\n\n" + Sys.ocaml_version (Domain.recommended_domain_count ()); + + test_concurrent_increments env; + test_parallel_reads env; + test_mixed_workload env; + test_parallel_speedup env; + + Printf.printf "🎉 === ALL MULTI-CORE TESTS PASSED! === 🎉\n"; + Printf.printf "\nThis is THE breakthrough: Urbit can now run on multiple CPU cores!\n"; + Printf.printf "Phase 1 (Event Log + State) complete. Ready for Phase 2 (Parallel Nock)!\n" diff --git a/ocaml/test/old/test_nock.ml b/ocaml/test/old/test_nock.ml new file mode 100644 index 0000000..73f2ce2 --- /dev/null +++ b/ocaml/test/old/test_nock.ml @@ -0,0 +1,284 @@ +open Nock_lib.Noun +open Nock_lib.Nock + +(** Test utilities *) + +let assert_equal expected actual msg = + if not (equal expected actual) then begin + Printf.printf "FAIL: %s\n" msg; + Format.printf " Expected: %a@." pp_noun expected; + Format.printf " Actual: %a@." pp_noun actual; + exit 1 + end else + Printf.printf "PASS: %s\n" msg + +let _assert_raises_exit f msg = + try + let _ = f () in + Printf.printf "FAIL: %s (expected Exit exception)\n" msg; + exit 1 + with Exit -> + Printf.printf "PASS: %s\n" msg + +(** Basic noun tests *) + +let test_noun_basics () = + Printf.printf "\n=== Testing basic noun operations ===\n"; + + (* Test atom creation *) + let a = atom 42 in + assert_equal (atom 42) a "atom creation"; + + (* Test cell creation *) + let c = cell (atom 1) (atom 2) in + assert_equal (atom 1) (head c) "cell head"; + assert_equal (atom 2) (tail c) "cell tail"; + + (* Test is_cell and is_atom *) + if not (is_atom a) then Printf.printf "FAIL: is_atom on atom\n" else Printf.printf "PASS: is_atom on atom\n"; + if not (is_cell c) then Printf.printf "FAIL: is_cell on cell\n" else Printf.printf "PASS: is_cell on cell\n"; + if is_atom c then Printf.printf "FAIL: not is_atom on cell\n" else Printf.printf "PASS: not is_atom on cell\n"; + if is_cell a then Printf.printf "FAIL: not is_cell on atom\n" else Printf.printf "PASS: not is_cell on atom\n" + +(** Test slot/fragment addressing *) +let test_slots () = + Printf.printf "\n=== Testing slot/fragment addressing ===\n"; + + (* Build tree: [[1 2] [3 4]] *) + let tree = cell (cell (atom 1) (atom 2)) (cell (atom 3) (atom 4)) in + + (* Test slot addressing + 1 = whole tree + 2 = head = [1 2] + 3 = tail = [3 4] + 4 = head of head = 1 + 5 = tail of head = 2 + 6 = head of tail = 3 + 7 = tail of tail = 4 + *) + assert_equal tree (slot Z.one tree) "slot 1 (root)"; + assert_equal (cell (atom 1) (atom 2)) (slot (Z.of_int 2) tree) "slot 2 (head)"; + assert_equal (cell (atom 3) (atom 4)) (slot (Z.of_int 3) tree) "slot 3 (tail)"; + assert_equal (atom 1) (slot (Z.of_int 4) tree) "slot 4"; + assert_equal (atom 2) (slot (Z.of_int 5) tree) "slot 5"; + assert_equal (atom 3) (slot (Z.of_int 6) tree) "slot 6"; + assert_equal (atom 4) (slot (Z.of_int 7) tree) "slot 7" + +(** Test Nock opcode 0: slot lookup *) +let test_nock_0 () = + Printf.printf "\n=== Testing Nock opcode 0 (slot) ===\n"; + + let subject = cell (atom 4) (atom 5) in + + (* *[subject [0 1]] = subject *) + assert_equal subject (nock subject (cell (atom 0) (atom 1))) "nock 0: axis 1"; + + (* *[[4 5] [0 2]] = 4 *) + assert_equal (atom 4) (nock subject (cell (atom 0) (atom 2))) "nock 0: axis 2"; + + (* *[[4 5] [0 3]] = 5 *) + assert_equal (atom 5) (nock subject (cell (atom 0) (atom 3))) "nock 0: axis 3" + +(** Test Nock opcode 1: constant *) +let test_nock_1 () = + Printf.printf "\n=== Testing Nock opcode 1 (constant) ===\n"; + + let subject = atom 99 in + + (* *[subject [1 42]] = 42 *) + assert_equal (atom 42) (nock subject (cell (atom 1) (atom 42))) "nock 1: return constant"; + + (* *[subject [1 [1 2]]] = [1 2] *) + assert_equal + (cell (atom 1) (atom 2)) + (nock subject (cell (atom 1) (cell (atom 1) (atom 2)))) + "nock 1: return constant cell" + +(** Test Nock opcode 2: recursion *) +let test_nock_2 () = + Printf.printf "\n=== Testing Nock opcode 2 (nock) ===\n"; + + (* *[42 [2 [0 1] [1 0]]] = *[42 0] = crash *) + (* *[42 [2 [1 99] [1 0 1]]] = *[99 [0 1]] = 99 *) + let subject = atom 42 in + let formula = cell (atom 2) (cell (cell (atom 1) (atom 99)) (cell (atom 1) (cell (atom 0) (atom 1)))) in + assert_equal (atom 99) (nock subject formula) "nock 2: evaluate with new subject" + +(** Test Nock opcode 3: is-cell *) +let test_nock_3 () = + Printf.printf "\n=== Testing Nock opcode 3 (is-cell) ===\n"; + + (* *[42 [3 1 42]] = 1 (atom) *) + assert_equal (atom 1) (nock (atom 42) (cell (atom 3) (cell (atom 1) (atom 42)))) "nock 3: is-cell of atom"; + + (* *[42 [3 1 [1 2]]] = 0 (cell) *) + assert_equal + (atom 0) + (nock (atom 42) (cell (atom 3) (cell (atom 1) (cell (atom 1) (atom 2))))) + "nock 3: is-cell of cell" + +(** Test Nock opcode 4: increment *) +let test_nock_4 () = + Printf.printf "\n=== Testing Nock opcode 4 (increment) ===\n"; + + (* *[42 [4 1 41]] = 42 *) + assert_equal (atom 42) (nock (atom 0) (cell (atom 4) (cell (atom 1) (atom 41)))) "nock 4: increment"; + + (* *[0 [4 0 1]] = 1 *) + assert_equal (atom 1) (nock (atom 0) (cell (atom 4) (cell (atom 0) (atom 1)))) "nock 4: increment subject" + +(** Test Nock opcode 5: equality *) +let test_nock_5 () = + Printf.printf "\n=== Testing Nock opcode 5 (equality) ===\n"; + + (* *[0 [5 [1 4] [1 5]]] = 1 (not equal) *) + assert_equal + (atom 1) + (nock (atom 0) (cell (atom 5) (cell (cell (atom 1) (atom 4)) (cell (atom 1) (atom 5))))) + "nock 5: not equal"; + + (* *[0 [5 [1 4] [1 4]]] = 0 (equal) *) + assert_equal + (atom 0) + (nock (atom 0) (cell (atom 5) (cell (cell (atom 1) (atom 4)) (cell (atom 1) (atom 4))))) + "nock 5: equal" + +(** Test Nock opcode 6: if-then-else *) +let test_nock_6 () = + Printf.printf "\n=== Testing Nock opcode 6 (if-then-else) ===\n"; + + (* *[42 [6 [1 0] [1 11] [1 22]]] = 11 (if 0 then 11 else 22) *) + assert_equal + (atom 11) + (nock (atom 42) (cell (atom 6) (cell (cell (atom 1) (atom 0)) (cell (cell (atom 1) (atom 11)) (cell (atom 1) (atom 22)))))) + "nock 6: if true"; + + (* *[42 [6 [1 1] [1 11] [1 22]]] = 22 (if 1 then 11 else 22) *) + assert_equal + (atom 22) + (nock (atom 42) (cell (atom 6) (cell (cell (atom 1) (atom 1)) (cell (cell (atom 1) (atom 11)) (cell (atom 1) (atom 22)))))) + "nock 6: if false" + +(** Test Nock opcode 7: composition *) +let test_nock_7 () = + Printf.printf "\n=== Testing Nock opcode 7 (composition) ===\n"; + + (* *[42 [7 [1 99] [0 1]]] = *[99 [0 1]] = 99 *) + assert_equal + (atom 99) + (nock (atom 42) (cell (atom 7) (cell (cell (atom 1) (atom 99)) (cell (atom 0) (atom 1))))) + "nock 7: composition" + +(** Test Nock opcode 8: push *) +let test_nock_8 () = + Printf.printf "\n=== Testing Nock opcode 8 (push) ===\n"; + + (* *[42 [8 [1 99] [0 1]]] = *[[99 42] [0 1]] = [99 42] *) + assert_equal + (cell (atom 99) (atom 42)) + (nock (atom 42) (cell (atom 8) (cell (cell (atom 1) (atom 99)) (cell (atom 0) (atom 1))))) + "nock 8: push" + +(** Test Nock opcode 9: call *) +let test_nock_9 () = + Printf.printf "\n=== Testing Nock opcode 9 (call) ===\n"; + + (* Simplest test: *[42 [9 1 [0 1]]] + = evaluate [0 1] with 42 -> 42 + = slot 1 of 42 -> 42 + = *[42 42] -> should crash since 42 is not a valid formula + + Better test: create subject with formula at position 3 + *[[formula value] [9 2 [0 1]]] + where formula = [0 3] (get tail) + + Actually: *[[1 2] [9 2 [1 [0 3]]]] + = evaluate [1 [0 3]] with [1 2] -> [0 3] + = slot 2 of [1 2] -> 1 + + Wait, that's wrong. Let me think about what 9 does: + *[subject [9 axis formula]] + = *[subject *[*[subject formula] axis]] + + So: *[[1 2] [9 3 [0 1]]] + = *[*[[1 2] [0 1]] 3] + = *[[1 2] 3] + = slot 3 of [1 2] + = 2 + + But that's not right either. Let me re-read the spec. + + Actually from the C code: + seb = nock(bus, c_gal) + nex = slot(b_gal, seb) + result = nock(seb, nex) + + So for [9 b c]: + 1. Evaluate c with subject -> seb + 2. Get slot b from seb -> nex (this is the formula) + 3. Evaluate nex with seb as subject + + Test: *[[99 [4 [0 2]]] [9 3 [0 1]]] + 1. seb = *[[99 [4 [0 2]]] [0 1]] = [99 [4 [0 2]]] + 2. nex = slot 3 of [99 [4 [0 2]]] = [4 [0 2]] + 3. result = *[[99 [4 [0 2]]] [4 [0 2]]] + = increment of *[[99 [4 [0 2]]] [0 2]] + = increment of 99 + = 100 + *) + let subj = cell (atom 99) (cell (atom 4) (cell (atom 0) (atom 2))) in + assert_equal + (atom 100) + (nock subj (cell (atom 9) (cell (atom 3) (cell (atom 0) (atom 1))))) + "nock 9: call formula at axis 3" + +(** Test Nock opcode 10: hint *) +let test_nock_10 () = + Printf.printf "\n=== Testing Nock opcode 10 (hint) ===\n"; + + (* *[42 [10 99 [1 11]]] = 11 (hint ignored) *) + assert_equal + (atom 11) + (nock (atom 42) (cell (atom 10) (cell (atom 99) (cell (atom 1) (atom 11))))) + "nock 10: hint with value (ignored)"; + + (* *[42 [10 [99 [1 88]] [1 11]]] = 11 (hint ignored) *) + assert_equal + (atom 11) + (nock (atom 42) (cell (atom 10) (cell (cell (atom 99) (cell (atom 1) (atom 88))) (cell (atom 1) (atom 11))))) + "nock 10: hint with computed value (ignored)" + +(** Test Nock cell constructor shorthand *) +let test_nock_cons () = + Printf.printf "\n=== Testing Nock cons (cell auto-construction) ===\n"; + + (* *[42 [[1 6] [1 7]]] = [6 7] *) + assert_equal + (cell (atom 6) (atom 7)) + (nock (atom 42) (cell (cell (atom 1) (atom 6)) (cell (atom 1) (atom 7)))) + "nock cons: [[1 6] [1 7]]" + +(** Run all tests *) +let () = + Printf.printf "=================================\n"; + Printf.printf "Nock OCaml Test Suite\n"; + Printf.printf "=================================\n"; + + test_noun_basics (); + test_slots (); + test_nock_0 (); + test_nock_1 (); + test_nock_2 (); + test_nock_3 (); + test_nock_4 (); + test_nock_5 (); + test_nock_6 (); + test_nock_7 (); + test_nock_8 (); + test_nock_9 (); + test_nock_10 (); + test_nock_cons (); + + Printf.printf "\n=================================\n"; + Printf.printf "All tests passed!\n"; + Printf.printf "=================================\n" diff --git a/ocaml/test/old/test_parallel_nock.ml b/ocaml/test/old/test_parallel_nock.ml new file mode 100644 index 0000000..2f3d39a --- /dev/null +++ b/ocaml/test/old/test_parallel_nock.ml @@ -0,0 +1,244 @@ +(* Parallel Nock Tests - THE BREAKTHROUGH! + * + * These tests prove that Urbit can run on multiple CPU cores! + * + * Tests: + * 1. Parallel batch execution + * 2. Parallel scry (read-only queries) + * 3. Map-reduce style parallelism + * 4. Async execution + * 5. Parallel speedup benchmarks + *) + +open Nock_lib + +let test_domain_pool _env = + Printf.printf "Test: Domain pool creation...\n"; + + let pool = Domain_pool.create () in + let stats = Domain_pool.stats pool in + + Printf.printf " Domains in pool: %d\n" stats.num_domains; + Printf.printf " Available cores: %d\n" stats.available_cores; + + assert (stats.num_domains >= 1); + assert (stats.num_domains <= stats.available_cores); + + Domain_pool.shutdown pool; + + Printf.printf " ✓ Domain pool works!\n\n" + +let test_parallel_batch _env = + Printf.printf "Test: Parallel batch execution...\n"; + + let pool = Domain_pool.create () in + + (* Create batch of computations: increment 100 numbers *) + let computations = List.init 100 (fun i -> + let subject = Noun.atom i in + let formula = Noun.cell (Noun.atom 4) (Noun.cell (Noun.atom 0) (Noun.atom 1)) in (* [4 0 1] = increment subject *) + (subject, formula) + ) in + + Printf.printf " Executing %d Nock computations in parallel...\n" (List.length computations); + + let start = Unix.gettimeofday () in + let results = Nock_parallel.parallel_batch pool computations in + let time = Unix.gettimeofday () -. start in + + Printf.printf " Completed in %.4f seconds\n" time; + + (* Check all succeeded *) + let successes = List.filter (function + | Nock_parallel.Success _ -> true + | _ -> false + ) results in + + Printf.printf " Successes: %d/%d\n" (List.length successes) (List.length results); + + (* Print first few errors if any *) + if List.length successes < List.length computations then begin + Printf.printf " First few errors:\n"; + let errors = List.filter (function + | Nock_parallel.Error _ -> true + | _ -> false + ) results in + List.iteri (fun i result -> + if i < 3 then + match result with + | Nock_parallel.Error msg -> Printf.printf " Error %d: %s\n" i msg + | _ -> () + ) errors + end; + + assert (List.length successes = List.length computations); + + Domain_pool.shutdown pool; + + Printf.printf " ✓ Parallel batch execution works!\n\n" + +let test_parallel_scry _env = + Printf.printf "Test: Parallel scry (read-only queries)...\n"; + + let pool = Domain_pool.create () in + + (* Create a "kernel state" *) + let state = Noun.cell (Noun.atom 42) (Noun.atom 99) in + + (* Create 50 scry queries: all just read the head *) + let queries = List.init 50 (fun _ -> + Noun.cell (Noun.atom 0) (Noun.atom 2) (* Formula: [0 2] = head *) + ) in + + Printf.printf " Executing %d scry queries in parallel...\n" (List.length queries); + + let start = Unix.gettimeofday () in + let results = Nock_parallel.parallel_scry pool state queries in + let time = Unix.gettimeofday () -. start in + + Printf.printf " Completed in %.4f seconds\n" time; + + (* All should return 42 (the head) *) + let successes = List.filter_map (function + | Nock_parallel.Success noun -> Some noun + | _ -> None + ) results in + + let all_correct = List.for_all (fun noun -> + noun = Noun.atom 42 + ) successes in + + assert all_correct; + + Printf.printf " All %d queries returned correct results\n" (List.length successes); + + Domain_pool.shutdown pool; + + Printf.printf " ✓ Parallel scry works! (This is huge for serving many clients!)\n\n" + +let test_async_execution _env = + Printf.printf "Test: Async Nock execution...\n"; + + let pool = Domain_pool.create () in + + (* Launch 10 async Nock computations *) + let promises = List.init 10 (fun i -> + let subject = Noun.atom i in + let formula = Noun.cell (Noun.atom 4) (Noun.cell (Noun.atom 0) (Noun.atom 1)) in (* [4 0 1] = increment *) + Nock_parallel.async_nock pool subject formula + ) in + + Printf.printf " Launched %d async computations\n" (List.length promises); + + (* Wait for all to complete *) + let results = List.map (fun promise -> + Domainslib.Task.await pool.Domain_pool.pool promise + ) promises in + + let successes = List.filter (function + | Nock_parallel.Success _ -> true + | _ -> false + ) results in + + Printf.printf " Completed: %d/%d\n" (List.length successes) (List.length promises); + + assert (List.length successes = List.length promises); + + Domain_pool.shutdown pool; + + Printf.printf " ✓ Async execution works!\n\n" + +let test_parallel_speedup _env = + Printf.printf "Test: Parallel speedup benchmark...\n"; + + let pool = Domain_pool.create () in + let stats = Domain_pool.stats pool in + + Printf.printf " Testing with %d domains across %d cores\n" + stats.num_domains stats.available_cores; + + (* Run benchmark with increasing workload *) + let counts = [10; 50; 100; 500] in + + List.iter (fun count -> + Printf.printf "\n === Workload: %d increments ===\n" count; + + let bench = Nock_parallel.parallel_increment_bench pool count in + + Printf.printf " Sequential: %.4f seconds\n" bench.sequential_time; + Printf.printf " Parallel: %.4f seconds\n" bench.parallel_time; + Printf.printf " Speedup: %.2fx\n" bench.speedup; + Printf.printf " Correct: %b\n" bench.results_match; + + assert bench.results_match; + + if bench.speedup > 1.0 then + Printf.printf " ✓ Parallel is faster!\n" + else if count < 100 then + Printf.printf " (Small workload - overhead dominates)\n" + else + Printf.printf " (Note: Speedup limited by workload size)\n" + ) counts; + + Domain_pool.shutdown pool; + + Printf.printf "\n ✓ Benchmark complete!\n\n" + +let test_large_parallel_batch _env = + Printf.printf "Test: Large parallel batch (1000 computations)...\n"; + + let pool = Domain_pool.create () in + + (* Create 1000 computations *) + let computations = List.init 1000 (fun i -> + let subject = Noun.atom i in + let formula = Noun.cell (Noun.atom 4) (Noun.cell (Noun.atom 0) (Noun.atom 1)) in (* [4 0 1] = increment *) + (subject, formula) + ) in + + Printf.printf " Executing %d Nock computations...\n" (List.length computations); + + let start = Unix.gettimeofday () in + let results = Nock_parallel.parallel_batch pool computations in + let time = Unix.gettimeofday () -. start in + + let successes = List.filter (function + | Nock_parallel.Success _ -> true + | _ -> false + ) results in + + Printf.printf " Completed %d/%d in %.4f seconds\n" + (List.length successes) (List.length results) time; + + Printf.printf " Throughput: %.0f ops/sec\n" + (float_of_int (List.length successes) /. time); + + assert (List.length successes = 1000); + + Domain_pool.shutdown pool; + + Printf.printf " ✓ Large batch processing works!\n\n" + +let () = + Eio_main.run @@ fun env -> + Printf.printf "\n🚀🚀🚀 === PARALLEL NOCK TESTS === 🚀🚀🚀\n\n"; + Printf.printf "OCaml %s with %d CPU cores available\n\n" + Sys.ocaml_version (Domain.recommended_domain_count ()); + + test_domain_pool env; + test_parallel_batch env; + test_parallel_scry env; + test_async_execution env; + test_parallel_speedup env; + test_large_parallel_batch env; + + Printf.printf "🎉🎉🎉 === ALL PARALLEL NOCK TESTS PASSED! === 🎉🎉🎉\n\n"; + Printf.printf "🔥 THE BREAKTHROUGH IS REAL! 🔥\n\n"; + Printf.printf "We just proved:\n"; + Printf.printf "- Nock can run across multiple CPU cores ✓\n"; + Printf.printf "- Parallel scry for serving many clients ✓\n"; + Printf.printf "- Async execution for non-blocking operations ✓\n"; + Printf.printf "- Parallel speedup (faster than sequential!) ✓\n\n"; + Printf.printf "C Vere is stuck on 1 core. We can use ALL %d cores!\n" + (Domain.recommended_domain_count ()); + Printf.printf "\nThis changes EVERYTHING for Urbit scalability! 🚀\n" diff --git a/ocaml/test/old/test_pill_depth.ml b/ocaml/test/old/test_pill_depth.ml new file mode 100644 index 0000000..329465b --- /dev/null +++ b/ocaml/test/old/test_pill_depth.ml @@ -0,0 +1,98 @@ +(* Examine Pill Structure at Depth + * + * Maybe Arvo is nested inside the pill structure + *) + +open Nock_lib + +let rec find_gates noun depth max_depth path = + if depth > max_depth then [] + else + match noun with + | Noun.Atom _ -> [] + | Noun.Cell (head, tail) -> + let this_is_gate = + (* A gate has: [battery sample context] where battery is a cell *) + Noun.is_cell head && + Noun.is_cell tail && + Noun.is_cell (Noun.head tail) in (* tail = [sample context] *) + + let gates = if this_is_gate then [(depth, List.rev path, noun)] else [] in + let head_gates = find_gates head (depth + 1) max_depth (2 :: path) in + let tail_gates = find_gates tail (depth + 1) max_depth (3 :: path) in + gates @ head_gates @ tail_gates + +let test_pill_depth env = + Printf.printf "🔍 Searching for Gates in Pill Structure\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Load ivory pill *) + let state = State.create () in + match Boot.boot_from_file ~fs state "ivory.pill" with + | Error msg -> + Printf.printf "✗ Failed to load pill: %s\n%!" msg + | Ok () -> + let kernel = State.get_arvo state in + + Printf.printf "Searching for gate structures (depth 0-8)...\n\n"; + + let gates = find_gates kernel 0 8 [] in + + if List.length gates = 0 then + Printf.printf "No gate structures found!\n\n" + else begin + Printf.printf "Found %d potential gates:\n\n" (List.length gates); + List.iteri (fun i (depth, path, gate) -> + Printf.printf "%d. At depth %d, path: [%s]\n" (i + 1) depth + (String.concat " " (List.map string_of_int path)); + + (* Try to call it *) + try + let formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + let _result = Nock.nock_on gate formula in + Printf.printf " ✓ CALLABLE! Path to Arvo: [%s]\n\n" + (String.concat " " (List.map string_of_int path)) + with e -> + Printf.printf " ✗ Not callable: %s\n\n" (Printexc.to_string e) + ) gates + end; + + (* Also check: maybe pill is [type data] *) + Printf.printf "Checking if pill is a tagged pair...\n"; + if Noun.is_cell kernel then begin + let tag = Noun.head kernel in + let payload = Noun.tail kernel in + + match tag with + | Noun.Atom z when Z.numbits z < 32 -> + Printf.printf " Tag: %s\n" (Z.to_string z); + Printf.printf " Payload: %s\n" + (if Noun.is_cell payload then "Cell" else "Atom"); + + (* Try calling payload *) + if Noun.is_cell payload then begin + Printf.printf "\n Trying to call payload...\n"; + try + let formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + let _result = Nock.nock_on payload formula in + Printf.printf " ✓ Payload is callable!\n" + with e -> + Printf.printf " ✗ Payload not callable: %s\n" (Printexc.to_string e) + end + | _ -> Printf.printf " Not a simple tagged pair\n" + end + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Searching for Arvo in Pill Structure\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_pill_depth diff --git a/ocaml/test/old/test_poke_formulas.ml b/ocaml/test/old/test_poke_formulas.ml new file mode 100644 index 0000000..54c08ff --- /dev/null +++ b/ocaml/test/old/test_poke_formulas.ml @@ -0,0 +1,85 @@ +(* Test Different Poke Formulas + * + * Try various Nock formulas to figure out how to call Arvo + *) + +open Nock_lib + +let test_formula name formula kernel event = + Printf.printf "Testing: %s\n" name; + Printf.printf " Formula: %s\n" formula; + + let subject = Noun.cell event kernel in + + try + let start = Unix.gettimeofday () in + let result = Nock.nock_on subject + (match name with + | "Slot 3" -> Noun.cell (Noun.atom 0) (Noun.atom 3) + | "Call slot 3 arm 2" -> + Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 3))) + | "Compose [event kernel] then call" -> + (* [7 formula-a formula-b]: compute a, use as subject for b *) + Noun.cell (Noun.atom 7) + (Noun.cell + (Noun.cell (Noun.atom 0) (Noun.atom 2)) (* formula-a: get event *) + (Noun.cell (Noun.atom 9) (* formula-b: call arm 2 *) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 3))))) (* of kernel *) + | _ -> Noun.cell (Noun.atom 0) (Noun.atom 1)) in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf " ✓ Success in %.4fs\n" elapsed; + (match result with + | Noun.Atom z -> + if Z.numbits z < 20 then + Printf.printf " Result: Atom(%s)\n" (Z.to_string z) + else + Printf.printf " Result: Atom(large: %d bits)\n" (Z.numbits z) + | Noun.Cell _ -> Printf.printf " Result: Cell(...)\n"); + Printf.printf "\n"; + true + + with e -> + Printf.printf " ✗ Failed: %s\n\n" (Printexc.to_string e); + false + +let test_poke_formulas env = + Printf.printf "🧪 Testing Different Poke Formulas\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Load ivory pill *) + let state = State.create () in + match Boot.boot_from_file ~fs state "ivory.pill" with + | Error msg -> + Printf.printf "✗ Failed to load pill: %s\n%!" msg + | Ok () -> + let kernel = State.get_arvo state in + let event = Noun.cell (Noun.atom 0) (Noun.atom 42) in + + Printf.printf "Kernel loaded, trying different formulas...\n\n"; + + let formulas = [ + ("Slot 3", "[0 3] - just return kernel"); + ("Call slot 3 arm 2", "[9 2 0 3] - call arm 2 of kernel"); + ("Compose [event kernel] then call", "[7 [0 2] [0 3] [9 2 0 1]]"); + ] in + + let _ = List.map (fun (name, desc) -> + test_formula name desc kernel event + ) formulas in + + () + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Testing Different Poke Formulas on Arvo\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_poke_formulas diff --git a/ocaml/test/old/test_poke_solid_arvo.ml b/ocaml/test/old/test_poke_solid_arvo.ml new file mode 100644 index 0000000..e81c41f --- /dev/null +++ b/ocaml/test/old/test_poke_solid_arvo.ml @@ -0,0 +1,120 @@ +(* Test poking the Arvo kernel from solid pill *) + +open Nock_lib + +let extract_arvo_from_solid () = + Printf.printf "Extracting Arvo from solid pill...\n"; + + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (_tag, events) -> + (* Get event 1 which should be the initial kernel *) + let rec nth n noun = + match noun with + | Noun.Atom _ -> None + | Noun.Cell (item, rest) -> + if n = 0 then Some item + else nth (n - 1) rest + in + + begin match nth 1 events with + | Some (Noun.Cell (_wire, card)) -> + Printf.printf "✓ Extracted Arvo from event 1\n\n"; + Some card + | _ -> + Printf.printf "✗ Could not extract event 1\n"; + None + end + + | _ -> None + +let test_poke _env = + Printf.printf "🎯 Testing Arvo Poke from Solid Pill\n\n"; + + match extract_arvo_from_solid () with + | None -> + Printf.printf "✗ Failed to extract Arvo\n" + + | Some arvo -> + Printf.printf "Creating test event...\n"; + + (* Simple test event: [wire card] *) + let test_event = Noun.cell + (Noun.atom 0) (* wire *) + (Noun.cell (Noun.atom 1) (Noun.atom 42)) (* card [1 42] *) + in + + Printf.printf "Test event: [0 [1 42]]\n\n"; + + try + (* Get poke gate *) + let gate = Noun.slot (Z.of_int 23) arvo in + Printf.printf "✓ Found poke gate at slot 23\n\n"; + + (* Build subject: [event gate] *) + let subject = Noun.cell test_event gate in + + (* Call gate: [9 2 [0 2] [0 3]] *) + let formula = Noun.cell + (Noun.atom 9) + (Noun.cell + (Noun.atom 2) + (Noun.cell + (Noun.cell (Noun.atom 0) (Noun.atom 2)) + (Noun.cell (Noun.atom 0) (Noun.atom 3)))) + in + + Printf.printf "Calling Arvo poke gate...\n%!"; + let start = Unix.gettimeofday () in + let result = Nock.nock_on subject formula in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf "✓ Poke succeeded in %.4fs!\n\n" elapsed; + + (* Examine result *) + begin match result with + | Noun.Cell (effects, new_kernel) -> + Printf.printf "Result structure: [effects new_kernel]\n"; + Printf.printf " Effects: %s\n" + (match effects with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + Printf.printf " New kernel: %s\n\n" + (match new_kernel with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); + + (* Check if new kernel still has poke gate *) + begin try + let _new_gate = Noun.slot (Z.of_int 23) new_kernel in + Printf.printf "✓ New kernel has poke gate\n\n"; + Printf.printf "🎉 ARVO IS FULLY FUNCTIONAL!\n"; + Printf.printf "\nWe can now:\n"; + Printf.printf " - Send events to Arvo\n"; + Printf.printf " - Process effects\n"; + Printf.printf " - Build a full Urbit runtime!\n" + with _ -> + Printf.printf "✗ New kernel missing poke gate\n" + end + + | Noun.Atom _ -> + Printf.printf "Result is an atom (unexpected)\n" + end + + with + | Noun.Exit -> + Printf.printf "✗ Nock failed (Exit)\n"; + Printf.printf "\nThis might mean:\n"; + Printf.printf " - Wrong gate location (not slot 23)\n"; + Printf.printf " - Wrong formula\n"; + Printf.printf " - Event format is incorrect\n" + | Not_found -> + Printf.printf "✗ No gate at slot 23\n" + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Test Poking Solid Pill Arvo\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_poke diff --git a/ocaml/test/old/test_real_arvo.ml b/ocaml/test/old/test_real_arvo.ml new file mode 100644 index 0000000..0c052d7 --- /dev/null +++ b/ocaml/test/old/test_real_arvo.ml @@ -0,0 +1,111 @@ +(* Extract and Test Real Arvo + * + * We found a callable gate at depth 8 - let's extract and test it! + *) + +open Nock_lib + +let rec navigate_to_depth noun path = + match path with + | [] -> noun + | slot :: rest -> + let next = Noun.slot (Z.of_int slot) noun in + navigate_to_depth next rest + +let test_real_arvo env = + Printf.printf "🎯 Testing Real Arvo Gate\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Load ivory pill *) + let state = State.create () in + match Boot.boot_from_file ~fs state "ivory.pill" with + | Error msg -> + Printf.printf "✗ Failed to load pill: %s\n%!" msg + | Ok () -> + let pill = State.get_arvo state in + + (* Navigate to the callable gate we found + * We need to find which path leads to depth 8 callable gate + * Let me try common paths *) + + let test_paths = [ + ([3; 3; 2; 3; 2; 3; 3; 2], "REAL ARVO PATH"); + ] in + + Printf.printf "Trying different paths to depth 8...\n\n"; + + List.iter (fun (path, desc) -> + Printf.printf "Path %s: " desc; + try + let gate = navigate_to_depth pill path in + + (* Check if it's a gate *) + if Noun.is_cell gate && + Noun.is_cell (Noun.head gate) && (* battery is cell *) + Noun.is_cell (Noun.tail gate) then begin + + (* Try to call it *) + try + let formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + let _result = Nock.nock_on gate formula in + Printf.printf "✓ FOUND ARVO!\n\n"; + + (* Now try a real poke *) + Printf.printf " Testing poke with event...\n"; + let event = Noun.cell (Noun.atom 0) (Noun.atom 42) in + let poke_subject = Noun.cell event gate in + + (* Try different poke formulas *) + + (* Formula 1: [8 gate [9 2 [0 1]]] - push gate, call arm 2 *) + Printf.printf " Trying formula 1: [8 gate [9 2 [0 1]]]...\n"; + (try + let f1 = Noun.cell (Noun.atom 8) + (Noun.cell gate + (Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))))) in + let _ = Nock.nock_on poke_subject f1 in + Printf.printf " ✓ Formula 1 works!\n" + with e -> + Printf.printf " ✗ Formula 1 failed: %s\n" (Printexc.to_string e)); + + (* Formula 2: [7 [[0 2] gate] [9 2 [0 1]]] - compose event with gate, call *) + Printf.printf " Trying formula 2: [7 [[0 2] gate] [9 2 [0 1]]]...\n"; + let poke_formula = Noun.cell (Noun.atom 7) + (Noun.cell + (Noun.cell (Noun.cell (Noun.atom 0) (Noun.atom 2)) gate) (* [event gate] *) + (Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))))) in (* call arm 2 *) + + let start = Unix.gettimeofday () in + let result = Nock.nock_on poke_subject poke_formula in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf " ✓ POKE SUCCEEDED in %.4fs!\n" elapsed; + Printf.printf " Result is: %s\n\n" + (if Noun.is_cell result then "Cell (new state + effects)" else "Atom"); + + Printf.printf "🎉 WE CAN CALL ARVO!\n" + with e -> + Printf.printf "✗ Call failed: %s\n\n" (Printexc.to_string e) + end else + Printf.printf "not a gate\n" + + with e -> + Printf.printf "✗ %s\n" (Printexc.to_string e) + ) test_paths + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Extracting and Testing Real Arvo\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_real_arvo diff --git a/ocaml/test/old/test_roundtrip.ml b/ocaml/test/old/test_roundtrip.ml new file mode 100644 index 0000000..4a4e635 --- /dev/null +++ b/ocaml/test/old/test_roundtrip.ml @@ -0,0 +1,15 @@ +open Nock_lib.Noun +open Nock_lib.Serial + +let () = + Printf.printf "Testing roundtrip...\n"; + let n = atom 42 in + for i = 1 to 5 do + Printf.printf "Iteration %d\n" i; + let j = jam n in + Printf.printf " jammed: %s\n" (bytes_to_hex j); + let c = cue j in + Format.printf " cued: %a\n" pp_noun c; + flush stdout + done; + Printf.printf "Done!\n" diff --git a/ocaml/test/old/test_runtime.ml b/ocaml/test/old/test_runtime.ml new file mode 100644 index 0000000..ff0514c --- /dev/null +++ b/ocaml/test/old/test_runtime.ml @@ -0,0 +1,178 @@ +(* Runtime Tests - Testing the Eio-based Urbit runtime + * + * Tests: + * 1. Basic runtime creation + * 2. Event processing + * 3. Effect execution + * 4. Timer driver (Behn) + * 5. Concurrent event processing + *) + +open Nock_lib + +let test_runtime_creation env = + Printf.printf "Test: Runtime creation...\n"; + + (* Create pier directory *) + (try Unix.mkdir "tmp/test_pier" 0o755 with _ -> ()); + + let config = Runtime.default_config ~pier_path:"tmp/test_pier" () in + let events = [ + Noun.atom 1; + Noun.atom 2; + Noun.atom 3; + ] in + + let runtime = Runtime.run_simple ~env config events in + let stats = Runtime.get_stats runtime in + + Printf.printf " Events processed: %Ld\n" stats.events_processed; + Printf.printf " State: %s\n" stats.state_summary; + + assert (stats.events_processed = 3L); + + Printf.printf " ✓ Runtime created and processed events!\n\n" + +let test_effect_queue _env = + Printf.printf "Test: Effect queue...\n"; + + let queue = Nock_lib.Effects.create_queue () in + + (* Add some effects *) + Nock_lib.Effects.enqueue queue (Nock_lib.Effects.Log "Test message 1"); + Nock_lib.Effects.enqueue queue (Nock_lib.Effects.SetTimer { id = 1L; time = 123.0 }); + Nock_lib.Effects.enqueue queue (Nock_lib.Effects.Log "Test message 2"); + + Printf.printf " Queue length: %d\n" (Nock_lib.Effects.queue_length queue); + assert (Nock_lib.Effects.queue_length queue = 3); + + (* Dequeue *) + let eff1 = Nock_lib.Effects.dequeue queue in + (match eff1 with + | Nock_lib.Effects.Log msg -> Printf.printf " Dequeued: Log(%s)\n" msg + | _ -> failwith "Wrong effect type" + ); + + assert (Nock_lib.Effects.queue_length queue = 2); + + Printf.printf " ✓ Effect queue works!\n\n" + +let test_behn_driver env = + Printf.printf "Test: Behn timer driver...\n"; + + Eio.Switch.run @@ fun _sw -> + + let behn = Io_drivers.Behn.create () in + let now = Unix.gettimeofday () in + + (* Set a timer for 0.1 seconds from now *) + Io_drivers.Behn.set_timer behn ~id:1L ~fire_time:(now +. 0.1); + + Printf.printf " Active timers: %d\n" (Io_drivers.Behn.active_timers behn); + assert (Io_drivers.Behn.active_timers behn = 1); + + (* Sleep to let timer fire *) + Eio.Time.sleep (Eio.Stdenv.clock env) 0.2; + + Printf.printf " Active timers after fire: %d\n" (Io_drivers.Behn.active_timers behn); + + Printf.printf " ✓ Behn driver works!\n\n" + +let test_timer_cancellation env = + Printf.printf "Test: Timer cancellation...\n"; + + Eio.Switch.run @@ fun _sw -> + + let behn = Io_drivers.Behn.create () in + let now = Unix.gettimeofday () in + + (* Set a timer *) + Io_drivers.Behn.set_timer behn ~id:1L ~fire_time:(now +. 1.0); + assert (Io_drivers.Behn.active_timers behn = 1); + + (* Cancel it immediately *) + Io_drivers.Behn.cancel_timer behn ~id:1L; + + (* Sleep *) + Eio.Time.sleep (Eio.Stdenv.clock env) 0.1; + + Printf.printf " ✓ Timer cancelled successfully!\n\n" + +let test_concurrent_timers env = + Printf.printf "Test: Concurrent timers...\n"; + + Eio.Switch.run @@ fun sw -> + + let behn = Io_drivers.Behn.create () in + let effect_queue = Nock_lib.Effects.create_queue () in + let event_stream = Eio.Stream.create 100 in + + let now = Unix.gettimeofday () in + + (* Set multiple timers with different delays *) + let timer_ids = [1L; 2L; 3L; 4L; 5L] in + List.iteri (fun i id -> + let delay = 0.05 *. float_of_int (i + 1) in + Nock_lib.Effects.enqueue effect_queue (Nock_lib.Effects.SetTimer { + id; + time = now +. delay; + }) + ) timer_ids; + + Printf.printf " Set %d timers\n" (List.length timer_ids); + + (* Run behn driver fiber with timeout *) + Eio.Fiber.fork ~sw (fun () -> + (* Run for limited time *) + let start = Unix.gettimeofday () in + let rec loop () = + if Unix.gettimeofday () -. start < 0.5 then begin + match Nock_lib.Effects.try_dequeue effect_queue with + | Some (Nock_lib.Effects.SetTimer { id; time }) -> + Io_drivers.Behn.set_timer behn ~id ~fire_time:time; + let timer = Hashtbl.find behn.timers id in + Eio.Fiber.fork ~sw (fun () -> + Io_drivers.Behn.timer_fiber behn ~env ~event_stream timer + ); + loop () + | _ -> + Eio.Time.sleep (Eio.Stdenv.clock env) 0.01; + loop () + end + in + loop () + ); + + (* Sleep to allow driver to run *) + Eio.Time.sleep (Eio.Stdenv.clock env) 0.6; + + (* Count events produced *) + let event_count = ref 0 in + while Eio.Stream.length event_stream > 0 do + let _ = Eio.Stream.take event_stream in + event_count := !event_count + 1 + done; + + Printf.printf " Events produced: %d\n" !event_count; + Printf.printf " ✓ Concurrent timers work!\n\n" + +let () = + Eio_main.run @@ fun env -> + Printf.printf "\n🚀 === EIO RUNTIME TESTS === 🚀\n\n"; + + (* Clean up test directories *) + (try Unix.system "rm -rf tmp/test_pier*" |> ignore with _ -> ()); + + test_runtime_creation env; + test_effect_queue env; + test_behn_driver env; + test_timer_cancellation env; + test_concurrent_timers env; + + Printf.printf "🎉 === ALL RUNTIME TESTS PASSED! === 🎉\n"; + Printf.printf "\nThe Eio runtime is working!\n"; + Printf.printf "- Event processing ✓\n"; + Printf.printf "- Effect execution ✓\n"; + Printf.printf "- Timer driver (Behn) ✓\n"; + Printf.printf "- Concurrent fibers ✓\n\n"; + Printf.printf "Ready for a full runtime with all I/O drivers!\n" diff --git a/ocaml/test/old/test_serial.ml b/ocaml/test/old/test_serial.ml new file mode 100644 index 0000000..fca30f8 --- /dev/null +++ b/ocaml/test/old/test_serial.ml @@ -0,0 +1,185 @@ +open Nock_lib.Noun +open Nock_lib.Serial + +(** Test utilities *) + +let assert_equal expected actual msg = + if not (equal expected actual) then begin + Printf.printf "FAIL: %s\n" msg; + Format.printf " Expected: %a@." pp_noun expected; + Format.printf " Actual: %a@." pp_noun actual; + exit 1 + end else + Printf.printf "PASS: %s\n" msg + +let _assert_bytes_equal expected actual msg = + if expected <> actual then begin + Printf.printf "FAIL: %s\n" msg; + Printf.printf " Expected: %s\n" (bytes_to_hex expected); + Printf.printf " Actual: %s\n" (bytes_to_hex actual); + exit 1 + end else + Printf.printf "PASS: %s\n" msg + +(** Round-trip test: jam then cue should give original *) +let test_roundtrip noun msg = + let jammed = jam noun in + let cued = cue jammed in + assert_equal noun cued msg + +(** Test basic atoms *) +let test_atoms () = + Printf.printf "\n=== Testing atom serialization ===\n"; + + (* Test 0 *) + let n = atom 0 in + test_roundtrip n "atom 0 roundtrip"; + + (* Test small atoms *) + test_roundtrip (atom 1) "atom 1 roundtrip"; + test_roundtrip (atom 2) "atom 2 roundtrip"; + test_roundtrip (atom 42) "atom 42 roundtrip"; + test_roundtrip (atom 255) "atom 255 roundtrip"; + test_roundtrip (atom 256) "atom 256 roundtrip"; + + (* Test larger atoms *) + test_roundtrip (atom 65535) "atom 65535 roundtrip"; + test_roundtrip (atom 1000000) "atom 1000000 roundtrip" + +(** Test basic cells *) +let test_cells () = + Printf.printf "\n=== Testing cell serialization ===\n"; + + (* Simple cell [1 2] *) + let c = cell (atom 1) (atom 2) in + test_roundtrip c "cell [1 2] roundtrip"; + + (* Nested cells [[1 2] 3] *) + let c = cell (cell (atom 1) (atom 2)) (atom 3) in + test_roundtrip c "cell [[1 2] 3] roundtrip"; + + (* Deep nesting *) + let c = cell (cell (cell (atom 1) (atom 2)) (atom 3)) (atom 4) in + test_roundtrip c "cell [[[1 2] 3] 4] roundtrip"; + + (* Larger values *) + let c = cell (atom 1000) (atom 2000) in + test_roundtrip c "cell [1000 2000] roundtrip" + +(** Test trees *) +let test_trees () = + Printf.printf "\n=== Testing tree serialization ===\n"; + + (* Binary tree *) + let tree = cell (cell (atom 1) (atom 2)) (cell (atom 3) (atom 4)) in + test_roundtrip tree "binary tree roundtrip"; + + (* Unbalanced tree *) + let tree = cell (atom 1) (cell (atom 2) (cell (atom 3) (atom 4))) in + test_roundtrip tree "right-leaning tree roundtrip"; + + (* List-like structure [1 [2 [3 0]]] *) + let list = cell (atom 1) (cell (atom 2) (cell (atom 3) (atom 0))) in + test_roundtrip list "list-like structure roundtrip" + +(** Test backreferences + + When the same sub-noun appears multiple times, jam should use backreferences +*) +let test_backrefs () = + Printf.printf "\n=== Testing backreferences ===\n"; + + (* Create a noun with shared structure: [42 42] + The second 42 should be a backref to the first *) + let shared = atom 42 in + let n = cell shared shared in + test_roundtrip n "shared atom [42 42] roundtrip"; + + (* More complex sharing: [[1 2] [1 2]] + Second cell should backref to first *) + let sub = cell (atom 1) (atom 2) in + let n = cell sub sub in + test_roundtrip n "shared cell [[1 2] [1 2]] roundtrip"; + + (* Test that backrefs actually save space *) + let sub = cell (atom 100) (atom 200) in + let with_backref = cell sub sub in + let without_backref = cell (cell (atom 100) (atom 200)) (cell (atom 100) (atom 200)) in + + let jammed_with = jam with_backref in + let jammed_without = jam without_backref in + + Printf.printf " Shared structure size: %d bytes\n" (Bytes.length jammed_with); + Printf.printf " Duplicated structure size: %d bytes\n" (Bytes.length jammed_without); + + (* Note: Due to how OCaml constructs values, physical equality might not work as expected, + but logical equality should still work for roundtrip *) + test_roundtrip with_backref "backref optimization roundtrip" + +(** Test known encodings + + These test vectors would ideally come from the Vere test suite or Urbit dojo +*) +let test_known_encodings () = + Printf.printf "\n=== Testing known encodings ===\n"; + + (* We can generate these from Urbit with (jam 0), (jam 1), etc. *) + + (* jam of 0 should be simple *) + let n = atom 0 in + let jammed = jam n in + Printf.printf " jam(0) = %s (%d bytes)\n" (bytes_to_hex jammed) (Bytes.length jammed); + test_roundtrip n "known encoding: 0"; + + (* jam of 1 *) + let n = atom 1 in + let jammed = jam n in + Printf.printf " jam(1) = %s (%d bytes)\n" (bytes_to_hex jammed) (Bytes.length jammed); + test_roundtrip n "known encoding: 1"; + + (* jam of [0 0] *) + let n = cell (atom 0) (atom 0) in + let jammed = jam n in + Printf.printf " jam([0 0]) = %s (%d bytes)\n" (bytes_to_hex jammed) (Bytes.length jammed); + test_roundtrip n "known encoding: [0 0]" + +(** Test edge cases *) +let test_edge_cases () = + Printf.printf "\n=== Testing edge cases ===\n"; + + (* Very large atom *) + let big = Atom (Z.of_string "123456789012345678901234567890") in + test_roundtrip big "very large atom roundtrip"; + + (* Deep nesting *) + let rec make_deep n = + if n = 0 then atom 0 + else cell (atom n) (make_deep (n - 1)) + in + let deep = make_deep 50 in + test_roundtrip deep "deeply nested structure (50 levels) roundtrip"; + + (* Wide tree *) + let rec make_wide n = + if n = 0 then atom 0 + else cell (make_wide (n - 1)) (make_wide (n - 1)) + in + let wide = make_wide 6 in (* 2^6 = 64 leaves *) + test_roundtrip wide "wide binary tree (6 levels) roundtrip" + +(** Run all tests *) +let () = + Printf.printf "=================================\n"; + Printf.printf "Jam/Cue Serialization Test Suite\n"; + Printf.printf "=================================\n"; + + test_atoms (); + test_cells (); + test_trees (); + test_backrefs (); + test_known_encodings (); + test_edge_cases (); + + Printf.printf "\n=================================\n"; + Printf.printf "All tests passed!\n"; + Printf.printf "=================================\n" diff --git a/ocaml/test/old/test_slam_directly.ml b/ocaml/test/old/test_slam_directly.ml new file mode 100644 index 0000000..d7248f5 --- /dev/null +++ b/ocaml/test/old/test_slam_directly.ml @@ -0,0 +1,108 @@ +(* Test slamming poke gates directly *) + +open Nock_lib + +let slam_on gate event = + (* C Vere slam_on: [battery [new-sample context]] *) + let battery = Noun.head gate in + let context = Noun.tail (Noun.tail gate) in (* slot 7 *) + let new_core = Noun.cell battery (Noun.cell event context) in + + (* Kick arm 2: [9 2 0 1] *) + let kick_formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + + Nock.nock_on new_core kick_formula + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let test_slam _env = + Printf.printf "Testing direct slam on poke gates...\n\n"; + + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (_tag, events) -> + let event_list = to_list [] events in + + begin match List.nth_opt event_list 1 with + | Some kernel -> + (* Build test event: [now ovum] where ovum = [wire card] *) + Printf.printf "Building test event...\n"; + let wire = Noun.atom 0 in + let card = Noun.cell (Noun.atom 1953719668) (Noun.atom 42) in + let ovum = Noun.cell wire card in + let now = Noun.atom 0 in + let event = Noun.cell now ovum in + Printf.printf " Event: [0 [0 [1953719668 42]]]\n\n"; + + (* Try slot 23 *) + Printf.printf "=== Testing Slot 23 ===\n"; + begin try + let poke_gate = Noun.slot (Z.of_int 23) kernel in + Printf.printf "Slamming slot 23 gate...\n"; + + let start = Unix.gettimeofday () in + let result = slam_on poke_gate event in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf "✓ Slam succeeded in %.4fs!\n\n" elapsed; + + begin match result with + | Noun.Cell (_effects, _new_kernel) -> + Printf.printf "🎉 SLOT 23 WORKS! Result is [effects new-kernel]\n\n" + | Noun.Atom _ -> + Printf.printf "Result is atom (unexpected)\n\n" + end + + with + | Noun.Exit -> + Printf.printf "✗ Slam failed (Nock Exit)\n\n" + | e -> + Printf.printf "✗ Error: %s\n\n" (Printexc.to_string e) + end; + + (* Try slot 42 *) + Printf.printf "=== Testing Slot 42 ===\n"; + begin try + let poke_gate = Noun.slot (Z.of_int 42) kernel in + Printf.printf "Slamming slot 42 gate...\n"; + + let start = Unix.gettimeofday () in + let result = slam_on poke_gate event in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf "✓ Slam succeeded in %.4fs!\n\n" elapsed; + + begin match result with + | Noun.Cell (_effects, _new_kernel) -> + Printf.printf "🎉 SLOT 42 WORKS! Result is [effects new-kernel]\n\n" + | Noun.Atom _ -> + Printf.printf "Result is atom (unexpected)\n\n" + end + + with + | Noun.Exit -> + Printf.printf "✗ Slam failed (Nock Exit)\n\n" + | e -> + Printf.printf "✗ Error: %s\n\n" (Printexc.to_string e) + end + + | None -> + Printf.printf "No event 1\n" + end + + | Noun.Atom _ -> + Printf.printf "Pill is atom\n" + +let () = + Printf.printf "\n═══════════════════════════════════════════\n"; + Printf.printf " Test Direct Slam on Poke Gates\n"; + Printf.printf "═══════════════════════════════════════════\n\n"; + Eio_main.run test_slam diff --git a/ocaml/test/old/test_solid_boot.ml b/ocaml/test/old/test_solid_boot.ml new file mode 100644 index 0000000..08382da --- /dev/null +++ b/ocaml/test/old/test_solid_boot.ml @@ -0,0 +1,116 @@ +(* Test Solid Pill Boot + * + * Try loading solid pill which contains full Arvo kernel + *) + +open Nock_lib + +let test_solid_boot env = + Printf.printf "🎯 Testing Solid Pill Boot\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Load solid pill *) + Printf.printf "Loading solid pill (this may take a while)...\n"; + let file_path = Eio.Path.(fs / "solid.pill") in + let pill_bytes = Eio.Path.load file_path |> Bytes.of_string in + + Printf.printf "Pill size: %.1f MB\n" + (float_of_int (Bytes.length pill_bytes) /. 1024.0 /. 1024.0); + + let start = Unix.gettimeofday () in + let pill = Serial.cue pill_bytes in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf "Cued in %.2fs\n\n" elapsed; + + (* Examine structure *) + Printf.printf "Examining solid pill structure:\n"; + if Noun.is_cell pill then begin + Printf.printf " ✓ Is cell\n"; + + (* Check for tag *) + let head = Noun.head pill in + let tail = Noun.tail pill in + + Printf.printf " Head: %s\n" (if Noun.is_cell head then "Cell" else "Atom"); + (match head with + | Noun.Atom z -> + Printf.printf " Value: %s\n" (Z.to_string z); + Printf.printf " Hex: 0x%s\n" (Z.format "x" z) + | _ -> ()); + + Printf.printf " Tail: %s\n\n" (if Noun.is_cell tail then "Cell" else "Atom"); + + (* Try to navigate to Arvo core at known path *) + Printf.printf "Navigating to Arvo core at [3 3 2 3 2 3 3 2]...\n"; + let path = [3; 3; 2; 3; 2; 3; 3; 2] in + let rec navigate noun = function + | [] -> noun + | slot :: rest -> + navigate (Noun.slot (Z.of_int slot) noun) rest + in + + try + let arvo = navigate tail path in + Printf.printf " ✓ Found Arvo core\n\n"; + + (* Test for slot 23 *) + Printf.printf "Testing for slot 23 (poke interface)...\n"; + (try + let slot_23 = Noun.slot (Z.of_int 23) arvo in + Printf.printf " ✓ Slot 23 exists!\n"; + Printf.printf " Type: %s\n\n" + (if Noun.is_cell slot_23 then "Cell (formula)" else "Atom"); + + (* Try C Vere poke sequence *) + Printf.printf "Attempting poke sequence:\n"; + Printf.printf " 1. Run slot 23 formula on Arvo core\n"; + + let start = Unix.gettimeofday () in + let poke_gate = Nock.nock_on arvo slot_23 in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf " ✓ Got poke gate (%.4fs)\n" elapsed; + + Printf.printf " 2. Slam poke gate with test event\n"; + let event = Noun.cell (Noun.atom 0) (Noun.atom 42) in + + (* Slam: [battery [event context]] *) + let battery = Noun.head poke_gate in + let context = Noun.tail (Noun.tail poke_gate) in + let new_core = Noun.cell battery (Noun.cell event context) in + let kick_formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + + Printf.printf " 3. Call arm 2\n"; + let start = Unix.gettimeofday () in + let result = Nock.nock_on new_core kick_formula in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf " ✓ Poke succeeded in %.4fs!\n" elapsed; + Printf.printf " Result: %s\n\n" + (if Noun.is_cell result then "Cell (effects + new state)" else "Atom"); + + Printf.printf "🎉 SOLID PILL WORKS!\n"; + Printf.printf "We have successfully poked Arvo!\n" + + with e -> + Printf.printf " ✗ Slot 23 test failed: %s\n" (Printexc.to_string e)) + + with e -> + Printf.printf " ✗ Navigation failed: %s\n" (Printexc.to_string e) + + end else + Printf.printf " ✗ Not a cell\n" + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Testing Solid Pill Boot\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_solid_boot diff --git a/ocaml/test/old/test_solid_cvere_pattern.ml b/ocaml/test/old/test_solid_cvere_pattern.ml new file mode 100644 index 0000000..a0a4c58 --- /dev/null +++ b/ocaml/test/old/test_solid_cvere_pattern.ml @@ -0,0 +1,129 @@ +(* Test C Vere poke pattern on solid pill *) + +open Nock_lib + +let slam_on gate event = + (* C Vere slam_on: [battery [new-sample context]] *) + let battery = Noun.head gate in + let context = Noun.tail (Noun.tail gate) in (* slot 7 *) + let new_core = Noun.cell battery (Noun.cell event context) in + + (* Kick arm 2: [9 2 0 1] *) + let kick_formula = Noun.cell (Noun.atom 9) + (Noun.cell (Noun.atom 2) + (Noun.cell (Noun.atom 0) (Noun.atom 1))) in + + Nock.nock_on new_core kick_formula + +let rec to_list acc noun = + match noun with + | Noun.Atom _ -> List.rev acc + | Noun.Cell (item, rest) -> to_list (item :: acc) rest + +let test_poke _env = + Printf.printf "🎯 Testing C Vere Pattern on Solid Pill\n\n"; + + (* Load solid pill *) + Printf.printf "Loading solid pill...\n"; + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + + match pill with + | Noun.Cell (_tag, events) -> + let event_list = to_list [] events in + Printf.printf "Found %d events\n\n" (List.length event_list); + + (* Event 1 is the initial kernel *) + begin match List.nth_opt event_list 1 with + | Some kernel -> + Printf.printf "Testing on Event 1 (initial kernel):\n\n"; + + (* Try slot 23 (C Vere pattern) *) + Printf.printf "Step 1: Get formula from slot 23...\n"; + begin try + let slot_23_formula = Noun.slot (Z.of_int 23) kernel in + Printf.printf " ✓ Found formula at slot 23\n\n"; + + Printf.printf "Step 2: Run formula to compute poke gate...\n"; + let poke_gate = Nock.nock_on kernel slot_23_formula in + Printf.printf " ✓ Computed poke gate\n\n"; + + Printf.printf "Step 3: Build test event...\n"; + (* Build proper ovum: [wire card] *) + let wire = Noun.atom 0 in + let card = Noun.cell (Noun.atom 1953719668) (Noun.atom 42) in + let ovum = Noun.cell wire card in + + (* Build poke args: [now ovum] *) + let now = Noun.atom 0 in + let event = Noun.cell now ovum in + Printf.printf " Event: [now [wire card]]\n\n"; + + Printf.printf "Step 4: Slam poke gate...\n"; + let start = Unix.gettimeofday () in + let result = slam_on poke_gate event in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf " ✓ Poke succeeded in %.4fs!\n\n" elapsed; + + begin match result with + | Noun.Cell (_effects, _new_kernel) -> + Printf.printf "Result: [effects new-kernel]\n"; + Printf.printf " ✓ Got expected structure!\n\n"; + Printf.printf "🎉 SOLID PILL ARVO IS WORKING!\n" + | Noun.Atom _ -> + Printf.printf "Result is atom (unexpected)\n" + end + + with + | Noun.Exit -> + Printf.printf " ✗ Nock failed (Exit)\n\n"; + + (* Try slot 42 instead *) + Printf.printf "Trying slot 42 instead...\n"; + begin try + let slot_42 = Noun.slot (Z.of_int 42) kernel in + Printf.printf " ✓ Found something at slot 42\n"; + + (* Check if it's a formula or a gate *) + Printf.printf " Attempting to use as formula...\n"; + let poke_gate = Nock.nock_on kernel slot_42 in + Printf.printf " ✓ Computed gate from slot 42\n\n"; + + let wire = Noun.atom 0 in + let card = Noun.cell (Noun.atom 1953719668) (Noun.atom 42) in + let ovum = Noun.cell wire card in + let now = Noun.atom 0 in + let event = Noun.cell now ovum in + + let result = slam_on poke_gate event in + Printf.printf " ✓ Poke with slot 42 succeeded!\n\n"; + + begin match result with + | Noun.Cell _ -> + Printf.printf "🎉 SLOT 42 WORKS!\n" + | Noun.Atom _ -> + Printf.printf "Result is atom\n" + end + + with + | Noun.Exit -> Printf.printf " ✗ Slot 42 also failed\n" + | Not_found -> Printf.printf " ✗ No slot 42\n" + end + | Not_found -> + Printf.printf " ✗ No slot 23 found\n" + end + + | None -> + Printf.printf "✗ No event 1\n" + end + + | Noun.Atom _ -> + Printf.printf "✗ Pill is atom\n" + +let () = + Printf.printf "\n═══════════════════════════════════════════════════════════\n"; + Printf.printf " Test C Vere Pattern on Solid Pill\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n\n"; + Eio_main.run test_poke diff --git a/ocaml/test/old/test_solid_structure.ml b/ocaml/test/old/test_solid_structure.ml new file mode 100644 index 0000000..21a9433 --- /dev/null +++ b/ocaml/test/old/test_solid_structure.ml @@ -0,0 +1,119 @@ +(* Explore solid pill structure to find Arvo *) + +open Nock_lib + +let test_solid env = + Printf.printf "🔍 Exploring Solid Pill Structure\n\n"; + + Eio.Switch.run @@ fun _sw -> + let _fs = Eio.Stdenv.fs env in + + (* Load solid pill (use cached .noun for speed) *) + Printf.printf "Loading solid pill from cache...\n"; + let in_channel = open_in_bin "solid.noun" in + let pill = (Marshal.from_channel in_channel : Noun.noun) in + close_in in_channel; + Printf.printf "✓ Loaded from solid.noun\n\n"; + + (* Solid pill structure: [tag boot-events] *) + match pill with + | Noun.Atom _ -> + Printf.printf "✗ Pill is an atom (unexpected)\n" + + | Noun.Cell (tag, events) -> + Printf.printf "Pill structure: [tag events]\n"; + begin match tag with + | Noun.Atom a -> + Printf.printf " Tag: %s (hex: 0x%s)\n" + (Z.to_string a) (Z.format "x" a) + | _ -> Printf.printf " Tag: cell\n" + end; + + (* Events should be a list *) + Printf.printf "\nExploring boot events...\n"; + let rec count_list n noun = + match noun with + | Noun.Atom _ -> (n, noun) (* terminator *) + | Noun.Cell (item, rest) -> + Printf.printf " Event %d: %s\n" n + (match item with + | Noun.Atom _ -> "atom" + | Noun.Cell _ -> "cell"); + count_list (n + 1) rest + in + + let (event_count, terminator) = count_list 0 events in + Printf.printf "\nTotal events: %d\n" event_count; + Printf.printf "Terminator: %s\n\n" + (match terminator with + | Noun.Atom a -> Printf.sprintf "atom %s" (Z.to_string a) + | Noun.Cell _ -> "cell"); + + (* The 5th event should be the final Arvo kernel *) + Printf.printf "Extracting final Arvo kernel (last event)...\n"; + let rec get_last noun = + match noun with + | Noun.Atom _ -> None + | Noun.Cell (item, rest) -> + match rest with + | Noun.Atom _ -> Some item (* This is the last *) + | Noun.Cell _ -> get_last rest + in + + match get_last events with + | None -> Printf.printf "✗ Could not find last event\n" + | Some last_event -> + Printf.printf "✓ Found last event\n"; + + (* Last event structure: [wire card] where card produces Arvo *) + begin match last_event with + | Noun.Cell (_wire, card) -> + Printf.printf " Event is [wire card]\n"; + Printf.printf " Card: %s\n\n" + (match card with + | Noun.Atom _ -> "atom" + | Noun.Cell _ -> "cell"); + + (* Try to run this event to get Arvo *) + Printf.printf "Attempting to extract Arvo kernel...\n"; + + (* The card might be the kernel directly, or we need to eval it *) + (* Let's check if card has the poke interface at slot 23 *) + begin try + let potential_arvo = card in + let _gate = Noun.slot (Z.of_int 23) potential_arvo in + Printf.printf "✓ Found gate at slot 23 in card!\n"; + Printf.printf "\nThis looks like the Arvo kernel!\n"; + Printf.printf "Let's explore it...\n\n"; + + (* Show structure *) + for i = 2 to 30 do + try + let slot_val = Noun.slot (Z.of_int i) potential_arvo in + let typ = match slot_val with + | Noun.Cell _ -> "cell" + | Noun.Atom _ -> "atom" + in + Printf.printf " Slot %d: %s\n" i typ + with _ -> () + done; + + Printf.printf "\n🎉 Found Arvo in solid pill!\n" + + with _ -> + Printf.printf "✗ No gate at slot 23\n"; + Printf.printf "Card might need to be evaluated first\n" + end + + | _ -> + Printf.printf " Event is not a cell\n" + end + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Exploring Solid Pill Structure\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_solid diff --git a/ocaml/test/old/test_state.ml b/ocaml/test/old/test_state.ml new file mode 100644 index 0000000..1c841c8 --- /dev/null +++ b/ocaml/test/old/test_state.ml @@ -0,0 +1,165 @@ +(* State Management Tests - Domain-safe state with Eio + * + * Tests: + * 1. Basic state creation and access + * 2. Atomic event counter + * 3. Save/load snapshots + * 4. Concurrent access across domains (future) + *) + +open Nock_lib + +let test_basic_state _env = + Printf.printf "Test: Basic state creation and access...\n"; + + let state = State.create () in + + (* Check initial values *) + let eve = State.event_num state in + Printf.printf " Initial event number: %Ld\n" eve; + assert (eve = 0L); + + (* Create a simple kernel state *) + let kernel = Noun.cell (Noun.atom 1) (Noun.atom 2) in + State.boot state kernel; + + let arvo = State.get_arvo state in + Printf.printf " Kernel state loaded\n"; + assert (arvo = kernel); + + Printf.printf " ✓ Basic state operations work!\n\n" + +let test_atomic_counter _env = + Printf.printf "Test: Atomic event counter...\n"; + + let state = State.create () in + + (* Initial counter *) + assert (State.event_num state = 0L); + + (* Increment a few times *) + for _i = 1 to 10 do + let _old = State.inc_event state in + () + done; + + let final = State.event_num state in + Printf.printf " After 10 increments: %Ld\n" final; + assert (final = 10L); + + Printf.printf " ✓ Atomic counter works!\n\n" + +let test_snapshot_save_load env = + Printf.printf "Test: Snapshot save/load...\n"; + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Create state with some data *) + let state1 = State.create () in + let kernel = Noun.cell + (Noun.cell (Noun.atom 42) (Noun.atom 99)) + (Noun.atom 1000000) in + State.boot state1 kernel; + + (* Increment event counter *) + for _i = 1 to 5 do + let _ = State.inc_event state1 in + () + done; + + Printf.printf " State before save: %s\n" (State.summary state1); + + (* Save snapshot *) + State.save_snapshot state1 ~fs "tmp/test_state.snapshot"; + Printf.printf " Snapshot saved\n"; + + (* Create new state and load snapshot *) + let state2 = State.create () in + let result = State.load_snapshot state2 ~fs "tmp/test_state.snapshot" in + + match result with + | Ok eve -> + Printf.printf " Snapshot loaded, event: %Ld\n" eve; + Printf.printf " State after load: %s\n" (State.summary state2); + + (* Verify event number *) + assert (State.event_num state2 = 5L); + + (* Verify kernel state *) + let loaded_kernel = State.get_arvo state2 in + assert (loaded_kernel = kernel); + + Printf.printf " ✓ Snapshot save/load works!\n\n" + | Error msg -> + failwith ("Snapshot load failed: " ^ msg) + +let test_poke env = + Printf.printf "Test: Poke (event processing)...\n"; + Eio.Switch.run @@ fun _sw -> + let _fs = Eio.Stdenv.fs env in + + let state = State.create () in + + (* Boot with a simple kernel *) + State.boot state (Noun.atom 0); + assert (State.event_num state = 0L); + + (* Poke with an event *) + let event = Noun.cell (Noun.atom 1) (Noun.atom 2) in + let _effects = State.poke state event in + + (* Event number should have incremented *) + assert (State.event_num state = 1L); + Printf.printf " Event processed, new event number: %Ld\n" (State.event_num state); + + (* Poke again *) + let _effects = State.poke state event in + assert (State.event_num state = 2L); + + Printf.printf " ✓ Poke increments event counter!\n\n" + +let test_peek _env = + Printf.printf "Test: Peek (read-only queries)...\n"; + + let state = State.create () in + let kernel = Noun.atom 42 in + State.boot state kernel; + + (* Peek should return something (formula returns [path kernel]) *) + let result = State.peek state (Noun.atom 0) in + match result with + | Some _noun -> + (* Peek succeeded *) + Printf.printf " ✓ Peek works!\n\n" + | None -> + failwith "Peek returned None" + +let test_cache _env = + Printf.printf "Test: Wish cache...\n"; + + let state = State.create () in + + (* Check initial cache is empty *) + assert (String.contains (State.summary state) '0'); + + (* Clear cache (should be safe to call) *) + State.clear_cache state; + + Printf.printf " ✓ Cache operations work!\n\n" + +let () = + Eio_main.run @@ fun env -> + Printf.printf "\n=== State Management Tests (Domain-safe with Eio) ===\n\n"; + + (* Clean up old test files *) + (try Unix.system "rm -rf tmp/test_state*" |> ignore with _ -> ()); + + test_basic_state env; + test_atomic_counter env; + test_snapshot_save_load env; + test_poke env; + test_peek env; + test_cache env; + + Printf.printf "=== All state tests passed! ✓ ===\n"; + Printf.printf "\nNext: Test concurrent access across domains...\n" diff --git a/ocaml/test/old/test_two_phase_boot.ml b/ocaml/test/old/test_two_phase_boot.ml new file mode 100644 index 0000000..0669b92 --- /dev/null +++ b/ocaml/test/old/test_two_phase_boot.ml @@ -0,0 +1,42 @@ +(* Test Two-Phase Boot: Ivory → Solid + * + * This matches the C Vere boot flow: + * 1. Boot ivory pill (lite boot, creates minimal kernel) + * 2. Boot solid events (metamorphosis to full kernel) + *) + +open Nock_lib + +let test_boot env = + Printf.printf "🎯 Testing Two-Phase Boot (Ivory → Solid)\n\n"; + + Eio.Switch.run @@ fun _sw -> + let fs = Eio.Stdenv.fs env in + + (* Create runtime state *) + let state = State.create () in + + (* Boot with ivory + solid *) + match Boot.boot_solid ~fs state "ivory.pill" "solid.pill" with + | Error msg -> + Printf.printf "❌ Boot failed: %s\n" msg; + exit 1 + | Ok () -> + Printf.printf "✅ Boot succeeded!\n\n"; + + (* Check kernel state *) + let arvo = State.get_arvo state in + Printf.printf "Arvo kernel structure:\n"; + Printf.printf " Type: %s\n" + (if Noun.is_cell arvo then "Cell" else "Atom"); + + Printf.printf "\n🎉 TWO-PHASE BOOT COMPLETE!\n" + +let () = + Printf.printf "\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf " Testing Two-Phase Boot System\n"; + Printf.printf "═══════════════════════════════════════════════════════════\n"; + Printf.printf "\n"; + + Eio_main.run test_boot diff --git a/ocaml/test/old/test_two_stage_boot.ml b/ocaml/test/old/test_two_stage_boot.ml new file mode 100644 index 0000000..62d262d --- /dev/null +++ b/ocaml/test/old/test_two_stage_boot.ml @@ -0,0 +1,277 @@ +(* Two-Stage Boot Test - Exactly like C Vere *) + +open Nock_lib + +let () = Printf.printf "\n═══════════════════════════════════════════════════════\n"; + Printf.printf " Two-Stage Boot Test (C Vere Pattern)\n"; + Printf.printf "═══════════════════════════════════════════════════════\n\n" + +(* Stage 1: Boot ivory pill with null *) +let stage1_ivory_boot env = + Printf.printf "╔═══════════════════════════════════════╗\n"; + Printf.printf "║ STAGE 1: Ivory Pill Bootstrap ║\n"; + Printf.printf "╔═══════════════════════════════════════╗\n\n"; + + (* Load ivory pill *) + Printf.printf "[1] Loading ivory.pill...\n%!"; + let fs = Eio.Stdenv.fs env in + let pill_bytes = Eio.Path.(load (fs / "ivory.pill")) |> Bytes.of_string in + Printf.printf " Size: %d bytes (%.1f MB)\n%!" + (Bytes.length pill_bytes) + (float_of_int (Bytes.length pill_bytes) /. 1024.0 /. 1024.0); + + Printf.printf "[2] Cuing ivory pill...\n%!"; + let start = Unix.gettimeofday () in + let pill = Serial.cue pill_bytes in + let elapsed = Unix.gettimeofday () -. start in + Printf.printf " ✓ Cued in %.2fs\n\n%!" elapsed; + + (* Check ivory structure: ["ivory" core] *) + Printf.printf "[3] Parsing ivory pill structure...\n%!"; + match pill with + | Noun.Cell (tag, core) -> + (* Check tag *) + let tag_str = match tag with + | Noun.Atom z -> + let bytes = Z.to_bits z in + if String.length bytes <= 10 then bytes else "too-long" + | _ -> "not-atom" + in + Printf.printf " Tag: '%s'\n" tag_str; + Printf.printf " Core: %s\n\n" (if Noun.is_cell core then "cell" else "atom"); + + (* KEY DISCOVERY: The ivory pill tail IS the Arvo core! *) + Printf.printf "[4] Using ivory pill tail (Arvo core) for bootstrap...\n%!"; + Printf.printf " Ivory structure: [\"ivory\" ARVO_CORE]\n"; + Printf.printf " The tail is a CELL, not null!\n\n"; + + Printf.printf "[5] Running u3v_life() on Arvo core...\n%!"; + Printf.printf " Formula: [2 [0 3] [0 2]]\n"; + Printf.printf " Subject: Arvo core (cell)\n%!"; + + begin try + let start = Unix.gettimeofday () in + let kernel = Boot.life core in + let elapsed = Unix.gettimeofday () -. start in + + Printf.printf " ✓ SUCCESS! Kernel built in %.4fs\n\n" elapsed; + + (* Verify kernel has poke at slot 23 *) + Printf.printf "[6] Verifying kernel structure...\n%!"; + begin try + let poke = Noun.slot (Z.of_int 23) kernel in + Printf.printf " ✓ Has poke gate at slot 23\n"; + + (* Check structure at known slots to verify correctness *) + Printf.printf " Checking structural properties:\n"; + + (* Slot 2: should be battery (cell) *) + let slot2 = Noun.slot (Z.of_int 2) kernel in + Printf.printf " Slot 2 (battery): %s\n" + (if Noun.is_cell slot2 then "cell ✓" else "atom ✗"); + + (* Slot 3: should be payload (cell) *) + let slot3 = Noun.slot (Z.of_int 3) kernel in + Printf.printf " Slot 3 (payload): %s\n" + (if Noun.is_cell slot3 then "cell ✓" else "atom ✗"); + + (* Poke should be a cell (it's a gate) *) + Printf.printf " Slot 23 (poke): %s\n" + (if Noun.is_cell poke then "cell (gate) ✓" else "atom ✗"); + + (* Check head of poke (should be battery) *) + if Noun.is_cell poke then begin + let poke_battery = Noun.head poke in + Printf.printf " Poke battery: %s\n" + (if Noun.is_cell poke_battery then "cell ✓" else "atom ✗") + end; + + (* Compute mugs of small sub-structures for verification *) + Printf.printf " Computing mugs of sub-structures:\n"; + let slot2_mug = Noun.mug slot2 in + let slot3_mug = Noun.mug slot3 in + let poke_mug = Noun.mug poke in + Printf.printf " Slot 2 mug: 0x%lx\n" slot2_mug; + Printf.printf " Slot 3 mug: 0x%lx\n" slot3_mug; + Printf.printf " Poke mug: 0x%lx\n" poke_mug; + + Printf.printf "\n"; + Printf.printf "╔═══════════════════════════════════════╗\n"; + Printf.printf "║ ✓ STAGE 1 COMPLETE! ║\n"; + Printf.printf "╚═══════════════════════════════════════╝\n\n"; + + Printf.printf "⚠️ To verify correctness, compare these mugs with C:\n"; + Printf.printf " Run the C test and check if mugs match!\n\n"; + + (* Print cache stats *) + Noun.MugCache.stats (); + + Some kernel + + with _ -> + Printf.printf " ✗ No slot 23 - kernel invalid\n\n"; + None + end + + with + | Noun.Exit -> + Printf.printf " ✗ FAILED: Nock Exit\n\n"; + None + | e -> + Printf.printf " ✗ FAILED: %s\n\n" (Printexc.to_string e); + None + end + + | Noun.Atom _ -> + Printf.printf " ✗ Pill is atom (expected cell)\n\n"; + None + +(* Stage 2: Boot solid pill events *) +(* let stage2_solid_boot env _ivory_kernel = *) + (* Printf.printf "\n╔═══════════════════════════════════════╗\n"; *) + (* Printf.printf "║ STAGE 2: Solid Pill Events ║\n"; *) + (* Printf.printf "╚═══════════════════════════════════════╝\n\n"; *) + + (* Load solid pill *) + (* Printf.printf "[1] Loading solid.pill...\n%!"; *) + (* let fs = Eio.Stdenv.fs env in *) + (* let pill_bytes = Eio.Path.(load (fs / "solid.pill")) |> Bytes.of_string in *) + (* Printf.printf " Size: %d bytes (%.1f MB)\n%!" *) + (* (Bytes.length pill_bytes) *) + (* (float_of_int (Bytes.length pill_bytes) /. 1024.0 /. 1024.0); *) + + (* Printf.printf "[2] Cuing solid pill...\n%!"; *) + (* let start = Unix.gettimeofday () in *) + (* let pill = Serial.cue pill_bytes in *) + (* let elapsed = Unix.gettimeofday () -. start in *) + (* Printf.printf " ✓ Cued in %.2fs\n\n%!" elapsed; *) + + (* Parse structure: [%pill %solid [bot mod use]] *) + (* Printf.printf "[3] Parsing solid pill structure...\n%!"; *) + (* match pill with *) + (* | Noun.Cell (_tag, rest) -> *) + (* begin match rest with *) + (* | Noun.Cell (_typ, rest2) -> *) + (* Printf.printf " Tag: pill\n"; *) + (* Printf.printf " Type: solid\n"; *) + + (* begin match rest2 with *) + (* | Noun.Cell (bot, rest3) -> *) + (* Count bot events *) + (* let rec count_list acc n = *) + (* match n with *) + (* | Noun.Atom _ -> acc *) + (* | Noun.Cell (_, rest) -> count_list (acc + 1) rest *) + (* in *) + (* let bot_count = count_list 0 bot in *) + (* Printf.printf " Bot events: %d\n" bot_count; *) + + (* begin match rest3 with *) + (* | Noun.Cell (mod_, rest4) -> *) + (* let mod_count = count_list 0 mod_ in *) + (* Printf.printf " Mod events: %d\n" mod_count; *) + + (* begin match rest4 with *) + (* | Noun.Cell (use, _) -> *) + (* let use_count = count_list 0 use in *) + (* Printf.printf " Use events: %d\n" use_count; *) + + (* let total = bot_count + mod_count + use_count in *) + (* Printf.printf " Total: %d events\n\n" total; *) + + (* Concatenate all events into a single list *) + (* Printf.printf "[4] Concatenating all events...\n%!"; *) + (* let rec append_lists l1 l2 = *) + (* match l1 with *) + (* | Noun.Atom _ -> l2 *) + (* | Noun.Cell (h, t) -> Noun.cell h (append_lists t l2) *) + (* in *) + (* let all_events = append_lists bot (append_lists mod_ use) in *) + (* Printf.printf " ✓ Event list built\n\n"; *) + + (* Now run u3v_boot on all events *) + (* Printf.printf "[5] Running u3v_boot() on %d events...\n%!" total; *) + (* Printf.printf " This will call u3v_life() with the event list\n%!"; *) + + (* begin try *) + (* let start = Unix.gettimeofday () in *) + + (* Call the lifecycle formula on the event list *) + (* Printf.printf " Running [2 [0 3] [0 2]] on event list...\n%!"; *) + (* let kernel = Boot.life all_events in *) + + (* let elapsed = Unix.gettimeofday () -. start in *) + (* Printf.printf " ✓ SUCCESS! Kernel updated in %.4fs\n\n" elapsed; *) + + (* Verify kernel *) + (* Printf.printf "[6] Verifying updated kernel...\n%!"; *) + (* begin try *) + (* let _poke = Noun.slot (Z.of_int 23) kernel in *) + (* Printf.printf " ✓ Has poke gate at slot 23\n\n"; *) + + (* Printf.printf "╔═══════════════════════════════════════╗\n"; *) + (* Printf.printf "║ 🎉🎉🎉 FULL BOOT SUCCESS! 🎉🎉🎉 ║\n"; *) + (* Printf.printf "╚═══════════════════════════════════════╝\n\n"; *) + + (* Printf.printf "Boot sequence complete:\n"; *) + (* Printf.printf " 1. Stage 1: Ivory pill with null → Initial kernel\n"; *) + (* Printf.printf " 2. Stage 2: Solid pill %d events → Updated kernel\n" total; *) + (* Printf.printf " 3. Kernel is ready to receive pokes!\n\n"; *) + + (* true *) + + (* with _ -> *) + (* Printf.printf " ✗ No slot 23 in updated kernel\n\n"; *) + (* false *) + (* end *) + + (* with *) + (* | Noun.Exit -> *) + (* Printf.printf " ✗ FAILED: Nock Exit during lifecycle\n\n"; *) + (* false *) + + (* | e -> *) + (* Printf.printf " ✗ FAILED: %s\n\n" (Printexc.to_string e); *) + (* false *) + (* end *) + + (* | Noun.Atom _ -> *) + (* Printf.printf " ✗ rest4 is atom (expected use)\n"; *) + (* false *) + (* end *) + + (* | Noun.Atom _ -> *) + (* Printf.printf " ✗ rest3 is atom (expected [mod use])\n"; *) + (* false *) + (* end *) + + (* | Noun.Atom _ -> *) + (* Printf.printf " ✗ rest2 is atom (expected [bot mod use])\n"; *) + (* false *) + (* end *) + + (* | Noun.Atom _ -> *) + (* Printf.printf " ✗ rest is atom (expected [type ...])\n"; *) + (* false *) + (* end *) + + (* | Noun.Atom _ -> *) + (* Printf.printf " ✗ Pill is atom (expected cell)\n"; *) + (* false *) + +(* Main test *) +let main env = + (* Stage 1: Ivory *) + let _success = stage1_ivory_boot env in () + (* match stage1_ivory_boot env with *) + (* | Some ivory_kernel -> *) + (* Stage 2: Solid *) + (* let _success = stage2_solid_boot env ivory_kernel in *) + (* () *) + + (* | None -> *) + (* Printf.printf "╔═══════════════════════════════════════╗\n"; *) + (* Printf.printf "║ ✗ STAGE 1 FAILED - Cannot continue ║\n"; *) + (* Printf.printf "╚═══════════════════════════════════════╝\n\n" *) + +let () = Eio_main.run main diff --git a/ocaml/test/parse_solid_pill.ml b/ocaml/test/parse_solid_pill.ml deleted file mode 100644 index ef10785..0000000 --- a/ocaml/test/parse_solid_pill.ml +++ /dev/null @@ -1,190 +0,0 @@ -(* Parse solid pill structure to extract [bot mod use] *) - -open Nock_lib - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let parse_pill _env = - Printf.printf "═══════════════════════════════════════\n"; - Printf.printf " Parsing Solid Pill Structure\n"; - Printf.printf "═══════════════════════════════════════\n\n"; - - (* Load the pill *) - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - (* According to C Vere mars.c:1560, solid pill structure is: - * First we cue pil_p (the jammed pill data) - * Then we expect: [tag dat] - * Where: - * tag = %pill or %cash - * dat = [type [bot mod use]] or [[cache] [type [bot mod use]]] - *) - - Printf.printf "Step 1: Check outer structure\n"; - match pill with - | Noun.Cell (tag, rest) -> - Printf.printf " ✓ Pill is a cell [tag rest]\n"; - - (* Check what the tag is *) - begin match tag with - | Noun.Atom z -> - let tag_str = - try - let bytes = Z.to_bits z in - let len = String.length bytes in - if len > 0 && len <= 20 then - String.sub bytes 0 (min len 20) - else "too-long" - with _ -> "non-ascii" - in - Printf.printf " Tag (atom): %s\n" tag_str; - Printf.printf " Tag (hex): %s\n\n" (Z.format "x" z); - | Noun.Cell _ -> - Printf.printf " Tag is a cell (unexpected!)\n\n" - end; - - (* Now parse rest based on structure *) - Printf.printf "Step 2: Parse pill contents\n"; - - (* Try to extract as [type [bot mod use]] *) - begin match rest with - | Noun.Cell (typ, rest2) -> - Printf.printf " ✓ rest = [type rest2]\n"; - - begin match typ with - | Noun.Atom z -> - let typ_str = - try - let bytes = Z.to_bits z in - String.sub bytes 0 (min (String.length bytes) 20) - with _ -> "non-ascii" - in - Printf.printf " Type: %s\n\n" typ_str; - | Noun.Cell _ -> - Printf.printf " Type is cell\n\n" - end; - - (* Now try to parse rest2 as [bot mod use] *) - begin match rest2 with - | Noun.Cell (bot, rest3) -> - Printf.printf " ✓ Found bot (boot events)\n"; - let bot_list = to_list [] bot in - Printf.printf " Bot has %d events\n" (List.length bot_list); - - begin match rest3 with - | Noun.Cell (mod_, rest4) -> - Printf.printf " ✓ Found mod (module events)\n"; - let mod_list = to_list [] mod_ in - Printf.printf " Mod has %d events\n" (List.length mod_list); - - begin match rest4 with - | Noun.Cell (use, _) -> - Printf.printf " ✓ Found use (userspace events)\n"; - let use_list = to_list [] use in - Printf.printf " Use has %d events\n\n" (List.length use_list); - - (* Total events *) - let total = List.length bot_list + List.length mod_list + List.length use_list in - Printf.printf "═══════════════════════════════════════\n"; - Printf.printf " Summary\n"; - Printf.printf "═══════════════════════════════════════\n\n"; - Printf.printf "Total events: %d\n" total; - Printf.printf " Bot: %d events (lifecycle)\n" (List.length bot_list); - Printf.printf " Mod: %d events (vanes)\n" (List.length mod_list); - Printf.printf " Use: %d events (apps)\n\n" (List.length use_list); - - (* Concatenate all events *) - let all_events = bot_list @ mod_list @ use_list in - Printf.printf "Creating full event list...\n"; - - (* Convert list back to noun list (NOT a proper list yet) *) - let rec make_noun_list events = - match events with - | [] -> Noun.atom 0 (* null terminator *) - | [e] -> Noun.cell e (Noun.atom 0) - | e :: rest -> Noun.cell e (make_noun_list rest) - in - - let event_noun = make_noun_list all_events in - Printf.printf "✓ Event list created\n\n"; - - (* Now test functional BIOS formula! *) - Printf.printf "═══════════════════════════════════════\n"; - Printf.printf " Testing Functional BIOS Formula\n"; - Printf.printf "═══════════════════════════════════════\n\n"; - - Printf.printf "Formula: [2 [0 3] [0 2]]\n"; - Printf.printf "Subject: %d-event list\n\n" total; - - (* Build lifecycle formula: [2 [0 3] [0 2]] *) - let lyf = Noun.cell (Noun.atom 2) - (Noun.cell - (Noun.cell (Noun.atom 0) (Noun.atom 3)) - (Noun.cell (Noun.atom 0) (Noun.atom 2))) in - - Printf.printf "Running formula...\n%!"; - - begin try - let start = Unix.gettimeofday () in - let gat = Nock.nock_on event_noun lyf in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf "✓ Formula completed in %.4fs!\n\n" elapsed; - - (* Extract slot 7 *) - Printf.printf "Extracting kernel from slot 7...\n"; - let kernel = Noun.slot (Z.of_int 7) gat in - - Printf.printf "✓ Kernel extracted!\n\n"; - - Printf.printf "═══════════════════════════════════════\n"; - Printf.printf " 🎉 SUCCESS! Functional BIOS Works! 🎉\n"; - Printf.printf "═══════════════════════════════════════\n\n"; - - Printf.printf "The kernel has been computed from the event list\n"; - Printf.printf "using the functional BIOS formula.\n\n"; - - (* Check kernel has slot 23 *) - begin try - let _poke = Noun.slot (Z.of_int 23) kernel in - Printf.printf "✓ Kernel has poke gate at slot 23\n" - with _ -> - Printf.printf "✗ No slot 23 in kernel\n" - end - - with - | Noun.Exit -> - Printf.printf "✗ Formula failed (Nock Exit)\n" - | e -> - Printf.printf "✗ Error: %s\n" (Printexc.to_string e) - end - - | Noun.Atom _ -> - Printf.printf " ✗ rest4 is atom (expected use)\n" - end - - | Noun.Atom _ -> - Printf.printf " ✗ rest3 is atom (expected [mod use])\n" - end - - | Noun.Atom _ -> - Printf.printf " ✗ rest2 is atom (expected [bot mod use])\n" - end - - | Noun.Atom _ -> - Printf.printf " ✗ rest is atom\n" - end - - | Noun.Atom _ -> - Printf.printf "✗ Pill is an atom (expected cell)\n" - -let () = - Printf.printf "\n═══════════════════════════════════════\n"; - Printf.printf " Parse Solid Pill Structure\n"; - Printf.printf "═══════════════════════════════════════\n\n"; - Eio_main.run parse_pill diff --git a/ocaml/test/test_ames.ml b/ocaml/test/test_ames.ml deleted file mode 100644 index d50a799..0000000 --- a/ocaml/test/test_ames.ml +++ /dev/null @@ -1,150 +0,0 @@ -(* Test Ames UDP Networking Driver *) - -open Io_drivers - -let test_ames_creation env = - Printf.printf "Test: Ames driver creation...\n"; - - Eio.Switch.run @@ fun sw -> - - let config = Ames.{ - port = 12345; - our_ship = "~zod"; - galaxy_table = []; - } in - - let ames = Ames.create ~env ~sw config in - let stats = Ames.get_stats ames in - - Printf.printf " Created Ames on port %d\n" config.port; - Printf.printf " Initial stats - sent: %Ld, recv: %Ld\n" - stats.packets_sent stats.packets_recv; - - assert (stats.packets_sent = 0L); - assert (stats.packets_recv = 0L); - - Printf.printf " ✓ Ames creation works!\n\n" - -let test_ames_send_recv env = - Printf.printf "Test: Ames send/receive...\n"; - - Eio.Switch.run @@ fun sw -> - - (* Create two Ames instances on different ports *) - let config1 = Ames.{ - port = 23456; - our_ship = "~zod"; - galaxy_table = []; - } in - - let config2 = Ames.{ - port = 23457; - our_ship = "~nec"; - galaxy_table = []; - } in - - let ames1 = Ames.create ~env ~sw config1 in - let _ames2 = Ames.create ~env ~sw config2 in - - Printf.printf " Created two Ames instances\n"; - Printf.printf " Ames1 (%s) on port %d\n" config1.our_ship config1.port; - Printf.printf " Ames2 (%s) on port %d\n" config2.our_ship config2.port; - - (* Create test packet *) - let packet = Ames.{ - header = { - version = 1; - sender = "~zod"; - receiver = "~nec"; - sequence = 1L; - }; - payload = Bytes.of_string "Hello from ~zod!"; - } in - - (* Send packet from ames1 to ames2 *) - let dest = `Udp (Eio.Net.Ipaddr.V4.loopback, config2.port) in - Ames.send_packet ames1 dest packet; - - Printf.printf " Sent packet from %s to %s\n" config1.our_ship config2.our_ship; - - (* Give it a moment to arrive *) - Eio.Time.sleep (Eio.Stdenv.clock env) 0.1; - - let stats1 = Ames.get_stats ames1 in - Printf.printf " Ames1 stats - sent: %Ld, recv: %Ld\n" - stats1.packets_sent stats1.packets_recv; - - assert (stats1.packets_sent = 1L); - - Printf.printf " ✓ Ames send works!\n\n" - -let _test_ames_with_runtime env = - Printf.printf "Test: Ames with runtime event queue...\n"; - - Eio.Switch.run @@ fun sw -> - - (* Create event stream for runtime *) - let event_stream = Eio.Stream.create 100 in - - let config = Ames.{ - port = 34567; - our_ship = "~zod"; - galaxy_table = []; - } in - - let ames = Ames.create ~env ~sw config in - - Printf.printf " Starting Ames driver with event queue\n"; - - (* Run Ames driver (spawns receive fiber) *) - Ames.run ames ~sw ~event_stream; - - (* Send a packet to ourselves *) - let packet = Ames.{ - header = { - version = 1; - sender = "~nec"; - receiver = "~zod"; - sequence = 42L; - }; - payload = Bytes.of_string "Test message"; - } in - - let dest = `Udp (Eio.Net.Ipaddr.V4.loopback, config.port) in - Ames.send_packet ames dest packet; - - Printf.printf " Sent test packet to ourselves\n"; - - (* Wait a bit for the packet to be received *) - Eio.Time.sleep (Eio.Stdenv.clock env) 0.2; - - (* Try to receive event from queue with timeout *) - (match Eio.Time.with_timeout (Eio.Stdenv.clock env) 0.5 (fun () -> - Ok (Eio.Stream.take event_stream) - ) with - | Ok ovum -> - Printf.printf " Received event from Ames!\n"; - Printf.printf " Wire: %s\n" (Format.asprintf "%a" Nock_lib.Noun.pp_noun ovum.Nock_lib.Effects.wire) - | Error `Timeout -> - Printf.printf " (Timeout - no event received)\n" - ); - - let stats = Ames.get_stats ames in - Printf.printf " Final stats - sent: %Ld, recv: %Ld\n" - stats.packets_sent stats.packets_recv; - - Printf.printf " ✓ Ames with runtime integration works!\n\n" - -let () = - Printf.printf "\n🚀🚀🚀 === AMES NETWORKING TESTS === 🚀🚀🚀\n\n"; - - Eio_main.run @@ fun env -> - test_ames_creation env; - test_ames_send_recv env; - - Printf.printf "🎉🎉🎉 === AMES TESTS PASSED! === 🎉🎉🎉\n\n"; - Printf.printf "Ames UDP driver is working!\n"; - Printf.printf "- Async socket creation ✓\n"; - Printf.printf "- Packet send ✓\n"; - Printf.printf "\nReady for ship-to-ship communication! 🚀\n"; - Printf.printf "\n(Note: Runtime integration test with infinite receive loop available in test_ames_with_runtime)\n" diff --git a/ocaml/test/test_arms.ml b/ocaml/test/test_arms.ml deleted file mode 100644 index 0847f6f..0000000 --- a/ocaml/test/test_arms.ml +++ /dev/null @@ -1,73 +0,0 @@ -(* Test Different Arms - * - * Try calling different arms of the Arvo kernel - *) - -open Nock_lib - -let test_arm arm_num kernel = - Printf.printf "Testing arm %d: " arm_num; - - try - let formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom arm_num) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - - let _result = Nock.nock_on kernel formula in - Printf.printf "✓ Success!\n"; - true - with e -> - Printf.printf "✗ %s\n" (Printexc.to_string e); - false - -let test_arms env = - Printf.printf "🔍 Testing Different Arms of Arvo\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Load ivory pill *) - let state = State.create () in - match Boot.boot_from_file ~fs state "ivory.pill" with - | Error msg -> - Printf.printf "✗ Failed to load pill: %s\n%!" msg - | Ok () -> - let kernel = State.get_arvo state in - - Printf.printf "Trying arms 2 through 10...\n\n"; - - for arm = 2 to 10 do - let _ = test_arm arm kernel in - () - done; - - Printf.printf "\nNow trying specific formulas:\n\n"; - - (* Try the actual C Vere poke formula from u3v_poke *) - Printf.printf "C Vere style (simplified): "; - try - (* Subject is [now kernel] typically *) - let now = Noun.atom 0 in - let poke_subject = Noun.cell now kernel in - - (* Formula to replace sample and call *) - (* [8 kernel-with-new-sample [9 2 [0 1]]] *) - let formula = Noun.cell (Noun.atom 8) - (Noun.cell kernel - (Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))))) in - - let _result = Nock.nock_on poke_subject formula in - Printf.printf "✓ Success!\n" - with e -> - Printf.printf "✗ %s\n" (Printexc.to_string e) - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Testing Arms of Arvo Kernel\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_arms diff --git a/ocaml/test/test_arvo.ml b/ocaml/test/test_arvo.ml deleted file mode 100644 index 8325589..0000000 --- a/ocaml/test/test_arvo.ml +++ /dev/null @@ -1,69 +0,0 @@ -(* Test Real Arvo Execution - * - * Load ivory pill and try to poke Arvo with a test event - *) - -open Nock_lib - -let test_load_and_poke env = - Printf.printf "🧪 Testing Real Arvo Execution\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Load ivory pill *) - Printf.printf "Loading ivory pill...\n%!"; - let state = State.create () in - - match Boot.boot_from_file ~fs state "ivory.pill" with - | Error msg -> - Printf.printf "✗ Failed to load pill: %s\n%!" msg; - failwith "Pill load failed" - - | Ok () -> - Printf.printf "✓ Ivory kernel loaded!\n\n"; - - (* Create a simple test event (ovum) *) - Printf.printf "Creating test event...\n%!"; - let test_event = Noun.cell - (Noun.atom 0) (* wire: simple routing *) - (Noun.cell - (Noun.atom 1) (* vane tag *) - (Noun.atom 42)) (* simple data *) - in - - Printf.printf "Test event: [wire card]\n%!"; - Printf.printf " wire: 0\n%!"; - Printf.printf " card: [1 42]\n\n%!"; - - (* Try to poke Arvo! *) - Printf.printf "🚀 Poking Arvo with test event...\n%!"; - - try - let start = Unix.gettimeofday () in - let effects = State.poke state test_event in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf "✓ Poke succeeded in %.4f seconds!\n\n" elapsed; - - Printf.printf "Effects returned: %d\n%!" (List.length effects); - Printf.printf "New event number: %Ld\n\n%!" (State.event_num state); - - Printf.printf "🎉 ARVO IS RUNNING!\n%!"; - - with e -> - Printf.printf "✗ Poke failed with exception:\n%!"; - Printf.printf " %s\n\n%!" (Printexc.to_string e); - Printf.printf "This is expected - we need to figure out:\n%!"; - Printf.printf " 1. Correct event format\n%!"; - Printf.printf " 2. Correct poke formula\n%!"; - Printf.printf " 3. How to parse results\n%!" - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Testing Real Arvo Execution with Ivory Pill\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_load_and_poke diff --git a/ocaml/test/test_arvo_poke_correct.ml b/ocaml/test/test_arvo_poke_correct.ml deleted file mode 100644 index 23259b9..0000000 --- a/ocaml/test/test_arvo_poke_correct.ml +++ /dev/null @@ -1,128 +0,0 @@ -(* Test Arvo poke with CORRECT interface from docs *) - -open Nock_lib - -let extract_arvo () = - Printf.printf "Loading Arvo from solid pill...\n"; - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - (* Extract event 1 - the initial kernel *) - match pill with - | Noun.Cell (_tag, events) -> - let rec nth n noun = - match noun with - | Noun.Atom _ -> None - | Noun.Cell (item, rest) -> - if n = 0 then Some item else nth (n - 1) rest - in - begin match nth 1 events with - | Some (Noun.Cell (_wire, card)) -> Some card - | _ -> None - end - | _ -> None - -let test_poke _env = - Printf.printf "🎯 Testing Arvo Poke (Correct Interface)\n\n"; - Printf.printf "Based on docs/runtime/api.md:\n"; - Printf.printf " ++ poke |/ {now/@da ovo/ovum} :: 42\n"; - Printf.printf " ++ ovum {p/wire q/card}\n"; - Printf.printf " ++ card {p/@tas q/*}\n\n"; - - match extract_arvo () with - | None -> Printf.printf "✗ Failed to extract Arvo\n" - | Some arvo -> - try - (* The poke gate is at AXIS 42, not 23! *) - Printf.printf "Looking for poke gate at axis 42...\n"; - let poke_gate = Noun.slot (Z.of_int 42) arvo in - Printf.printf "✓ Found poke gate at axis 42!\n\n"; - - (* Build proper ovum: [wire card] *) - (* wire = / (empty path, represented as 0) *) - (* card = [term data] = [%test 42] *) - Printf.printf "Building ovum: [wire card]\n"; - Printf.printf " wire: / (atom 0)\n"; - Printf.printf " card: [%%test 42]\n"; - - let wire = Noun.atom 0 in (* / path *) - let term_test = Noun.Atom (Z.of_string "1953719668") in (* 'test' as atom *) - let data = Noun.atom 42 in - let card = Noun.cell term_test data in - let ovum = Noun.cell wire card in - - Printf.printf "\nBuilding poke arguments: [now ovum]\n"; - (* now = current time as @da (atom) - use a fake timestamp *) - let now = Noun.atom 0 in (* epoch *) - let poke_arg = Noun.cell now ovum in - - Printf.printf " now: 0 (epoch)\n"; - Printf.printf " ovum: [0 [1953719668 42]]\n\n"; - - (* Build subject for gate call: [sample gate] *) - (* Standard gate call: [9 2 [0 2] [0 3]] *) - Printf.printf "Calling poke gate...\n"; - let subject = Noun.cell poke_arg poke_gate in - let formula = Noun.cell - (Noun.atom 9) - (Noun.cell - (Noun.atom 2) - (Noun.cell - (Noun.cell (Noun.atom 0) (Noun.atom 2)) - (Noun.cell (Noun.atom 0) (Noun.atom 3)))) - in - - let start = Unix.gettimeofday () in - let result = Nock.nock_on subject formula in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf "✓ Poke succeeded in %.4fs!\n\n" elapsed; - - (* Parse result: [effects new-kernel] *) - begin match result with - | Noun.Cell (effects, new_kernel) -> - Printf.printf "Result: [effects new-kernel]\n"; - Printf.printf " Effects: %s\n" - (match effects with Noun.Atom _ -> "atom/nil" | Noun.Cell _ -> "cell/list"); - Printf.printf " New kernel: %s\n\n" - (match new_kernel with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - - (* Verify new kernel still has poke gate *) - begin try - let _new_poke = Noun.slot (Z.of_int 42) new_kernel in - Printf.printf "✓ New kernel has poke gate at axis 42\n\n"; - Printf.printf "🎉 ARVO POKE IS FULLY WORKING!\n\n"; - Printf.printf "This means we can:\n"; - Printf.printf " ✅ Send events to Arvo\n"; - Printf.printf " ✅ Receive effects (output events)\n"; - Printf.printf " ✅ Get updated kernel state\n"; - Printf.printf " ✅ Build a complete Urbit runtime!\n" - with _ -> - Printf.printf "⚠️ New kernel missing poke gate\n" - end - - | Noun.Atom _ -> - Printf.printf "Result is an atom (unexpected)\n"; - Printf.printf "This might mean the gate signature doesn't match\n" - end - - with - | Noun.Exit -> - Printf.printf "✗ Nock failed (Exit)\n\n"; - Printf.printf "Possible issues:\n"; - Printf.printf " - Event format still wrong\n"; - Printf.printf " - Gate formula incorrect\n"; - Printf.printf " - Arvo kernel not fully initialized\n" - | Not_found -> - Printf.printf "✗ No gate at axis 42\n"; - Printf.printf "This kernel might not be Arvo\n" - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Test Arvo Poke (Correct Interface from Docs)\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_poke diff --git a/ocaml/test/test_arvo_real_poke.ml b/ocaml/test/test_arvo_real_poke.ml deleted file mode 100644 index af707fe..0000000 --- a/ocaml/test/test_arvo_real_poke.ml +++ /dev/null @@ -1,103 +0,0 @@ -(* Test REAL Arvo poke - actually call into the kernel *) - -open Nock_lib - -let test_real_poke env = - Printf.printf "🚀 Testing Real Arvo Poke\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Load ivory pill *) - Printf.printf "Loading ivory pill...\n%!"; - let state = State.create () in - - match Boot.boot_from_file ~fs state "ivory.pill" with - | Error msg -> - Printf.printf "✗ Failed to load pill: %s\n%!" msg; - failwith "Pill load failed" - - | Ok () -> - Printf.printf "✓ Ivory kernel loaded!\n\n"; - - (* Get the kernel *) - let kernel = state.roc in - - (* Try to find the poke gate at slot 23 (traditional Arvo location) *) - Printf.printf "Looking for poke gate...\n"; - - try - (* Try slot 23 *) - let gate = Noun.slot (Z.of_int 23) kernel in - Printf.printf "✓ Found gate at slot 23\n\n"; - - (* Create test event: [wire card] *) - let event = Noun.cell - (Noun.atom 0) (* wire *) - (Noun.cell (Noun.atom 1) (Noun.atom 42)) (* card *) - in - - Printf.printf "Calling Arvo with event [0 [1 42]]...\n"; - - (* Try the standard gate call formula: [9 2 [0 2] [0 3]] - * This means: - * - 9 2: call gate at axis 2 (of the subject) - * - [0 2]: get sample (event) at axis 2 - * - [0 3]: get context (gate) at axis 3 - * - * Subject is: [event gate] - *) - let subject = Noun.cell event gate in - let formula = Noun.cell - (Noun.atom 9) - (Noun.cell - (Noun.atom 2) - (Noun.cell - (Noun.cell (Noun.atom 0) (Noun.atom 2)) - (Noun.cell (Noun.atom 0) (Noun.atom 3)))) - in - - Printf.printf "Running nock...\n"; - let result = Nock.nock_on subject formula in - Printf.printf "✓ Poke succeeded!\n\n"; - - (* Check result structure *) - begin match result with - | Noun.Cell (effects, new_kernel) -> - Printf.printf "Result is a cell: [effects new_kernel]\n"; - Printf.printf "Effects: %s\n" - (match effects with - | Noun.Atom _ -> "atom" - | Noun.Cell _ -> "cell"); - Printf.printf "New kernel: %s\n" - (match new_kernel with - | Noun.Atom _ -> "atom" - | Noun.Cell _ -> "cell"); - Printf.printf "\n🎉 ARVO POKE SUCCESSFUL!\n" - - | Noun.Atom _ -> - Printf.printf "Result is an atom (unexpected)\n" - end - - with Noun.Exit -> - Printf.printf "✗ Nock execution failed (Exit)\n"; - Printf.printf "Slot 23 might not be the right location\n\n"; - - (* Try to explore the kernel structure *) - Printf.printf "Let me explore the kernel structure...\n"; - for i = 2 to 30 do - try - let slot_val = Noun.slot (Z.of_int i) kernel in - let is_cell = match slot_val with Noun.Cell _ -> "cell" | Noun.Atom _ -> "atom" in - Printf.printf " Slot %d: %s\n" i is_cell - with _ -> () - done - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Testing REAL Arvo Poke (Actually Call Into Kernel)\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_real_poke diff --git a/ocaml/test/test_arvo_slots.ml b/ocaml/test/test_arvo_slots.ml deleted file mode 100644 index 5ec9f76..0000000 --- a/ocaml/test/test_arvo_slots.ml +++ /dev/null @@ -1,74 +0,0 @@ -(* Test Available Slots on Arvo Core - * - * Check what slots are available on the Arvo core we found - *) - -open Nock_lib - -let test_slot slot arvo = - try - let value = Noun.slot (Z.of_int slot) arvo in - Printf.printf " Slot %2d: exists (%s)\n" slot - (if Noun.is_cell value then "cell" else "atom"); - Some value - with _ -> - Printf.printf " Slot %2d: does not exist\n" slot; - None - -let test_arvo_slots env = - Printf.printf "🔍 Testing Available Slots on Arvo Core\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Load solid pill *) - let state = State.create () in - match Boot.boot_from_file ~fs state "solid.pill" with - | Error msg -> - Printf.printf "✗ Failed to load pill: %s\n%!" msg - | Ok () -> - let pill_root = State.get_arvo state in - - Printf.printf "=== Testing PILL ROOT ===\n\n"; - Printf.printf "Testing slots 2-30 on pill root:\n\n"; - List.iter (fun slot -> ignore (test_slot slot pill_root)) - (List.init 29 (fun i -> i + 2)); - - Printf.printf "\n\n=== Testing ARVO CORE (at depth 8) ===\n\n"; - - (* Navigate to real Arvo *) - let path = [3; 3; 2; 3; 2; 3; 3; 2] in - let rec navigate noun = function - | [] -> noun - | slot :: rest -> - navigate (Noun.slot (Z.of_int slot) noun) rest - in - let arvo = navigate pill_root path in - - Printf.printf "Testing slots 2-30 on Arvo core:\n\n"; - List.iter (fun slot -> ignore (test_slot slot arvo)) - (List.init 29 (fun i -> i + 2)); - - Printf.printf "\nLooking for formula slots that might be poke...\n\n"; - - (* Check if any slot contains a formula (cell starting with opcode) *) - for slot = 2 to 30 do - match test_slot slot arvo with - | Some value when Noun.is_cell value -> - (match Noun.head value with - | Noun.Atom z when Z.numbits z < 8 -> - let opcode = Z.to_int z in - if opcode >= 0 && opcode <= 11 then - Printf.printf " Slot %d contains formula with opcode %d\n" slot opcode - | _ -> ()) - | _ -> () - done - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Testing Arvo Core Slots\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_arvo_slots diff --git a/ocaml/test/test_arvo_structure.ml b/ocaml/test/test_arvo_structure.ml deleted file mode 100644 index cbd9f65..0000000 --- a/ocaml/test/test_arvo_structure.ml +++ /dev/null @@ -1,116 +0,0 @@ -(* Examine Arvo Kernel Structure - * - * Load the ivory pill and inspect the kernel to understand: - * - Is it a gate (cell)? - * - Where is the battery? - * - What's the structure? - *) - -open Nock_lib - -let rec describe_noun_structure noun depth = - if depth > 5 then - "..." - else - match noun with - | Noun.Atom z -> - if Z.numbits z > 64 then - Printf.sprintf "Atom(huge: %d bits)" (Z.numbits z) - else - Printf.sprintf "Atom(%s)" (Z.to_string z) - | Noun.Cell (a, b) -> - Printf.sprintf "Cell(\n%s%s,\n%s%s)" - (String.make (depth * 2) ' ') - (describe_noun_structure a (depth + 1)) - (String.make (depth * 2) ' ') - (describe_noun_structure b (depth + 1)) - -let test_arvo_structure env = - Printf.printf "🔍 Examining Arvo Kernel Structure\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Load ivory pill *) - Printf.printf "Loading ivory pill...\n%!"; - let state = State.create () in - - match Boot.boot_from_file ~fs state "ivory.pill" with - | Error msg -> - Printf.printf "✗ Failed to load pill: %s\n%!" msg - | Ok () -> - Printf.printf "✓ Pill loaded!\n\n"; - - let kernel = State.get_arvo state in - - (* Check if it's a cell *) - Printf.printf "Kernel structure:\n"; - if Noun.is_cell kernel then begin - Printf.printf " ✓ Kernel is a CELL (likely a gate!)\n\n"; - - let head = Noun.head kernel in - let tail = Noun.tail kernel in - - Printf.printf "Head (slot 2 - battery?):\n"; - if Noun.is_cell head then - Printf.printf " Cell (battery with multiple arms)\n" - else - (match head with - | Noun.Atom z -> Printf.printf " Atom: %s\n" (Z.to_string z) - | _ -> ()); - - Printf.printf "\nTail (slot 3 - sample + context?):\n"; - if Noun.is_cell tail then begin - Printf.printf " Cell (has sample and context)\n"; - let sample = Noun.head tail in - let context = Noun.tail tail in - - Printf.printf "\n Sample (slot 6):\n"; - Printf.printf " %s\n" (describe_noun_structure sample 2); - - Printf.printf "\n Context (slot 7):\n"; - if Noun.is_atom context then - (match context with - | Noun.Atom z -> Printf.printf " Atom: %s\n" (Z.to_string z) - | _ -> ()) - else - Printf.printf " Cell (nested context)\n" - end else - (match tail with - | Noun.Atom z -> Printf.printf " Atom: %s\n" (Z.to_string z) - | _ -> ()); - - (* Test: Try to call arm 2 with current sample *) - Printf.printf "\n🧪 Testing gate call with opcode 9...\n"; - Printf.printf "Formula: [9 2 0 1] (call arm 2 of whole subject)\n\n"; - - try - let formula = Noun.cell - (Noun.atom 9) - (Noun.cell (Noun.atom 2) (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - - let start = Unix.gettimeofday () in - let _result = Nock.nock_on kernel formula in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf "✓ Gate call succeeded in %.4f seconds!\n" elapsed; - Printf.printf "This proves Arvo is a proper gate!\n\n" - with e -> - Printf.printf "✗ Gate call failed: %s\n" (Printexc.to_string e); - Printf.printf "Kernel might not be a standard gate structure\n\n" - - end else begin - (match kernel with - | Noun.Atom z -> Printf.printf " Kernel is an ATOM: %s\n" (Z.to_string z) - | _ -> ()); - Printf.printf " This is unexpected - Arvo should be a gate (cell)\n" - end - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Examining Arvo Kernel Structure from Ivory Pill\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_arvo_structure diff --git a/ocaml/test/test_bench_one.ml b/ocaml/test/test_bench_one.ml deleted file mode 100644 index 1a73be5..0000000 --- a/ocaml/test/test_bench_one.ml +++ /dev/null @@ -1,15 +0,0 @@ -open Nock_lib.Noun -open Nock_lib.Serial - -let () = - Printf.printf "Running single bench iteration...\n"; - for i = 1 to 10 do - Printf.printf "Iter %d: " i; - flush stdout; - let n = atom 42 in - let j = jam n in - let c = cue j in - Format.printf "%a\n" pp_noun c; - flush stdout - done; - Printf.printf "Done!\n" diff --git a/ocaml/test/test_boot_arvo_properly.ml b/ocaml/test/test_boot_arvo_properly.ml deleted file mode 100644 index 559264f..0000000 --- a/ocaml/test/test_boot_arvo_properly.ml +++ /dev/null @@ -1,220 +0,0 @@ -(* Boot Arvo properly through all 5 solid pill events *) - -open Nock_lib - -let boot_arvo _env = - Printf.printf "🚀 Booting Arvo Through All 5 Events\n\n"; - - (* Load solid pill *) - Printf.printf "Loading solid pill from cache...\n"; - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - Printf.printf "✓ Loaded\n\n"; - - match pill with - | Noun.Cell (_tag, events) -> - (* Convert to list *) - let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - in - - let event_list = to_list [] events in - Printf.printf "Found %d events\n\n" (List.length event_list); - - (* Start with no kernel *) - let kernel = ref None in - - (* Process each event *) - List.iteri (fun i event -> - Printf.printf "=== Event %d ===\n" i; - - match event with - | Noun.Atom a -> - Printf.printf "Atom: %s\n" (Z.to_string a); - if i = 0 then - Printf.printf " (Boot sequence tag)\n" - else if i = 2 then - Printf.printf " (Separator)\n"; - Printf.printf "\n" - - | Noun.Cell _ -> - if i = 1 then begin - (* Event 1: The kernel itself (not wrapped in [wire card]) *) - Printf.printf "Cell: Initial kernel\n"; - Printf.printf " → Setting as kernel\n"; - kernel := Some event; (* The whole event IS the kernel *) - - (* Verify it has poke gate at axis 42 *) - begin try - let _gate = Noun.slot (Z.of_int 42) event in - Printf.printf " ✓ Has poke gate at axis 42\n" - with _ -> - Printf.printf " ✗ No poke gate found\n" - end; - Printf.printf "\n" - - end else if i > 1 then begin - (* Events 3 and 4: Boot events as [wire card] *) - Printf.printf "Cell: [wire card]\n"; - match !kernel with - | None -> - Printf.printf " ✗ No kernel to poke yet\n\n" - - | Some k -> - Printf.printf " → Poking kernel with event\n"; - - try - (* Get poke gate at axis 42 *) - let poke_gate = Noun.slot (Z.of_int 42) k in - Printf.printf " Found poke gate at axis 42\n"; - - (* Build poke arguments: [now ovum] *) - (* ovum is the event itself: [wire card] *) - let now = Noun.atom 0 in (* Use epoch for now *) - let ovum = event in - let poke_arg = Noun.cell now ovum in - - (* Build subject: [sample gate] *) - let subject = Noun.cell poke_arg poke_gate in - - (* Standard gate call: [9 2 [0 2] [0 3]] *) - let formula = Noun.cell - (Noun.atom 9) - (Noun.cell - (Noun.atom 2) - (Noun.cell - (Noun.cell (Noun.atom 0) (Noun.atom 2)) - (Noun.cell (Noun.atom 0) (Noun.atom 3)))) - in - - Printf.printf " Executing poke...\n%!"; - let start = Unix.gettimeofday () in - let result = Nock.nock_on subject formula in - let elapsed = Unix.gettimeofday () -. start in - Printf.printf " ✓ Completed in %.3fs\n" elapsed; - - (* Parse result: [effects new-kernel] *) - begin match result with - | Noun.Cell (effects, new_kernel) -> - Printf.printf " Result: [effects new-kernel]\n"; - - (* Count effects *) - let rec count_list n noun = - match noun with - | Noun.Atom _ -> n - | Noun.Cell (_, rest) -> count_list (n + 1) rest - in - let effect_count = count_list 0 effects in - Printf.printf " Effects: %d\n" effect_count; - - (* Update kernel *) - kernel := Some new_kernel; - Printf.printf " ✓ Kernel updated\n" - - | Noun.Atom _ -> - Printf.printf " ✗ Result is atom (unexpected)\n" - end; - - Printf.printf "\n" - - with - | Noun.Exit -> - Printf.printf " ✗ Nock execution failed (Exit)\n"; - Printf.printf " This event might not be in the right format\n"; - Printf.printf "\n" - | Not_found -> - Printf.printf " ✗ No poke gate at axis 42\n\n" - end - ) event_list; - - (* Final kernel check *) - Printf.printf "═══════════════════════════════════════════════════════\n\n"; - - begin match !kernel with - | None -> - Printf.printf "✗ No final kernel\n" - - | Some k -> - Printf.printf "🎉 Arvo Boot Complete!\n\n"; - - (* Verify poke gate *) - begin try - let _gate = Noun.slot (Z.of_int 42) k in - Printf.printf "✓ Final kernel has poke gate at axis 42\n\n"; - - (* Try a test poke! *) - Printf.printf "Testing final kernel with a poke...\n"; - - let poke_gate = Noun.slot (Z.of_int 42) k in - - (* Build test ovum: [wire card] *) - let wire = Noun.atom 0 in (* / *) - let term_test = Noun.Atom (Z.of_string "1953719668") in (* 'test' *) - let data = Noun.atom 42 in - let card = Noun.cell term_test data in - let ovum = Noun.cell wire card in - - let now = Noun.atom 0 in - let poke_arg = Noun.cell now ovum in - - let subject = Noun.cell poke_arg poke_gate in - let formula = Noun.cell - (Noun.atom 9) - (Noun.cell - (Noun.atom 2) - (Noun.cell - (Noun.cell (Noun.atom 0) (Noun.atom 2)) - (Noun.cell (Noun.atom 0) (Noun.atom 3)))) - in - - Printf.printf " Poking with test event [0 [%%test 42]]...\n%!"; - let start = Unix.gettimeofday () in - let result = Nock.nock_on subject formula in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf " ✓ Poke succeeded in %.4fs!\n\n" elapsed; - - begin match result with - | Noun.Cell (effects, new_kernel) -> - let rec count_list n noun = - match noun with - | Noun.Atom _ -> n - | Noun.Cell (_, rest) -> count_list (n + 1) rest - in - Printf.printf " Effects produced: %d\n" (count_list 0 effects); - Printf.printf " New kernel: %s\n\n" - (match new_kernel with Noun.Cell _ -> "cell ✓" | Noun.Atom _ -> "atom"); - - Printf.printf "🎊 ARVO IS FULLY OPERATIONAL! 🎊\n\n"; - Printf.printf "We can now:\n"; - Printf.printf " ✅ Send events to Arvo\n"; - Printf.printf " ✅ Receive effects\n"; - Printf.printf " ✅ Update kernel state\n"; - Printf.printf " ✅ Build a complete Urbit runtime!\n" - - | Noun.Atom _ -> - Printf.printf " Result is atom (unexpected)\n" - end - - with - | Noun.Exit -> - Printf.printf "✗ Test poke failed\n" - | Not_found -> - Printf.printf "✗ No poke gate in final kernel\n" - end - end - - | Noun.Atom _ -> - Printf.printf "✗ Pill is an atom\n" - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Boot Arvo Properly Through All Events\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run boot_arvo diff --git a/ocaml/test/test_boot_solid_events.ml b/ocaml/test/test_boot_solid_events.ml deleted file mode 100644 index 41fd32c..0000000 --- a/ocaml/test/test_boot_solid_events.ml +++ /dev/null @@ -1,136 +0,0 @@ -(* Test processing solid pill boot events *) - -open Nock_lib - -let test_boot_events _env = - Printf.printf "🚀 Processing Solid Pill Boot Events\n\n"; - - (* Load cached solid pill *) - Printf.printf "Loading solid pill from cache...\n"; - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - Printf.printf "✓ Loaded\n\n"; - - (* Extract events *) - match pill with - | Noun.Cell (_tag, events) -> - Printf.printf "Extracting boot events...\n"; - - (* Convert event list to array *) - let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - in - - let event_list = to_list [] events in - Printf.printf "✓ Found %d events\n\n" (List.length event_list); - - (* Process each event *) - Printf.printf "Processing events:\n\n"; - - let kernel = ref None in - - List.iteri (fun i event -> - Printf.printf "Event %d:\n" i; - - match event with - | Noun.Atom a -> - Printf.printf " Type: Atom (%s)\n" (Z.to_string a); - Printf.printf " (Skipping atom event)\n\n" - - | Noun.Cell (wire, card) -> - Printf.printf " Type: Cell [wire card]\n"; - Printf.printf " Wire: %s\n" - (match wire with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - Printf.printf " Card: %s\n" - (match card with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - - (* For the first event, card is the initial kernel *) - if i = 1 then begin - Printf.printf " → Setting as initial kernel\n"; - kernel := Some card - end - (* For subsequent events, we need to poke the kernel *) - else if i > 1 then begin - match !kernel with - | None -> - Printf.printf " ✗ No kernel to poke yet\n" - - | Some k -> - Printf.printf " → Poking kernel with event\n"; - - try - (* Try to find poke gate at slot 23 *) - let gate = Noun.slot (Z.of_int 23) k in - Printf.printf " Found gate at slot 23\n"; - - (* Build subject: [event gate] *) - let subject = Noun.cell event gate in - - (* Call gate: [9 2 [0 2] [0 3]] *) - let formula = Noun.cell - (Noun.atom 9) - (Noun.cell - (Noun.atom 2) - (Noun.cell - (Noun.cell (Noun.atom 0) (Noun.atom 2)) - (Noun.cell (Noun.atom 0) (Noun.atom 3)))) - in - - Printf.printf " Executing nock...\n%!"; - let start = Unix.gettimeofday () in - let result = Nock.nock_on subject formula in - let elapsed = Unix.gettimeofday () -. start in - Printf.printf " ✓ Completed in %.3fs\n" elapsed; - - (* Result should be [effects new-kernel] *) - begin match result with - | Noun.Cell (_effects, new_kernel) -> - Printf.printf " Result: [effects new_kernel]\n"; - kernel := Some new_kernel - - | Noun.Atom _ -> - Printf.printf " Result: atom (unexpected)\n" - end - - with - | Noun.Exit -> - Printf.printf " ✗ Nock failed (Exit)\n" - | Not_found -> - Printf.printf " ✗ No gate at slot 23\n" - end; - - Printf.printf "\n" - ) event_list; - - (* Check final kernel *) - begin match !kernel with - | None -> - Printf.printf "✗ No final kernel\n" - - | Some k -> - Printf.printf "🎉 Final Arvo kernel ready!\n\n"; - - (* Check for poke interface *) - begin try - let _gate = Noun.slot (Z.of_int 23) k in - Printf.printf "✓ Kernel has poke gate at slot 23\n"; - Printf.printf "\n🚀 ARVO IS READY TO USE!\n" - with _ -> - Printf.printf "✗ No poke gate in final kernel\n" - end - end - - | Noun.Atom _ -> - Printf.printf "✗ Pill is an atom\n" - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Boot Solid Pill Events\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_boot_events diff --git a/ocaml/test/test_boot_with_slam.ml b/ocaml/test/test_boot_with_slam.ml deleted file mode 100644 index c87c5c8..0000000 --- a/ocaml/test/test_boot_with_slam.ml +++ /dev/null @@ -1,202 +0,0 @@ -(* Boot Arvo using slam on slot 23 *) - -open Nock_lib - -let slam_on gate event = - (* C Vere slam_on: [battery [new-sample context]] *) - let battery = Noun.head gate in - let context = Noun.tail (Noun.tail gate) in (* slot 7 *) - let new_core = Noun.cell battery (Noun.cell event context) in - - (* Kick arm 2: [9 2 0 1] *) - let kick_formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - - Nock.nock_on new_core kick_formula - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let boot_arvo _env = - Printf.printf "🚀 Booting Arvo with Slot 23 Slam\n\n"; - - (* Load solid pill *) - Printf.printf "Loading solid pill...\n"; - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (_tag, events) -> - let event_list = to_list [] events in - Printf.printf "Found %d events\n\n" (List.length event_list); - - (* Event 1 is the initial kernel *) - let kernel = ref None in - - List.iteri (fun i event -> - Printf.printf "=== Event %d ===\n" i; - - match event with - | Noun.Atom a -> - Printf.printf "Atom: %s\n\n" (Z.to_string a) - - | Noun.Cell _ -> - if i = 1 then begin - (* Event 1: Initial larval kernel *) - Printf.printf "Initial larval kernel\n"; - kernel := Some event; - - (* Verify slot 23 exists *) - begin try - let _poke = Noun.slot (Z.of_int 23) event in - Printf.printf " ✓ Has poke gate at slot 23\n\n" - with _ -> - Printf.printf " ✗ No poke at slot 23\n\n" - end - - end else if i > 2 then begin - (* Events 3-4: Larval initialization events *) - Printf.printf "Boot event (ovum)\n"; - - match !kernel with - | None -> - Printf.printf " ✗ No kernel yet\n\n" - - | Some k -> - begin try - let poke_gate = Noun.slot (Z.of_int 23) k in - - (* Build poke args: [now ovum] *) - (* The event itself should be the ovum [wire card] *) - let now = Noun.atom 0 in - let ovum = event in - let poke_arg = Noun.cell now ovum in - - Printf.printf " → Slamming poke at slot 23...\n"; - let start = Unix.gettimeofday () in - let result = slam_on poke_gate poke_arg in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf " ✓ Poke succeeded in %.4fs!\n" elapsed; - - (* Parse result: [effects new-kernel] *) - begin match result with - | Noun.Cell (_effects, new_kernel) -> - Printf.printf " Result: [effects new-kernel]\n"; - - (* Update kernel *) - kernel := Some new_kernel; - Printf.printf " ✓ Kernel updated\n" - - | Noun.Atom _ -> - Printf.printf " ✗ Result is atom (unexpected)\n" - end; - - Printf.printf "\n" - - with - | Noun.Exit -> - Printf.printf " ✗ Poke failed (Nock Exit)\n\n" - | e -> - Printf.printf " ✗ Error: %s\n\n" (Printexc.to_string e) - end - end else begin - Printf.printf "Separator/other\n\n" - end - ) event_list; - - (* Test final kernel *) - Printf.printf "═══════════════════════════════════════\n\n"; - - begin match !kernel with - | None -> - Printf.printf "✗ No final kernel\n" - - | Some k -> - Printf.printf "🎉 Boot Complete!\n\n"; - - (* Check which slots exist in final kernel *) - Printf.printf "Checking final kernel:\n"; - begin try - let _poke23 = Noun.slot (Z.of_int 23) k in - Printf.printf " ✓ Has slot 23 (larval poke)\n" - with _ -> - Printf.printf " ✗ No slot 23\n" - end; - - begin try - let _poke42 = Noun.slot (Z.of_int 42) k in - Printf.printf " ✓ Has slot 42 (adult poke)\n" - with _ -> - Printf.printf " ✗ No slot 42\n" - end; - - Printf.printf "\nTrying test poke on slot 42...\n"; - - (* Try slot 42 (adult Arvo) *) - begin try - let poke_gate = Noun.slot (Z.of_int 42) k in - let wire = Noun.atom 0 in - let card = Noun.cell (Noun.atom 1953719668) (Noun.atom 42) in - let ovum = Noun.cell wire card in - let now = Noun.atom 0 in - let poke_arg = Noun.cell now ovum in - - Printf.printf " Slamming slot 42...\n"; - let result = slam_on poke_gate poke_arg in - - begin match result with - | Noun.Cell _ -> - Printf.printf " 🎊 SLOT 42 WORKS! ARVO IS RUNNING!\n" - | Noun.Atom _ -> - Printf.printf " Result is atom\n" - end - - with - | Noun.Exit -> - Printf.printf " ✗ Slot 42 poke failed (Nock Exit)\n" - | e -> - Printf.printf " ✗ Error: %s\n" (Printexc.to_string e) - end; - - Printf.printf "\nTrying test poke on slot 23...\n"; - - (* Also try slot 23 *) - begin try - let poke_gate = Noun.slot (Z.of_int 23) k in - let wire = Noun.atom 0 in - let card = Noun.cell (Noun.atom 1953719668) (Noun.atom 42) in - let ovum = Noun.cell wire card in - let now = Noun.atom 0 in - let poke_arg = Noun.cell now ovum in - - Printf.printf " Slamming slot 23...\n"; - let result = slam_on poke_gate poke_arg in - - begin match result with - | Noun.Cell _ -> - Printf.printf " ✓ Slot 23 also works!\n" - | Noun.Atom _ -> - Printf.printf " Result is atom\n" - end - - with - | Noun.Exit -> - Printf.printf " ✗ Slot 23 poke failed (Nock Exit)\n" - | e -> - Printf.printf " ✗ Error: %s\n" (Printexc.to_string e) - end - end - - | Noun.Atom _ -> - Printf.printf "✗ Pill is atom\n" - -let () = - Printf.printf "\n═══════════════════════════════════════════\n"; - Printf.printf " Boot Arvo with Slot 23 Slam\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - Eio_main.run boot_arvo diff --git a/ocaml/test/test_brass_cue.ml b/ocaml/test/test_brass_cue.ml deleted file mode 100644 index 0a431cf..0000000 --- a/ocaml/test/test_brass_cue.ml +++ /dev/null @@ -1,89 +0,0 @@ -(* Test cuing the massive brass/prod pill *) - -open Nock_lib - -let test_brass env = - Printf.printf "🚀 Testing Brass/Prod Pill Cue\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Load brass pill *) - Printf.printf "Loading prod.pill (169 MB - this may take a moment)...\n%!"; - let file_path = Eio.Path.(fs / "prod.pill") in - - let load_start = Unix.gettimeofday () in - let pill_bytes = Eio.Path.load file_path |> Bytes.of_string in - let load_time = Unix.gettimeofday () -. load_start in - - let size_mb = float_of_int (Bytes.length pill_bytes) /. 1024.0 /. 1024.0 in - Printf.printf "✓ Loaded %.1f MB in %.2fs\n\n" size_mb load_time; - - (* Cue with progress *) - Printf.printf "Starting cue (this is 20x bigger than solid pill!)...\n%!"; - - let last_tick = ref (Unix.gettimeofday ()) in - let start = Unix.gettimeofday () in - - let progress ~nouns ~bits ~depth ~max_depth = - let now = Unix.gettimeofday () in - if now -. !last_tick >= 1.0 then begin - let mb = float_of_int bits /. 8.0 /. 1024.0 /. 1024.0 in - let pct = (float_of_int bits /. 8.0) /. float_of_int (Bytes.length pill_bytes) *. 100.0 in - let elapsed = now -. start in - let throughput = mb /. elapsed in - Printf.printf " %.1fs | %.1f MB (%.1f%%) | %dk nouns | depth %d/%d | %.2f MB/s\n%!" - elapsed mb pct (nouns / 1000) depth max_depth throughput; - last_tick := now - end - in - - let pill = Serial.cue ~progress ~progress_interval:100_000 pill_bytes in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf "\n✓ Cued in %.1fs!\n\n" elapsed; - - let throughput = size_mb /. elapsed in - Printf.printf "Performance:\n"; - Printf.printf " Size: %.1f MB\n" size_mb; - Printf.printf " Time: %.1fs\n" elapsed; - Printf.printf " Throughput: %.2f MB/s\n\n" throughput; - - (* Compare to solid pill *) - let solid_time = 1.2 in - let solid_size = 8.7 in - let size_ratio = size_mb /. solid_size in - let time_ratio = elapsed /. solid_time in - - Printf.printf "Comparison to solid pill:\n"; - Printf.printf " Size ratio: %.1fx bigger\n" size_ratio; - Printf.printf " Time ratio: %.1fx slower\n" time_ratio; - Printf.printf " Scaling: %.1f%% linear\n" ((size_ratio /. time_ratio) *. 100.0); - - if time_ratio <= size_ratio *. 1.2 then - Printf.printf "\n🎉 Excellent scaling! Performance is near-linear!\n" - else - Printf.printf "\n⚠️ Non-linear scaling detected\n"; - - (* Check structure *) - Printf.printf "\nExamining structure...\n"; - match pill with - | Noun.Cell (tag, _events) -> - begin match tag with - | Noun.Atom a -> - Printf.printf " Tag: %s (hex: 0x%s)\n" (Z.to_string a) (Z.format "x" a); - if Z.equal a (Z.of_string "1819044208") then - Printf.printf " ✓ Valid 'llip' tag\n" - | _ -> Printf.printf " Tag: cell\n" - end - | _ -> - Printf.printf " ✗ Not a cell\n" - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Brass/Prod Pill Cue Test\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_brass diff --git a/ocaml/test/test_clay.ml b/ocaml/test/test_clay.ml deleted file mode 100644 index 8312f05..0000000 --- a/ocaml/test/test_clay.ml +++ /dev/null @@ -1,243 +0,0 @@ -(* Test Clay Filesystem Driver *) - -open Io_drivers - -let test_clay_creation _env = - Printf.printf "Test: Clay driver creation...\n"; - - let config = Clay.{ - pier_path = "/tmp/test_clay_pier"; - } in - - let clay = Clay.create config in - let stats = Clay.get_stats clay in - - Printf.printf " Created Clay driver for pier: %s\n" config.pier_path; - Printf.printf " Initial stats - files read: %Ld, written: %Ld\n" - stats.files_read stats.files_written; - - assert (stats.files_read = 0L); - assert (stats.files_written = 0L); - - Printf.printf " ✓ Clay driver creation works!\n\n" - -let test_file_read_write env = - Printf.printf "Test: File read/write...\n"; - - let config = Clay.{ - pier_path = "/tmp/test_clay_pier"; - } in - - let clay = Clay.create config in - - (* Write a file *) - let test_data = Bytes.of_string "Hello, Clay! This is a test file." in - - (match Clay.write_file clay ~env "test.txt" test_data with - | Clay.Success () -> - Printf.printf " Wrote test file\n" - | Clay.Error e -> - Printf.printf " ERROR writing: %s\n" e; - assert false - ); - - (* Read it back *) - (match Clay.read_file clay ~env "test.txt" with - | Clay.Success data -> - Printf.printf " Read test file (%d bytes)\n" (Bytes.length data); - assert (data = test_data); - Printf.printf " ✓ Data matches!\n" - | Clay.Error e -> - Printf.printf " ERROR reading: %s\n" e; - assert false - ); - - (* Check stats *) - let stats = Clay.get_stats clay in - Printf.printf " Stats - read: %Ld, written: %Ld, bytes read: %Ld, bytes written: %Ld\n" - stats.files_read stats.files_written stats.bytes_read stats.bytes_written; - - assert (stats.files_read = 1L); - assert (stats.files_written = 1L); - - Printf.printf " ✓ File read/write works!\n\n" - -let test_directory_operations env = - Printf.printf "Test: Directory operations...\n"; - - let config = Clay.{ - pier_path = "/tmp/test_clay_pier"; - } in - - let clay = Clay.create config in - - (* Create some test files in a directory *) - let test_files = [ - ("subdir/file1.txt", "Content 1"); - ("subdir/file2.txt", "Content 2"); - ("subdir/file3.txt", "Content 3"); - ] in - - List.iter (fun (path, content) -> - match Clay.write_file clay ~env path (Bytes.of_string content) with - | Clay.Success () -> () - | Clay.Error e -> - Printf.printf " ERROR: %s\n" e; - assert false - ) test_files; - - Printf.printf " Created %d test files in subdir/\n" (List.length test_files); - - (* List directory *) - (match Clay.list_directory clay ~env "subdir" with - | Clay.Success entries -> - Printf.printf " Directory listing (%d entries):\n" (List.length entries); - List.iter (fun entry -> - Printf.printf " - %s\n" entry - ) entries; - - assert (List.length entries = 3); - Printf.printf " ✓ All files found!\n" - - | Clay.Error e -> - Printf.printf " ERROR listing directory: %s\n" e; - assert false - ); - - Printf.printf " ✓ Directory operations work!\n\n" - -let test_parallel_operations env = - Printf.printf "Test: Parallel file operations (THE SPEEDUP!)...\n"; - - Eio.Switch.run @@ fun sw -> - - let config = Clay.{ - pier_path = "/tmp/test_clay_pier"; - } in - - let clay = Clay.create config in - - (* Create many test files to demonstrate parallel I/O *) - let num_files = 50 in - Printf.printf " Creating %d test files for parallel operations...\n" num_files; - - let test_files = List.init num_files (fun i -> - let path = Printf.sprintf "parallel/file_%03d.txt" i in - let content = Printf.sprintf "This is test file number %d with some content" i in - (path, Bytes.of_string content) - ) in - - (* Sequential write for comparison *) - Printf.printf "\n Sequential write test:\n"; - let seq_start = Unix.gettimeofday () in - List.iter (fun (path, data) -> - match Clay.write_file clay ~env path data with - | Clay.Success () -> () - | Clay.Error _ -> () - ) test_files; - let seq_time = Unix.gettimeofday () -. seq_start in - Printf.printf " Wrote %d files in %.4fs (%.0f files/sec)\n" - num_files seq_time (float_of_int num_files /. seq_time); - - (* Parallel write - THE INNOVATION! *) - Printf.printf "\n Parallel write test:\n"; - let par_start = Unix.gettimeofday () in - let _ = Clay.parallel_write clay ~env ~sw test_files in - let par_time = Unix.gettimeofday () -. par_start in - - let speedup = seq_time /. par_time in - Printf.printf " 💥 SPEEDUP: %.2fx faster than sequential!\n" speedup; - - (* Parallel read test *) - Printf.printf "\n Parallel read test:\n"; - let paths = List.map fst test_files in - let results = Clay.parallel_read clay ~env ~sw paths in - - Printf.printf " Successfully read %d/%d files\n" - (List.length results) (List.length paths); - - let stats = Clay.get_stats clay in - Printf.printf "\n Final stats:\n"; - Printf.printf " Files read: %Ld\n" stats.files_read; - Printf.printf " Files written: %Ld\n" stats.files_written; - Printf.printf " Bytes read: %Ld\n" stats.bytes_read; - Printf.printf " Bytes written: %Ld\n" stats.bytes_written; - - Printf.printf " ✓ Parallel operations work (and are FAST!)!\n\n" - -let test_batch_copy env = - Printf.printf "Test: Batch copy operations...\n"; - - Eio.Switch.run @@ fun sw -> - - let config = Clay.{ - pier_path = "/tmp/test_clay_pier"; - } in - - let clay = Clay.create config in - - (* Create source files *) - let source_files = List.init 10 (fun i -> - Printf.sprintf "batch_src/file_%d.txt" i - ) in - - List.iter (fun path -> - let content = Bytes.of_string (Printf.sprintf "Content of %s" path) in - match Clay.write_file clay ~env path content with - | Clay.Success () -> () - | Clay.Error _ -> () - ) source_files; - - Printf.printf " Created %d source files\n" (List.length source_files); - - (* Batch copy *) - (match Clay.batch_copy clay ~env ~sw source_files "batch_dest" with - | Clay.Success count -> - Printf.printf " Copied %d files in batch\n" count; - assert (count = List.length source_files) - | Clay.Error e -> - Printf.printf " ERROR: %s\n" e; - assert false - ); - - Printf.printf " ✓ Batch copy works!\n\n" - -let test_recursive_scan env = - Printf.printf "Test: Recursive directory scan...\n"; - - let config = Clay.{ - pier_path = "/tmp/test_clay_pier"; - } in - - let clay = Clay.create config in - - (* Scan entire pier *) - let all_files = Clay.scan_directory clay ~env "" in - - Printf.printf " Found %d files total in pier\n" (List.length all_files); - Printf.printf " First 10 files:\n"; - List.iteri (fun i file -> - if i < 10 then Printf.printf " %s\n" file - ) all_files; - - Printf.printf " ✓ Recursive scan works!\n\n" - -let () = - Printf.printf "\n🚀🚀🚀 === CLAY FILESYSTEM TESTS === 🚀🚀🚀\n\n"; - - Eio_main.run @@ fun env -> - test_clay_creation env; - test_file_read_write env; - test_directory_operations env; - test_parallel_operations env; - test_batch_copy env; - test_recursive_scan env; - - Printf.printf "🎉🎉🎉 === ALL CLAY TESTS PASSED! === 🎉🎉🎉\n\n"; - Printf.printf "Clay filesystem driver is working!\n"; - Printf.printf "- Async file read/write ✓\n"; - Printf.printf "- Directory operations ✓\n"; - Printf.printf "- PARALLEL file I/O (MASSIVE SPEEDUP!) ✓\n"; - Printf.printf "- Batch copy operations ✓\n"; - Printf.printf "- Recursive directory scanning ✓\n"; - Printf.printf "\n💥 C Vere blocking I/O < Overe async parallel I/O! 💥\n" diff --git a/ocaml/test/test_correct_boot.ml b/ocaml/test/test_correct_boot.ml deleted file mode 100644 index c778d1b..0000000 --- a/ocaml/test/test_correct_boot.ml +++ /dev/null @@ -1,131 +0,0 @@ -(* Boot using the CORRECT C Vere pattern: compute gates from formulas *) - -open Nock_lib - -let slam_on gate event = - let battery = Noun.head gate in - let context = Noun.tail (Noun.tail gate) in - let new_core = Noun.cell battery (Noun.cell event context) in - let kick_formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - Nock.nock_on new_core kick_formula - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let boot _env = - Printf.printf "🚀 Booting Arvo with CORRECT C Vere Pattern\n\n"; - - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (_tag, events) -> - let event_list = to_list [] events in - let kernel = ref (List.nth event_list 1) in - - Printf.printf "Initial kernel loaded\n\n"; - - (* Process Events 3 and 4 *) - List.iteri (fun i event -> - if i >= 3 && i <= 4 then begin - Printf.printf "═══ Event %d ═══\n" i; - - (* Step 1: Get formula at slot 23 *) - Printf.printf "Step 1: Get formula at slot 23...\n"; - let slot_23_formula = Noun.slot (Z.of_int 23) !kernel in - Printf.printf " ✓ Got formula\n"; - - (* Step 2: Compute poke gate by running formula *) - Printf.printf "Step 2: Compute poke gate...\n"; - let start_compute = Unix.gettimeofday () in - let poke_gate = Nock.nock_on !kernel slot_23_formula in - let elapsed_compute = Unix.gettimeofday () -. start_compute in - Printf.printf " ✓ Computed in %.4fs\n" elapsed_compute; - - (* Step 3: Slam the computed gate *) - Printf.printf "Step 3: Slam poke gate...\n"; - let now = Noun.atom 0 in - let poke_arg = Noun.cell now event in - - let start_slam = Unix.gettimeofday () in - begin try - let result = slam_on poke_gate poke_arg in - let elapsed_slam = Unix.gettimeofday () -. start_slam in - - Printf.printf " ✓ Slam succeeded in %.4fs!\n" elapsed_slam; - - (* Parse result *) - begin match result with - | Noun.Cell (_effects, new_kernel) -> - Printf.printf " Result: [effects new-kernel]\n"; - kernel := new_kernel; - Printf.printf " ✓ Kernel updated\n\n" - | Noun.Atom _ -> - Printf.printf " ✗ Result is atom\n\n" - end - - with - | Noun.Exit -> - Printf.printf " ✗ Slam failed (Nock Exit)\n\n" - | e -> - Printf.printf " ✗ Error: %s\n\n" (Printexc.to_string e) - end - end - ) event_list; - - (* Test final kernel *) - Printf.printf "═══════════════════════════════════════\n"; - Printf.printf " Testing Final Kernel\n"; - Printf.printf "═══════════════════════════════════════\n\n"; - - Printf.printf "Computing poke gate from slot 23...\n"; - begin try - let slot_23_formula = Noun.slot (Z.of_int 23) !kernel in - let poke_gate = Nock.nock_on !kernel slot_23_formula in - Printf.printf "✓ Computed poke gate\n\n"; - - Printf.printf "Testing with [0 [%%test 42]]...\n"; - let wire = Noun.atom 0 in - let card = Noun.cell (Noun.atom 1953719668) (Noun.atom 42) in - let ovum = Noun.cell wire card in - let now = Noun.atom 0 in - let poke_arg = Noun.cell now ovum in - - let result = slam_on poke_gate poke_arg in - - begin match result with - | Noun.Cell _ -> - Printf.printf "✓ Test poke succeeded!\n\n"; - Printf.printf "═══════════════════════════════════════\n"; - Printf.printf " 🎉 ARVO IS FULLY BOOTED! 🎉\n"; - Printf.printf "═══════════════════════════════════════\n\n"; - Printf.printf "Boot sequence complete:\n"; - Printf.printf " 1. Event 1: Initial kernel\n"; - Printf.printf " 2. Event 3: Boot initialization\n"; - Printf.printf " 3. Event 4: Final setup\n"; - Printf.printf " 4. Test poke: SUCCESS\n\n"; - Printf.printf "The kernel is ready to receive events!\n" - | Noun.Atom _ -> - Printf.printf "Result is atom\n" - end - - with - | Noun.Exit -> - Printf.printf "✗ Test poke failed\n" - | e -> - Printf.printf "✗ Error: %s\n" (Printexc.to_string e) - end - - | Noun.Atom _ -> - Printf.printf "Pill is atom\n" - -let () = - Printf.printf "\n═══════════════════════════════════════\n"; - Printf.printf " Boot with Correct C Vere Pattern\n"; - Printf.printf "═══════════════════════════════════════\n\n"; - Eio_main.run boot diff --git a/ocaml/test/test_cvere_poke.ml b/ocaml/test/test_cvere_poke.ml deleted file mode 100644 index 28b0c78..0000000 --- a/ocaml/test/test_cvere_poke.ml +++ /dev/null @@ -1,105 +0,0 @@ -(* Test C Vere Poke Pattern - * - * Implement the exact poke sequence from C Vere: - * 1. Get slot 23 from Arvo core (poke formula) - * 2. Run Nock to compute the poke gate - * 3. Slam: build [battery [event context]] and call arm 2 - *) - -open Nock_lib - -let slam_on gate event = - (* C Vere slam_on: u3nc(u3k(u3h(gat)), u3nc(sam, u3k(u3t(u3t(gat))))) *) - (* Build: [battery [new-sample context]] *) - let battery = Noun.head gate in - let context = Noun.tail (Noun.tail gate) in (* slot 7 *) - let new_core = Noun.cell battery (Noun.cell event context) in - - (* Kick: call arm 2 *) - let kick_formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - - Nock.nock_on new_core kick_formula - -let test_cvere_poke env = - Printf.printf "🎯 Testing C Vere Poke Pattern\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Load ivory pill *) - let state = State.create () in - match Boot.boot_from_file ~fs state "ivory.pill" with - | Error msg -> - Printf.printf "✗ Failed to load pill: %s\n%!" msg - | Ok () -> - let pill_root = State.get_arvo state in - - Printf.printf "Step 0: Navigate to real Arvo core\n"; - Printf.printf " Path: [3 3 2 3 2 3 3 2]\n"; - - (* Navigate to real Arvo *) - let path = [3; 3; 2; 3; 2; 3; 3; 2] in - let rec navigate noun = function - | [] -> noun - | slot :: rest -> - navigate (Noun.slot (Z.of_int slot) noun) rest - in - let arvo = navigate pill_root path in - Printf.printf " ✓ Found real Arvo core\n\n"; - - Printf.printf "Step 1: Get slot 23 from Arvo core\n"; - let slot_23_formula = Noun.slot (Z.of_int 23) arvo in - Printf.printf " ✓ Got formula from slot 23\n\n"; - - Printf.printf "Step 2: Run Nock to compute poke gate\n"; - Printf.printf " Subject: Arvo core\n"; - Printf.printf " Formula: slot 23 contents\n"; - - let poke_gate = Nock.nock_on arvo slot_23_formula in - Printf.printf " ✓ Computed poke gate\n\n"; - - Printf.printf "Step 3: Create test event (ovum)\n"; - let event = Noun.cell (Noun.atom 0) (Noun.atom 42) in - Printf.printf " Event: [0 42]\n\n"; - - Printf.printf "Step 4: Slam poke gate with event\n"; - Printf.printf " Building: [battery [event context]]\n"; - Printf.printf " Calling: arm 2\n\n"; - - let start = Unix.gettimeofday () in - (try - let result = slam_on poke_gate event in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf "🎉 POKE SUCCEEDED in %.4fs!\n\n" elapsed; - - (* Result should be [effects new-core] *) - if Noun.is_cell result then begin - Printf.printf "Result structure: Cell\n"; - let effects = Noun.head result in - let new_core = Noun.tail result in - - Printf.printf " Effects: %s\n" - (if Noun.is_cell effects then "Cell (list)" else "Atom"); - Printf.printf " New core: %s\n" - (if Noun.is_cell new_core then "Cell (updated Arvo)" else "Atom"); - - Printf.printf "\n✨ ARVO IS RUNNING!\n"; - Printf.printf "We can now poke Arvo with events!\n" - end else - Printf.printf "Result is atom (unexpected)\n" - - with e -> - Printf.printf "✗ Poke failed: %s\n" (Printexc.to_string e); - Printf.printf "Stack trace:\n%s\n" (Printexc.get_backtrace ())) - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Testing C Vere Poke Pattern on Arvo\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_cvere_poke diff --git a/ocaml/test/test_dill_iris.ml b/ocaml/test/test_dill_iris.ml deleted file mode 100644 index ed974ae..0000000 --- a/ocaml/test/test_dill_iris.ml +++ /dev/null @@ -1,98 +0,0 @@ -(* Test Dill and Iris Drivers *) - -open Io_drivers - -let test_dill_creation _env = - Printf.printf "Test: Dill driver creation...\n"; - - let config = Dill.{ - prompt = "~zod:dojo>"; - } in - - let dill = Dill.create config in - let stats = Dill.get_stats dill in - - Printf.printf " Created Dill driver with prompt: %s\n" config.prompt; - Printf.printf " Initial stats - lines read: %Ld, written: %Ld\n" - stats.lines_read stats.lines_written; - - assert (stats.lines_read = 0L); - assert (stats.lines_written = 0L); - - Printf.printf " ✓ Dill driver creation works!\n\n" - -let test_dill_output env = - Printf.printf "Test: Dill terminal output...\n"; - - let config = Dill.{ - prompt = "~zod:dojo>"; - } in - - let dill = Dill.create config in - - (* Write some output *) - Dill.write_output dill ~env "Hello from Dill!\n"; - Dill.write_output dill ~env "Terminal output is working!\n"; - - let stats = Dill.get_stats dill in - Printf.printf " Stats - lines written: %Ld, bytes written: %Ld\n" - stats.lines_written stats.bytes_written; - - assert (stats.lines_written = 2L); - - Printf.printf " ✓ Terminal output works!\n\n" - -let test_iris_creation _env = - Printf.printf "Test: Iris driver creation...\n"; - - let iris = Iris.create () in - let stats = Iris.get_stats iris in - - Printf.printf " Created Iris HTTP client driver\n"; - Printf.printf " Initial stats - requests: %Ld, active: %d\n" - stats.requests_total stats.requests_active; - - assert (stats.requests_total = 0L); - assert (stats.requests_active = 0); - - Printf.printf " ✓ Iris driver creation works!\n\n" - -let test_iris_url_parsing _env = - Printf.printf "Test: URL parsing...\n"; - - let test_cases = [ - ("http://example.com/path", "example.com", "/path"); - ("https://api.github.com/users", "api.github.com", "/users"); - ("http://localhost", "localhost", "/"); - ] in - - List.iter (fun (url, expected_host, expected_path) -> - let (host, path) = Iris.parse_url url in - Printf.printf " URL: %s -> host: %s, path: %s\n" url host path; - assert (host = expected_host); - assert (path = expected_path) - ) test_cases; - - Printf.printf " ✓ URL parsing works!\n\n" - -let () = - Printf.printf "\n🚀🚀🚀 === DILL & IRIS TESTS === 🚀🚀🚀\n\n"; - - Eio_main.run @@ fun env -> - test_dill_creation env; - test_dill_output env; - test_iris_creation env; - test_iris_url_parsing env; - - Printf.printf "🎉🎉🎉 === ALL DILL & IRIS TESTS PASSED! === 🎉🎉🎉\n\n"; - Printf.printf "Terminal and HTTP client drivers are working!\n"; - Printf.printf "\nDill (Terminal):\n"; - Printf.printf "- Driver creation ✓\n"; - Printf.printf "- Terminal output ✓\n"; - Printf.printf "- Async I/O ready for input fiber ✓\n"; - Printf.printf "\nIris (HTTP Client):\n"; - Printf.printf "- Driver creation ✓\n"; - Printf.printf "- URL parsing ✓\n"; - Printf.printf "- Async HTTP requests ready ✓\n"; - Printf.printf "\n🎉 ALL I/O DRIVERS COMPLETE! 🎉\n"; - Printf.printf "Ready to run a full Arvo kernel!\n" diff --git a/ocaml/test/test_event4_slot42.ml b/ocaml/test/test_event4_slot42.ml deleted file mode 100644 index ce98863..0000000 --- a/ocaml/test/test_event4_slot42.ml +++ /dev/null @@ -1,104 +0,0 @@ -(* Test Event 4 using slot 42 instead of slot 23 *) - -open Nock_lib - -let slam_on gate event = - let battery = Noun.head gate in - let context = Noun.tail (Noun.tail gate) in - let new_core = Noun.cell battery (Noun.cell event context) in - let kick_formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - Nock.nock_on new_core kick_formula - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let test _env = - Printf.printf "🚀 Testing Event 4 with Slot 42\n\n"; - - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (_tag, events) -> - let event_list = to_list [] events in - - let kernel1 = List.nth event_list 1 in - let event3 = List.nth event_list 3 in - let event4 = List.nth event_list 4 in - - (* Slam Event 3 with slot 23 *) - Printf.printf "=== Event 3 (slot 23) ===\n"; - let poke_gate3 = Noun.slot (Z.of_int 23) kernel1 in - let result3 = slam_on poke_gate3 (Noun.cell (Noun.atom 0) event3) in - - let kernel_after_3 = match result3 with - | Noun.Cell (_effects, new_kernel) -> - Printf.printf "✓ Succeeded\n\n"; - new_kernel - | _ -> kernel1 - in - - (* Try Event 4 with SLOT 42 *) - Printf.printf "=== Event 4 (slot 42) ===\n"; - begin try - let poke_gate4 = Noun.slot (Z.of_int 42) kernel_after_3 in - Printf.printf "✓ Found poke gate at slot 42\n"; - - (* Check gate structure *) - begin match poke_gate4 with - | Noun.Cell (battery, payload) -> - Printf.printf " Battery: %s\n" (match battery with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - begin match payload with - | Noun.Cell (_sample, _context) -> - Printf.printf " Payload: cell [sample context] ✓\n\n" - | _ -> - Printf.printf " Payload: atom ✗\n\n" - end - | _ -> () - end; - - Printf.printf "Slamming Event 4...\n"; - let start = Unix.gettimeofday () in - let result4 = slam_on poke_gate4 (Noun.cell (Noun.atom 0) event4) in - let elapsed = Unix.gettimeofday () -. start in - - begin match result4 with - | Noun.Cell (_effects, _new_kernel) -> - Printf.printf "✓ Event 4 succeeded in %.4fs!\n\n" elapsed; - Printf.printf "═══════════════════════════════════════════\n"; - Printf.printf " 🎉🎉🎉 FULL BOOT SUCCESS! 🎉🎉🎉\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - Printf.printf "Boot sequence:\n"; - Printf.printf " 1. Event 1: Initial larval kernel\n"; - Printf.printf " 2. Event 3: Poked with slot 23 (larval)\n"; - Printf.printf " 3. Kernel metamorphosed!\n"; - Printf.printf " 4. Event 4: Poked with slot 42 (adult)\n\n"; - Printf.printf "The kernel has metamorphosed from larval to adult!\n"; - Printf.printf " - Larval poke: slot 23\n"; - Printf.printf " - Adult poke: slot 42\n" - | Noun.Atom _ -> - Printf.printf "Result is atom\n" - end - - with - | Noun.Exit -> - Printf.printf "✗ Still failed with slot 42\n" - | Not_found -> - Printf.printf "✗ No slot 42 found\n" - | e -> - Printf.printf "✗ Error: %s\n" (Printexc.to_string e) - end - - | Noun.Atom _ -> - Printf.printf "Pill is atom\n" - -let () = - Printf.printf "\n═══════════════════════════════════════════\n"; - Printf.printf " Test Event 4 with Slot 42\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - Eio_main.run test diff --git a/ocaml/test/test_eventlog.ml b/ocaml/test/test_eventlog.ml deleted file mode 100644 index fd0e496..0000000 --- a/ocaml/test/test_eventlog.ml +++ /dev/null @@ -1,155 +0,0 @@ -(* Event Log Tests - Eio-based event persistence testing - * - * Tests: - * 1. Basic append and read - * 2. Jam/cue roundtrip through event log - * 3. Replay functionality - * 4. Multiple events in sequence - *) - -open Nock_lib - -let test_basic_append env = - Printf.printf "Test: Basic append and read...\n"; - Eio.Switch.run @@ fun sw -> - let fs = Eio.Stdenv.fs env in - - (* Create event log in tmp directory *) - let log = Eventlog.create ~sw ~fs "tmp/test_eventlog" in - - (* Create a simple noun *) - let noun1 = Noun.atom 42 in - - (* Append event *) - let event_num = Eventlog.append log ~sw noun1 in - Printf.printf " Appended event %Ld\n" event_num; - - (* Read it back *) - let noun2 = Eventlog.read_event log event_num in - Printf.printf " Read back event %Ld\n" event_num; - - (* Verify they match *) - if noun1 = noun2 then - Printf.printf " ✓ Basic append/read works!\n\n" - else - failwith "Noun mismatch!" - -let test_jam_cue_roundtrip env = - Printf.printf "Test: Jam/cue roundtrip through event log...\n"; - Eio.Switch.run @@ fun sw -> - let fs = Eio.Stdenv.fs env in - - (* Create event log *) - let log = Eventlog.create ~sw ~fs "tmp/test_eventlog_jam" in - - (* Create various nouns *) - let test_cases = [ - ("atom 0", Noun.atom 0); - ("atom 42", Noun.atom 42); - ("atom 1000000", Noun.atom 1000000); - ("cell [1 2]", Noun.cell (Noun.atom 1) (Noun.atom 2)); - ("nested [[1 2] [3 4]]", - Noun.cell - (Noun.cell (Noun.atom 1) (Noun.atom 2)) - (Noun.cell (Noun.atom 3) (Noun.atom 4))); - ] in - - List.iter (fun (name, noun) -> - let event_num = Eventlog.append log ~sw noun in - let recovered = Eventlog.read_event log event_num in - if noun = recovered then - Printf.printf " ✓ %s: roundtrip OK (event %Ld)\n" name event_num - else - failwith (Printf.sprintf "%s: roundtrip FAILED" name) - ) test_cases; - - Printf.printf "\n" - -let test_replay env = - Printf.printf "Test: Event replay...\n"; - Eio.Switch.run @@ fun sw -> - let fs = Eio.Stdenv.fs env in - - (* Create event log *) - let log = Eventlog.create ~sw ~fs "tmp/test_eventlog_replay" in - - (* Append several events *) - let nouns = [ - Noun.atom 1; - Noun.atom 2; - Noun.atom 3; - Noun.cell (Noun.atom 4) (Noun.atom 5); - ] in - - List.iter (fun noun -> - let _ = Eventlog.append log ~sw noun in - () - ) nouns; - - Printf.printf " Appended %d events\n" (List.length nouns); - - (* Create new log instance to test replay *) - let log2 = Eventlog.create ~sw ~fs "tmp/test_eventlog_replay" in - - (* Replay events *) - let replayed = ref [] in - Eventlog.replay log2 ~sw (fun num noun -> - Printf.printf " Replayed event %Ld\n" num; - replayed := noun :: !replayed - ); - - let replayed_list = List.rev !replayed in - - (* Verify all events were replayed correctly *) - if List.length replayed_list = List.length nouns then - Printf.printf " ✓ Replayed %d events correctly\n" (List.length nouns) - else - failwith (Printf.sprintf "Expected %d events, got %d" - (List.length nouns) (List.length replayed_list)); - - (* Verify content matches *) - List.iter2 (fun original replayed -> - if original <> replayed then - failwith "Replayed noun doesn't match original" - ) nouns replayed_list; - - Printf.printf " ✓ All replayed events match originals\n\n" - -let test_event_count env = - Printf.printf "Test: Event counting...\n"; - Eio.Switch.run @@ fun sw -> - let fs = Eio.Stdenv.fs env in - - let log = Eventlog.create ~sw ~fs "tmp/test_eventlog_count" in - - (* Initially should have 0 events *) - let count0 = Eventlog.event_count log in - Printf.printf " Initial count: %d\n" count0; - - (* Append 5 events *) - for i = 1 to 5 do - let _ = Eventlog.append log ~sw (Noun.atom i) in - () - done; - - let count5 = Eventlog.event_count log in - Printf.printf " After 5 appends: %d\n" count5; - - if count5 = 5 then - Printf.printf " ✓ Event count correct\n\n" - else - failwith (Printf.sprintf "Expected 5 events, got %d" count5) - -let () = - Eio_main.run @@ fun env -> - Printf.printf "\n=== Event Log Tests (Eio-based) ===\n\n"; - - (* Clean up old test directories *) - (try Unix.system "rm -rf tmp/test_eventlog*" |> ignore with _ -> ()); - - test_basic_append env; - test_jam_cue_roundtrip env; - test_replay env; - test_event_count env; - - Printf.printf "=== All tests passed! ✓ ===\n" diff --git a/ocaml/test/test_functional_bios.ml b/ocaml/test/test_functional_bios.ml deleted file mode 100644 index 5679c3f..0000000 --- a/ocaml/test/test_functional_bios.ml +++ /dev/null @@ -1,132 +0,0 @@ -(* Test the functional BIOS formula [2 [0 3] [0 2]] on event list *) - -open Nock_lib - -let test_bios _env = - Printf.printf "🚀 Testing Functional BIOS Formula\n\n"; - - (* Load solid pill *) - Printf.printf "Loading solid pill...\n"; - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (_tag, events) -> - Printf.printf "Found events\n\n"; - - (* Build the functional BIOS formula: [2 [0 3] [0 2]] *) - Printf.printf "Building functional BIOS formula: [2 [0 3] [0 2]]\n"; - let bios_formula = Noun.cell - (Noun.atom 2) - (Noun.cell - (Noun.cell (Noun.atom 0) (Noun.atom 3)) - (Noun.cell (Noun.atom 0) (Noun.atom 2))) - in - Printf.printf "Formula: %s\n\n" - (match bios_formula with Noun.Cell _ -> "built" | _ -> "error"); - - (* Run the formula on the event list! *) - Printf.printf "Running formula on entire event list...\n"; - Printf.printf "(This processes ALL 5 events at once!)\n\n"; - - let start = Unix.gettimeofday () in - - begin try - let result = Nock.nock_on events bios_formula in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf "✓ Formula succeeded in %.4fs!\n\n" elapsed; - - (* Extract slot 7 from result *) - Printf.printf "Extracting slot 7 from result...\n"; - begin try - let kernel = Noun.slot (Z.of_int 7) result in - Printf.printf "✓ Got kernel at slot 7!\n\n"; - - (* Check what slots this kernel has *) - Printf.printf "Checking kernel slots:\n"; - - begin try - let _poke23 = Noun.slot (Z.of_int 23) kernel in - Printf.printf " ✓ Has slot 23 (larval poke)\n" - with _ -> - Printf.printf " ✗ No slot 23\n" - end; - - begin try - let _poke42 = Noun.slot (Z.of_int 42) kernel in - Printf.printf " ✓ Has slot 42 (adult poke)\n" - with _ -> - Printf.printf " ✗ No slot 42\n" - end; - - Printf.printf "\n🎉 FUNCTIONAL BIOS BOOT COMPLETE!\n\n"; - - (* Try a test poke on slot 42 *) - Printf.printf "Testing poke on slot 42...\n"; - - begin try - let poke_gate = Noun.slot (Z.of_int 42) kernel in - - (* Build test event *) - let wire = Noun.atom 0 in - let card = Noun.cell (Noun.atom 1953719668) (Noun.atom 42) in - let ovum = Noun.cell wire card in - let now = Noun.atom 0 in - let poke_arg = Noun.cell now ovum in - - (* Slam *) - let battery = Noun.head poke_gate in - let context = Noun.tail (Noun.tail poke_gate) in - let new_core = Noun.cell battery (Noun.cell poke_arg context) in - let kick_formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - - let poke_result = Nock.nock_on new_core kick_formula in - - begin match poke_result with - | Noun.Cell (_effects, _new_kernel) -> - Printf.printf " 🎊 SLOT 42 POKE WORKS!\n\n"; - Printf.printf "═══════════════════════════════════════════\n"; - Printf.printf " ARVO IS FULLY BOOTED AND OPERATIONAL!\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - Printf.printf "This means we can now:\n"; - Printf.printf " ✅ Run the functional BIOS formula\n"; - Printf.printf " ✅ Extract the booted kernel\n"; - Printf.printf " ✅ Poke events into Arvo\n"; - Printf.printf " ✅ Build a complete Urbit runtime!\n" - | Noun.Atom _ -> - Printf.printf " Result is atom\n" - end - - with - | Noun.Exit -> - Printf.printf " ✗ Poke failed (Nock Exit)\n" - | e -> - Printf.printf " ✗ Error: %s\n" (Printexc.to_string e) - end - - with - | Not_found -> - Printf.printf "✗ No slot 7 in result\n" - | e -> - Printf.printf "✗ Error accessing slot 7: %s\n" (Printexc.to_string e) - end - - with - | Noun.Exit -> - Printf.printf "✗ Formula failed (Nock Exit)\n" - | e -> - Printf.printf "✗ Error: %s\n" (Printexc.to_string e) - end - - | Noun.Atom _ -> - Printf.printf "✗ Pill is atom\n" - -let () = - Printf.printf "\n═══════════════════════════════════════════\n"; - Printf.printf " Test Functional BIOS Formula\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - Eio_main.run test_bios diff --git a/ocaml/test/test_hex.ml b/ocaml/test/test_hex.ml deleted file mode 100644 index a228682..0000000 --- a/ocaml/test/test_hex.ml +++ /dev/null @@ -1,26 +0,0 @@ -open Nock_lib.Noun -open Nock_lib.Serial - -let () = - for i = 0 to 10 do - let n = atom i in - let jammed = jam n in - Printf.printf "jam(%d) = %s (%d bytes)\n" i (bytes_to_hex jammed) (Bytes.length jammed) - done - -let () = - Printf.printf "\nRound-trip tests:\n"; - for i = 0 to 50 do - let n = atom i in - let jammed = jam n in - let cued = cue jammed in - match cued with - | Atom a when Z.equal a (Z.of_int i) -> - Printf.printf "OK: %d\n" i - | Atom a -> - Printf.printf "FAIL: %d -> %s\n" i (Z.to_string a); - exit 1 - | Cell _ -> - Printf.printf "FAIL: %d -> cell\n" i; - exit 1 - done diff --git a/ocaml/test/test_http.ml b/ocaml/test/test_http.ml deleted file mode 100644 index 0649a86..0000000 --- a/ocaml/test/test_http.ml +++ /dev/null @@ -1,186 +0,0 @@ -(* Test Eyre HTTP Server Driver *) - -open Io_drivers - -let test_http_creation _env = - Printf.printf "Test: HTTP server creation...\n"; - - let config = Http.{ - port = 8080; - host = "localhost"; - } in - - let eyre = Http.create config in - let stats = Http.get_stats eyre in - - Printf.printf " Created HTTP server for %s:%d\n" config.host config.port; - Printf.printf " Initial stats - requests: %Ld, active: %d\n" - stats.requests_total stats.requests_active; - - assert (stats.requests_total = 0L); - assert (stats.requests_active = 0); - - Printf.printf " ✓ HTTP server creation works!\n\n" - -let test_http_request_parsing _env = - Printf.printf "Test: HTTP request parsing...\n"; - - (* Test simple GET request *) - let get_request = "GET /index.html HTTP/1.1\r\nHost: localhost\r\nUser-Agent: test\r\n\r\n" in - - (match Http.parse_request get_request with - | Ok req -> - Printf.printf " Parsed GET request:\n"; - Printf.printf " Method: %s\n" (Http.method_to_string req.method_); - Printf.printf " Path: %s\n" req.path; - Printf.printf " Version: %s\n" req.version; - Printf.printf " Headers: %d\n" (List.length req.headers); - - assert (req.method_ = Http.GET); - assert (req.path = "/index.html"); - assert (req.version = "HTTP/1.1") - - | Error err -> - Printf.printf " ERROR: %s\n" err; - assert false - ); - - (* Test POST request *) - let post_request = "POST /api/data HTTP/1.1\r\nContent-Length: 13\r\n\r\nHello, World!" in - - (match Http.parse_request post_request with - | Ok req -> - Printf.printf " Parsed POST request:\n"; - Printf.printf " Method: %s\n" (Http.method_to_string req.method_); - Printf.printf " Path: %s\n" req.path; - - assert (req.method_ = Http.POST); - assert (req.path = "/api/data") - - | Error err -> - Printf.printf " ERROR: %s\n" err; - assert false - ); - - Printf.printf " ✓ HTTP request parsing works!\n\n" - -let test_http_response_generation _env = - Printf.printf "Test: HTTP response generation...\n"; - - let response = Http.{ - status = 200; - status_text = "OK"; - headers = [ - ("Content-Type", "text/plain"); - ("Content-Length", "5"); - ]; - body = Bytes.of_string "Hello"; - } in - - let response_bytes = Http.generate_response response in - let response_str = Bytes.to_string response_bytes in - - Printf.printf " Generated response (%d bytes):\n" (Bytes.length response_bytes); - Printf.printf "%s\n" response_str; - - assert (String.starts_with ~prefix:"HTTP/1.1 200 OK" response_str); - assert (String.contains response_str '\n'); - - Printf.printf " ✓ HTTP response generation works!\n\n" - -let _test_http_server env = - Printf.printf "Test: HTTP server with client connection...\n"; - - let result = ref None in - - (* Use fiber to run client test with timeout *) - Eio.Switch.run @@ fun sw -> - - (* Create event stream for runtime *) - let event_stream = Eio.Stream.create 100 in - - let config = Http.{ - port = 9876; - host = "localhost"; - } in - - let eyre = Http.create config in - - Printf.printf " Starting HTTP server\n"; - - (* Run HTTP server (spawns accept fiber) *) - Http.run eyre ~env ~sw ~event_stream; - - (* Give server time to start *) - Eio.Time.sleep (Eio.Stdenv.clock env) 0.1; - - Printf.printf " Connecting to HTTP server...\n"; - - (* Run client test in fiber that will complete and allow switch to close *) - Eio.Fiber.fork ~sw (fun () -> - let net = Eio.Stdenv.net env in - let addr = `Tcp (Eio.Net.Ipaddr.V4.loopback, config.port) in - - let flow = Eio.Net.connect ~sw net addr in - - Printf.printf " Connected! Sending GET request...\n"; - - (* Send HTTP GET request *) - let request = "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n" in - Eio.Flow.write flow [Cstruct.of_string request]; - - (* Read response *) - let buf = Cstruct.create 4096 in - let recv_len = Eio.Flow.single_read flow buf in - let response = Cstruct.to_string (Cstruct.sub buf 0 recv_len) in - - Printf.printf " Received response (%d bytes):\n" recv_len; - let lines = String.split_on_char '\n' response in - List.iteri (fun i line -> - if i < 5 then (* Print first 5 lines *) - Printf.printf " %s\n" line - ) lines; - - assert (String.starts_with ~prefix:"HTTP/1.1 200 OK" response); - assert (String.contains response 'r'); - - Printf.printf " ✓ Received valid HTTP response!\n"; - - (* Check stats *) - let stats = Http.get_stats eyre in - Printf.printf " Final stats - requests: %Ld, active: %d\n" - stats.requests_total stats.requests_active; - - result := Some (); - ); - - (* Wait for client test to complete *) - Eio.Time.sleep (Eio.Stdenv.clock env) 0.3; - - (* Test completed, switch will close and cancel accept fiber *) - (match !result with - | Some () -> () - | None -> failwith "Client test did not complete" - ); - - Printf.printf " ✓ HTTP server works!\n\n" - -let () = - Printf.printf "\n🚀🚀🚀 === EYRE HTTP SERVER TESTS === 🚀🚀🚀\n\n"; - - Eio_main.run @@ fun env -> - test_http_creation env; - test_http_request_parsing env; - test_http_response_generation env; - (* Note: test_http_server commented out as it runs infinite accept loop *) - (* In production, the HTTP server runs continuously to handle requests *) - Printf.printf "Note: Full server test available in test_http_server (runs continuously)\n\n"; - - Printf.printf "🎉🎉🎉 === EYRE HTTP TESTS PASSED! === 🎉🎉🎉\n\n"; - Printf.printf "Eyre HTTP server is working!\n"; - Printf.printf "- Server creation ✓\n"; - Printf.printf "- Request parsing (GET/POST) ✓\n"; - Printf.printf "- Response generation ✓\n"; - Printf.printf "- TCP listener with Eio.Net ✓\n"; - Printf.printf "- Fiber-per-connection architecture ✓\n"; - Printf.printf "\nReady to serve web requests! 🌐\n" diff --git a/ocaml/test/test_ivory_boot.ml b/ocaml/test/test_ivory_boot.ml deleted file mode 100644 index f9d511a..0000000 --- a/ocaml/test/test_ivory_boot.ml +++ /dev/null @@ -1,97 +0,0 @@ -(* Test Ivory Pill Boot Sequence - * - * Implements C Vere's u3v_life() lifecycle boot - *) - -open Nock_lib - -let test_ivory_boot env = - Printf.printf "🎯 Testing Ivory Pill Boot (C Vere u3v_life pattern)\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Create state *) - let state = State.create () in - - (* Boot using ivory boot sequence *) - Printf.printf "Step 1: Load ivory pill\n"; - Printf.printf "Step 2: Validate 'ivory' tag\n"; - Printf.printf "Step 3: Run lifecycle formula [2 [0 3] [0 2]]\n"; - Printf.printf "Step 4: Extract slot 7 from result\n\n"; - - match Boot.boot_lite ~fs state "ivory.pill" with - | Error msg -> - Printf.printf "✗ Boot failed: %s\n%!" msg - - | Ok () -> - let arvo = State.get_arvo state in - Printf.printf "\n✨ SUCCESS! Ivory pill booted!\n\n"; - - (* Verify structure *) - Printf.printf "Verifying booted core structure:\n"; - Printf.printf " Is cell: %s\n" (if Noun.is_cell arvo then "✓" else "✗"); - - if Noun.is_cell arvo then begin - let battery = Noun.head arvo in - let payload = Noun.tail arvo in - - Printf.printf " Battery: %s\n" - (if Noun.is_cell battery then "✓ Cell (contains code)" else "Atom"); - Printf.printf " Payload: %s\n\n" - (if Noun.is_cell payload then "✓ Cell (contains data)" else "Atom"); - - (* Now try the C Vere poke pattern on this booted core *) - Printf.printf "Testing if this core has slot 23 (poke interface)...\n"; - (try - let slot_23 = Noun.slot (Z.of_int 23) arvo in - Printf.printf " ✓ Slot 23 exists!\n"; - Printf.printf " Is formula: %s\n" - (if Noun.is_cell slot_23 then "✓ Cell" else "Atom"); - - (* Try to run poke sequence *) - Printf.printf "\nAttempting C Vere poke sequence:\n"; - Printf.printf " 1. Get slot 23 formula\n"; - Printf.printf " 2. Run formula on Arvo core\n"; - Printf.printf " 3. Slam result with test event\n\n"; - - let poke_gate = Nock.nock_on arvo slot_23 in - Printf.printf " ✓ Got poke gate from slot 23\n"; - - (* Create test event *) - let event = Noun.cell (Noun.atom 0) (Noun.atom 42) in - - (* Slam: build [battery [event context]] and call arm 2 *) - let battery = Noun.head poke_gate in - let context = Noun.tail (Noun.tail poke_gate) in - let new_core = Noun.cell battery (Noun.cell event context) in - let kick_formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - - let start = Unix.gettimeofday () in - let result = Nock.nock_on new_core kick_formula in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf " ✓ Poke succeeded in %.4fs!\n" elapsed; - Printf.printf " Result: %s\n\n" - (if Noun.is_cell result then "Cell (effects + new state)" else "Atom"); - - Printf.printf "🎉 FULL ARVO BOOT SUCCESSFUL!\n"; - Printf.printf "We have a working Arvo instance!\n" - - with e -> - Printf.printf " ✗ Slot 23 not found: %s\n" (Printexc.to_string e); - Printf.printf "\nThis is expected for ivory pills.\n"; - Printf.printf "Ivory contains %%zuse core, not full Arvo.\n"; - Printf.printf "For full poke interface, need solid/brass pill.\n") - end - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Testing Ivory Pill Boot Sequence (u3v_life)\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_ivory_boot diff --git a/ocaml/test/test_ivory_structure.ml b/ocaml/test/test_ivory_structure.ml deleted file mode 100644 index 2ed76a9..0000000 --- a/ocaml/test/test_ivory_structure.ml +++ /dev/null @@ -1,105 +0,0 @@ -(* Examine Ivory Pill Structure *) - -open Nock_lib - -let test_ivory_structure env = - Printf.printf "🔍 Examining Ivory Pill Structure\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Load ivory pill *) - let file_path = Eio.Path.(fs / "ivory.pill") in - let pill_bytes = Eio.Path.load file_path |> Bytes.of_string in - - Printf.printf "Loading ivory pill (%d bytes)...\n" (Bytes.length pill_bytes); - let start = Unix.gettimeofday () in - let pill = Serial.cue pill_bytes in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf "Cued in %.2fs\n\n" elapsed; - - Printf.printf "Top-level structure:\n"; - if Noun.is_cell pill then begin - Printf.printf " ✓ Is cell\n"; - let head = Noun.head pill in - let tail = Noun.tail pill in - - Printf.printf "\nHead:\n"; - (match head with - | Noun.Atom z -> - Printf.printf " Atom: %s\n" (Z.to_string z); - Printf.printf " Hex: 0x%s\n" (Z.format "x" z); - Printf.printf " Bits: %d\n" (Z.numbits z); - - (* Try to decode as ASCII cord *) - if Z.numbits z <= 64 then begin - let bytes = Z.to_bits z in - Printf.printf " ASCII (reversed): "; - for i = 0 to String.length bytes - 1 do - let c = bytes.[i] in - if c >= ' ' && c <= '~' then - Printf.printf "%c" c - else - Printf.printf "\\x%02x" (Char.code c) - done; - Printf.printf "\n" - end; - - (* Check specific values *) - if Z.equal z (Z.of_string "129293697897") then - Printf.printf " ✓ This is 'ivory' tag!\n" - - | Noun.Cell _ -> - Printf.printf " Cell\n"); - - Printf.printf "\nTail (the ivory core):\n"; - Printf.printf " %s\n" (if Noun.is_cell tail then "Cell" else "Atom"); - - if Noun.is_cell tail then begin - Printf.printf " Head of tail: %s\n" - (if Noun.is_cell (Noun.head tail) then "Cell (battery?)" else "Atom"); - Printf.printf " Tail of tail: %s\n" - (if Noun.is_cell (Noun.tail tail) then "Cell (payload?)" else "Atom"); - - (* Test which slots exist on the core *) - Printf.printf "\nTesting slots 2-10 on ivory core:\n"; - for slot = 2 to 10 do - try - let value = Noun.slot (Z.of_int slot) tail in - Printf.printf " Slot %2d: exists (%s)\n" slot - (if Noun.is_cell value then "cell" else "atom") - with _ -> - Printf.printf " Slot %2d: does not exist\n" slot - done; - - (* Check if it's actually a gate [battery sample context] *) - Printf.printf "\nGate structure analysis:\n"; - if Noun.is_cell tail then begin - let battery = Noun.head tail in - let rest = Noun.tail tail in - Printf.printf " Battery (slot 2): %s\n" - (if Noun.is_cell battery then "Cell (contains formulas)" else "Atom"); - - if Noun.is_cell rest then begin - let sample = Noun.head rest in - let context = Noun.tail rest in - Printf.printf " Sample (slot 6): %s\n" - (if Noun.is_cell sample then "Cell" else "Atom"); - Printf.printf " Context (slot 7): %s\n" - (if Noun.is_cell context then "Cell" else "Atom") - end - end - end - - end else - Printf.printf " Atom (unexpected)\n" - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Examining Ivory Pill Structure\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_ivory_structure diff --git a/ocaml/test/test_jam_debug.ml b/ocaml/test/test_jam_debug.ml deleted file mode 100644 index cad3ee9..0000000 --- a/ocaml/test/test_jam_debug.ml +++ /dev/null @@ -1,20 +0,0 @@ -open Nock_lib.Noun -open Nock_lib.Serial - -let () = - Printf.printf "Testing jam encoding:\n"; - - (* Test 0 *) - let n0 = atom 0 in - let j0 = jam n0 in - Printf.printf "jam(0) = %s\n" (bytes_to_hex j0); - - (* Test 1 *) - let n1 = atom 1 in - let j1 = jam n1 in - Printf.printf "jam(1) = %s\n" (bytes_to_hex j1); - - (* Test 2 *) - let n2 = atom 2 in - let j2 = jam n2 in - Printf.printf "jam(2) = %s\n" (bytes_to_hex j2); diff --git a/ocaml/test/test_life_formula.ml b/ocaml/test/test_life_formula.ml deleted file mode 100644 index 722154b..0000000 --- a/ocaml/test/test_life_formula.ml +++ /dev/null @@ -1,48 +0,0 @@ -(* Test lifecycle formula on atom 0 *) - -open Nock_lib - -let () = - Printf.printf "Testing lifecycle formula [2 [0 3] [0 2]] on atom 0\n\n%!"; - - (* Build the lifecycle formula *) - let lyf = Noun.cell (Noun.atom 2) - (Noun.cell - (Noun.cell (Noun.atom 0) (Noun.atom 3)) - (Noun.cell (Noun.atom 0) (Noun.atom 2))) in - - Printf.printf "Formula: [2 [0 3] [0 2]]\n%!"; - Printf.printf "Subject: 0 (null)\n\n%!"; - - (* Try running it *) - begin try - let result = Nock.nock_on (Noun.atom 0) lyf in - Printf.printf "✓ SUCCESS! Result: %s\n%!" (match result with - | Noun.Atom z -> Z.to_string z - | Noun.Cell _ -> "[cell]") - with - | Noun.Exit -> - Printf.printf "✗ FAILED with Nock Exit\n%!"; - - (* Let's trace through the formula step by step *) - Printf.printf "\nStep-by-step trace:\n%!"; - Printf.printf "Formula: *[0 [2 [0 3] [0 2]]]\n%!"; - Printf.printf "Opcode 2: *[a [2 b c]] = *[*[a b] *[a c]]\n%!"; - Printf.printf " b = [0 3]\n%!"; - Printf.printf " c = [0 2]\n%!"; - Printf.printf "\n*[a b] = *[0 [0 3]] = slot 3 of atom 0\n%!"; - - (* Try slot 3 on atom 0 *) - begin try - let s3 = Noun.slot (Z.of_int 3) (Noun.atom 0) in - Printf.printf " slot 3 of 0 = %s (unexpected!)\n%!" (match s3 with - | Noun.Atom z -> Z.to_string z - | Noun.Cell _ -> "[cell]") - with Noun.Exit -> - Printf.printf " slot 3 of 0 = ERROR (as expected)\n%!" - end; - - Printf.printf "\nThis proves the formula CANNOT work on atom 0!\n%!" - | e -> - Printf.printf "✗ FAILED with: %s\n%!" (Printexc.to_string e) - end diff --git a/ocaml/test/test_life_on_bot.ml b/ocaml/test/test_life_on_bot.ml deleted file mode 100644 index 1625a53..0000000 --- a/ocaml/test/test_life_on_bot.ml +++ /dev/null @@ -1,98 +0,0 @@ -(* Test u3v_life() on JUST the bot events from solid pill *) - -open Nock_lib - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let test env = - Printf.printf "═══════════════════════════════════════\n"; - Printf.printf " Testing u3v_life on Bot Events\n"; - Printf.printf "═══════════════════════════════════════\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Cue the solid pill *) - Printf.printf "Cuing solid.pill...\n%!"; - let pill_bytes = Eio.Path.load (Eio.Path.(fs / "solid.pill")) |> Bytes.of_string in - let pill = Serial.cue pill_bytes in - Printf.printf "✓ Pill cued\n\n"; - - (* Parse structure *) - match pill with - | Noun.Cell (_tag, rest) -> - begin match rest with - | Noun.Cell (_typ, rest2) -> - begin match rest2 with - | Noun.Cell (bot, _rest3) -> - Printf.printf "Extracted bot events\n\n"; - - (* Bot should be a list of lifecycle events *) - Printf.printf "Testing u3v_life([2 [0 3] [0 2]]) on bot...\n%!"; - - (* Build lifecycle formula *) - let lyf = Noun.cell (Noun.atom 2) - (Noun.cell - (Noun.cell (Noun.atom 0) (Noun.atom 3)) - (Noun.cell (Noun.atom 0) (Noun.atom 2))) in - - begin try - let start = Unix.gettimeofday () in - let gat = Nock.nock_on bot lyf in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf "✓ Formula completed in %.4fs!\n\n" elapsed; - - (* Extract slot 7 to get kernel *) - let kernel = Noun.slot (Z.of_int 7) gat in - Printf.printf "✓ Extracted kernel from slot 7\n\n"; - - (* Verify kernel has poke at slot 23 *) - begin try - let _poke = Noun.slot (Z.of_int 23) kernel in - Printf.printf "✓ Kernel has poke at slot 23!\n\n"; - - Printf.printf "═══════════════════════════════════════\n"; - Printf.printf " 🎉 SUCCESS! We have a kernel! 🎉\n"; - Printf.printf "═══════════════════════════════════════\n\n"; - - Printf.printf "The functional BIOS worked on bot events!\n" - - with _ -> - Printf.printf "✗ No slot 23 in kernel\n" - end - - with - | Noun.Exit -> - Printf.printf "✗ Formula failed (Nock Exit)\n"; - - (* Debug: what's in bot? *) - Printf.printf "\nDebugging bot structure:\n"; - let bot_list = to_list [] bot in - Printf.printf " Bot has %d items\n" (List.length bot_list); - List.iteri (fun i item -> - let desc = match item with - | Noun.Atom a -> Printf.sprintf "Atom(%s)" (Z.to_string a) - | Noun.Cell _ -> "Cell" - in - Printf.printf " Item %d: %s\n" i desc - ) bot_list - - | e -> - Printf.printf "✗ Error: %s\n" (Printexc.to_string e) - end - - | Noun.Atom _ -> - Printf.printf "rest2 is atom\n" - end - | Noun.Atom _ -> - Printf.printf "rest is atom\n" - end - | Noun.Atom _ -> - Printf.printf "Pill is atom\n" - -let () = - Eio_main.run test diff --git a/ocaml/test/test_multicore.ml b/ocaml/test/test_multicore.ml deleted file mode 100644 index e2a846b..0000000 --- a/ocaml/test/test_multicore.ml +++ /dev/null @@ -1,204 +0,0 @@ -(* Multi-Core State Tests - Demonstrating true parallelism with OCaml 5 - * - * Tests: - * 1. Concurrent event increments across domains - * 2. Parallel read-only queries (peek) - * 3. Domain-safe state mutations - * - * This is THE breakthrough - proving that Urbit can run on multiple cores! - *) - -open Nock_lib - -(* Test concurrent event increments across multiple domains *) -let test_concurrent_increments _env = - Printf.printf "Test: Concurrent event increments across domains...\n"; - - let state = State.create () in - - (* Number of domains to spawn *) - let num_domains = 4 in - let increments_per_domain = 1000 in - - Printf.printf " Spawning %d domains, %d increments each\n" - num_domains increments_per_domain; - - (* Spawn multiple domains, each incrementing the counter *) - let domains = List.init num_domains (fun i -> - Domain.spawn (fun () -> - Printf.printf " Domain %d starting...\n" i; - for _j = 1 to increments_per_domain do - let _ = State.inc_event state in - () - done; - Printf.printf " Domain %d done!\n" i; - () - ) - ) in - - (* Wait for all domains to complete *) - List.iter Domain.join domains; - - (* Check final count *) - let final_count = State.event_num state in - let expected = Int64.of_int (num_domains * increments_per_domain) in - - Printf.printf " Final count: %Ld (expected %Ld)\n" final_count expected; - - if final_count = expected then - Printf.printf " ✓ All increments completed correctly!\n\n" - else - failwith (Printf.sprintf "Count mismatch! Got %Ld, expected %Ld" - final_count expected) - -(* Test parallel read-only queries (peek) *) -let test_parallel_reads _env = - Printf.printf "Test: Parallel read-only queries...\n"; - - let state = State.create () in - - (* Set up a kernel state *) - let kernel = Noun.cell (Noun.atom 42) (Noun.atom 99) in - State.boot state kernel; - - let num_domains = 8 in - let reads_per_domain = 100 in - - Printf.printf " Spawning %d domains, %d reads each\n" - num_domains reads_per_domain; - - (* Spawn domains that all read the state in parallel *) - let domains = List.init num_domains (fun i -> - Domain.spawn (fun () -> - for _j = 1 to reads_per_domain do - let result = State.peek state (Noun.atom 0) in - match result with - | Some _noun -> - (* Peek returns [path kernel], not just kernel - * For now, just verify it returns something *) - () - | None -> - failwith (Printf.sprintf "Domain %d peek failed!" i) - done; - i (* Return domain id *) - ) - ) in - - (* Wait for all reads *) - let results = List.map Domain.join domains in - - Printf.printf " Completed %d reads across %d domains\n" - (num_domains * reads_per_domain) (List.length results); - Printf.printf " ✓ All parallel reads successful!\n\n" - -(* Test mixed read/write workload *) -let test_mixed_workload _env = - Printf.printf "Test: Mixed read/write workload...\n"; - - let state = State.create () in - let kernel = Noun.atom 100 in - State.boot state kernel; - - let num_readers = 4 in - let num_writers = 2 in - let ops_per_domain = 500 in - - Printf.printf " %d reader domains + %d writer domains\n" - num_readers num_writers; - - (* Spawn reader domains *) - let readers = List.init num_readers (fun _i -> - Domain.spawn (fun () -> - for _j = 1 to ops_per_domain do - let _ = State.peek state (Noun.atom 0) in - () - done - ) - ) in - - (* Spawn writer domains *) - let writers = List.init num_writers (fun _i -> - Domain.spawn (fun () -> - for _j = 1 to ops_per_domain do - let _ = State.inc_event state in - () - done - ) - ) in - - (* Wait for all domains *) - List.iter Domain.join readers; - List.iter Domain.join writers; - - (* Verify final state *) - let final_count = State.event_num state in - let expected = Int64.of_int (num_writers * ops_per_domain) in - - Printf.printf " Final event count: %Ld (expected %Ld)\n" final_count expected; - - if final_count = expected then - Printf.printf " ✓ Mixed workload completed correctly!\n\n" - else - failwith "Mixed workload count mismatch!" - -(* Benchmark: measure parallel speedup *) -let test_parallel_speedup _env = - Printf.printf "Test: Parallel speedup benchmark...\n"; - - let total_ops = 10000 in - - (* Sequential baseline *) - Printf.printf " Sequential baseline (%d ops)...\n" total_ops; - let state_seq = State.create () in - let start_seq = Unix.gettimeofday () in - for _i = 1 to total_ops do - let _ = State.inc_event state_seq in - () - done; - let time_seq = Unix.gettimeofday () -. start_seq in - Printf.printf " Time: %.4f seconds\n" time_seq; - - (* Parallel with 4 domains *) - let num_domains = 4 in - let ops_per_domain = total_ops / num_domains in - Printf.printf " Parallel with %d domains (%d ops each)...\n" - num_domains ops_per_domain; - - let state_par = State.create () in - let start_par = Unix.gettimeofday () in - - let domains = List.init num_domains (fun _i -> - Domain.spawn (fun () -> - for _j = 1 to ops_per_domain do - let _ = State.inc_event state_par in - () - done - ) - ) in - - List.iter Domain.join domains; - let time_par = Unix.gettimeofday () -. start_par in - Printf.printf " Time: %.4f seconds\n" time_par; - - let speedup = time_seq /. time_par in - Printf.printf " Speedup: %.2fx\n" speedup; - - if speedup > 1.0 then - Printf.printf " ✓ Parallel execution is faster!\n\n" - else - Printf.printf " Note: Speedup < 1x (mutex overhead dominates on this small workload)\n\n" - -let () = - Eio_main.run @@ fun env -> - Printf.printf "\n🚀 === MULTI-CORE URBIT RUNTIME TESTS === 🚀\n\n"; - Printf.printf "OCaml %s with %d domains available\n\n" - Sys.ocaml_version (Domain.recommended_domain_count ()); - - test_concurrent_increments env; - test_parallel_reads env; - test_mixed_workload env; - test_parallel_speedup env; - - Printf.printf "🎉 === ALL MULTI-CORE TESTS PASSED! === 🎉\n"; - Printf.printf "\nThis is THE breakthrough: Urbit can now run on multiple CPU cores!\n"; - Printf.printf "Phase 1 (Event Log + State) complete. Ready for Phase 2 (Parallel Nock)!\n" diff --git a/ocaml/test/test_nock.ml b/ocaml/test/test_nock.ml deleted file mode 100644 index 73f2ce2..0000000 --- a/ocaml/test/test_nock.ml +++ /dev/null @@ -1,284 +0,0 @@ -open Nock_lib.Noun -open Nock_lib.Nock - -(** Test utilities *) - -let assert_equal expected actual msg = - if not (equal expected actual) then begin - Printf.printf "FAIL: %s\n" msg; - Format.printf " Expected: %a@." pp_noun expected; - Format.printf " Actual: %a@." pp_noun actual; - exit 1 - end else - Printf.printf "PASS: %s\n" msg - -let _assert_raises_exit f msg = - try - let _ = f () in - Printf.printf "FAIL: %s (expected Exit exception)\n" msg; - exit 1 - with Exit -> - Printf.printf "PASS: %s\n" msg - -(** Basic noun tests *) - -let test_noun_basics () = - Printf.printf "\n=== Testing basic noun operations ===\n"; - - (* Test atom creation *) - let a = atom 42 in - assert_equal (atom 42) a "atom creation"; - - (* Test cell creation *) - let c = cell (atom 1) (atom 2) in - assert_equal (atom 1) (head c) "cell head"; - assert_equal (atom 2) (tail c) "cell tail"; - - (* Test is_cell and is_atom *) - if not (is_atom a) then Printf.printf "FAIL: is_atom on atom\n" else Printf.printf "PASS: is_atom on atom\n"; - if not (is_cell c) then Printf.printf "FAIL: is_cell on cell\n" else Printf.printf "PASS: is_cell on cell\n"; - if is_atom c then Printf.printf "FAIL: not is_atom on cell\n" else Printf.printf "PASS: not is_atom on cell\n"; - if is_cell a then Printf.printf "FAIL: not is_cell on atom\n" else Printf.printf "PASS: not is_cell on atom\n" - -(** Test slot/fragment addressing *) -let test_slots () = - Printf.printf "\n=== Testing slot/fragment addressing ===\n"; - - (* Build tree: [[1 2] [3 4]] *) - let tree = cell (cell (atom 1) (atom 2)) (cell (atom 3) (atom 4)) in - - (* Test slot addressing - 1 = whole tree - 2 = head = [1 2] - 3 = tail = [3 4] - 4 = head of head = 1 - 5 = tail of head = 2 - 6 = head of tail = 3 - 7 = tail of tail = 4 - *) - assert_equal tree (slot Z.one tree) "slot 1 (root)"; - assert_equal (cell (atom 1) (atom 2)) (slot (Z.of_int 2) tree) "slot 2 (head)"; - assert_equal (cell (atom 3) (atom 4)) (slot (Z.of_int 3) tree) "slot 3 (tail)"; - assert_equal (atom 1) (slot (Z.of_int 4) tree) "slot 4"; - assert_equal (atom 2) (slot (Z.of_int 5) tree) "slot 5"; - assert_equal (atom 3) (slot (Z.of_int 6) tree) "slot 6"; - assert_equal (atom 4) (slot (Z.of_int 7) tree) "slot 7" - -(** Test Nock opcode 0: slot lookup *) -let test_nock_0 () = - Printf.printf "\n=== Testing Nock opcode 0 (slot) ===\n"; - - let subject = cell (atom 4) (atom 5) in - - (* *[subject [0 1]] = subject *) - assert_equal subject (nock subject (cell (atom 0) (atom 1))) "nock 0: axis 1"; - - (* *[[4 5] [0 2]] = 4 *) - assert_equal (atom 4) (nock subject (cell (atom 0) (atom 2))) "nock 0: axis 2"; - - (* *[[4 5] [0 3]] = 5 *) - assert_equal (atom 5) (nock subject (cell (atom 0) (atom 3))) "nock 0: axis 3" - -(** Test Nock opcode 1: constant *) -let test_nock_1 () = - Printf.printf "\n=== Testing Nock opcode 1 (constant) ===\n"; - - let subject = atom 99 in - - (* *[subject [1 42]] = 42 *) - assert_equal (atom 42) (nock subject (cell (atom 1) (atom 42))) "nock 1: return constant"; - - (* *[subject [1 [1 2]]] = [1 2] *) - assert_equal - (cell (atom 1) (atom 2)) - (nock subject (cell (atom 1) (cell (atom 1) (atom 2)))) - "nock 1: return constant cell" - -(** Test Nock opcode 2: recursion *) -let test_nock_2 () = - Printf.printf "\n=== Testing Nock opcode 2 (nock) ===\n"; - - (* *[42 [2 [0 1] [1 0]]] = *[42 0] = crash *) - (* *[42 [2 [1 99] [1 0 1]]] = *[99 [0 1]] = 99 *) - let subject = atom 42 in - let formula = cell (atom 2) (cell (cell (atom 1) (atom 99)) (cell (atom 1) (cell (atom 0) (atom 1)))) in - assert_equal (atom 99) (nock subject formula) "nock 2: evaluate with new subject" - -(** Test Nock opcode 3: is-cell *) -let test_nock_3 () = - Printf.printf "\n=== Testing Nock opcode 3 (is-cell) ===\n"; - - (* *[42 [3 1 42]] = 1 (atom) *) - assert_equal (atom 1) (nock (atom 42) (cell (atom 3) (cell (atom 1) (atom 42)))) "nock 3: is-cell of atom"; - - (* *[42 [3 1 [1 2]]] = 0 (cell) *) - assert_equal - (atom 0) - (nock (atom 42) (cell (atom 3) (cell (atom 1) (cell (atom 1) (atom 2))))) - "nock 3: is-cell of cell" - -(** Test Nock opcode 4: increment *) -let test_nock_4 () = - Printf.printf "\n=== Testing Nock opcode 4 (increment) ===\n"; - - (* *[42 [4 1 41]] = 42 *) - assert_equal (atom 42) (nock (atom 0) (cell (atom 4) (cell (atom 1) (atom 41)))) "nock 4: increment"; - - (* *[0 [4 0 1]] = 1 *) - assert_equal (atom 1) (nock (atom 0) (cell (atom 4) (cell (atom 0) (atom 1)))) "nock 4: increment subject" - -(** Test Nock opcode 5: equality *) -let test_nock_5 () = - Printf.printf "\n=== Testing Nock opcode 5 (equality) ===\n"; - - (* *[0 [5 [1 4] [1 5]]] = 1 (not equal) *) - assert_equal - (atom 1) - (nock (atom 0) (cell (atom 5) (cell (cell (atom 1) (atom 4)) (cell (atom 1) (atom 5))))) - "nock 5: not equal"; - - (* *[0 [5 [1 4] [1 4]]] = 0 (equal) *) - assert_equal - (atom 0) - (nock (atom 0) (cell (atom 5) (cell (cell (atom 1) (atom 4)) (cell (atom 1) (atom 4))))) - "nock 5: equal" - -(** Test Nock opcode 6: if-then-else *) -let test_nock_6 () = - Printf.printf "\n=== Testing Nock opcode 6 (if-then-else) ===\n"; - - (* *[42 [6 [1 0] [1 11] [1 22]]] = 11 (if 0 then 11 else 22) *) - assert_equal - (atom 11) - (nock (atom 42) (cell (atom 6) (cell (cell (atom 1) (atom 0)) (cell (cell (atom 1) (atom 11)) (cell (atom 1) (atom 22)))))) - "nock 6: if true"; - - (* *[42 [6 [1 1] [1 11] [1 22]]] = 22 (if 1 then 11 else 22) *) - assert_equal - (atom 22) - (nock (atom 42) (cell (atom 6) (cell (cell (atom 1) (atom 1)) (cell (cell (atom 1) (atom 11)) (cell (atom 1) (atom 22)))))) - "nock 6: if false" - -(** Test Nock opcode 7: composition *) -let test_nock_7 () = - Printf.printf "\n=== Testing Nock opcode 7 (composition) ===\n"; - - (* *[42 [7 [1 99] [0 1]]] = *[99 [0 1]] = 99 *) - assert_equal - (atom 99) - (nock (atom 42) (cell (atom 7) (cell (cell (atom 1) (atom 99)) (cell (atom 0) (atom 1))))) - "nock 7: composition" - -(** Test Nock opcode 8: push *) -let test_nock_8 () = - Printf.printf "\n=== Testing Nock opcode 8 (push) ===\n"; - - (* *[42 [8 [1 99] [0 1]]] = *[[99 42] [0 1]] = [99 42] *) - assert_equal - (cell (atom 99) (atom 42)) - (nock (atom 42) (cell (atom 8) (cell (cell (atom 1) (atom 99)) (cell (atom 0) (atom 1))))) - "nock 8: push" - -(** Test Nock opcode 9: call *) -let test_nock_9 () = - Printf.printf "\n=== Testing Nock opcode 9 (call) ===\n"; - - (* Simplest test: *[42 [9 1 [0 1]]] - = evaluate [0 1] with 42 -> 42 - = slot 1 of 42 -> 42 - = *[42 42] -> should crash since 42 is not a valid formula - - Better test: create subject with formula at position 3 - *[[formula value] [9 2 [0 1]]] - where formula = [0 3] (get tail) - - Actually: *[[1 2] [9 2 [1 [0 3]]]] - = evaluate [1 [0 3]] with [1 2] -> [0 3] - = slot 2 of [1 2] -> 1 - - Wait, that's wrong. Let me think about what 9 does: - *[subject [9 axis formula]] - = *[subject *[*[subject formula] axis]] - - So: *[[1 2] [9 3 [0 1]]] - = *[*[[1 2] [0 1]] 3] - = *[[1 2] 3] - = slot 3 of [1 2] - = 2 - - But that's not right either. Let me re-read the spec. - - Actually from the C code: - seb = nock(bus, c_gal) - nex = slot(b_gal, seb) - result = nock(seb, nex) - - So for [9 b c]: - 1. Evaluate c with subject -> seb - 2. Get slot b from seb -> nex (this is the formula) - 3. Evaluate nex with seb as subject - - Test: *[[99 [4 [0 2]]] [9 3 [0 1]]] - 1. seb = *[[99 [4 [0 2]]] [0 1]] = [99 [4 [0 2]]] - 2. nex = slot 3 of [99 [4 [0 2]]] = [4 [0 2]] - 3. result = *[[99 [4 [0 2]]] [4 [0 2]]] - = increment of *[[99 [4 [0 2]]] [0 2]] - = increment of 99 - = 100 - *) - let subj = cell (atom 99) (cell (atom 4) (cell (atom 0) (atom 2))) in - assert_equal - (atom 100) - (nock subj (cell (atom 9) (cell (atom 3) (cell (atom 0) (atom 1))))) - "nock 9: call formula at axis 3" - -(** Test Nock opcode 10: hint *) -let test_nock_10 () = - Printf.printf "\n=== Testing Nock opcode 10 (hint) ===\n"; - - (* *[42 [10 99 [1 11]]] = 11 (hint ignored) *) - assert_equal - (atom 11) - (nock (atom 42) (cell (atom 10) (cell (atom 99) (cell (atom 1) (atom 11))))) - "nock 10: hint with value (ignored)"; - - (* *[42 [10 [99 [1 88]] [1 11]]] = 11 (hint ignored) *) - assert_equal - (atom 11) - (nock (atom 42) (cell (atom 10) (cell (cell (atom 99) (cell (atom 1) (atom 88))) (cell (atom 1) (atom 11))))) - "nock 10: hint with computed value (ignored)" - -(** Test Nock cell constructor shorthand *) -let test_nock_cons () = - Printf.printf "\n=== Testing Nock cons (cell auto-construction) ===\n"; - - (* *[42 [[1 6] [1 7]]] = [6 7] *) - assert_equal - (cell (atom 6) (atom 7)) - (nock (atom 42) (cell (cell (atom 1) (atom 6)) (cell (atom 1) (atom 7)))) - "nock cons: [[1 6] [1 7]]" - -(** Run all tests *) -let () = - Printf.printf "=================================\n"; - Printf.printf "Nock OCaml Test Suite\n"; - Printf.printf "=================================\n"; - - test_noun_basics (); - test_slots (); - test_nock_0 (); - test_nock_1 (); - test_nock_2 (); - test_nock_3 (); - test_nock_4 (); - test_nock_5 (); - test_nock_6 (); - test_nock_7 (); - test_nock_8 (); - test_nock_9 (); - test_nock_10 (); - test_nock_cons (); - - Printf.printf "\n=================================\n"; - Printf.printf "All tests passed!\n"; - Printf.printf "=================================\n" diff --git a/ocaml/test/test_parallel_nock.ml b/ocaml/test/test_parallel_nock.ml deleted file mode 100644 index 2f3d39a..0000000 --- a/ocaml/test/test_parallel_nock.ml +++ /dev/null @@ -1,244 +0,0 @@ -(* Parallel Nock Tests - THE BREAKTHROUGH! - * - * These tests prove that Urbit can run on multiple CPU cores! - * - * Tests: - * 1. Parallel batch execution - * 2. Parallel scry (read-only queries) - * 3. Map-reduce style parallelism - * 4. Async execution - * 5. Parallel speedup benchmarks - *) - -open Nock_lib - -let test_domain_pool _env = - Printf.printf "Test: Domain pool creation...\n"; - - let pool = Domain_pool.create () in - let stats = Domain_pool.stats pool in - - Printf.printf " Domains in pool: %d\n" stats.num_domains; - Printf.printf " Available cores: %d\n" stats.available_cores; - - assert (stats.num_domains >= 1); - assert (stats.num_domains <= stats.available_cores); - - Domain_pool.shutdown pool; - - Printf.printf " ✓ Domain pool works!\n\n" - -let test_parallel_batch _env = - Printf.printf "Test: Parallel batch execution...\n"; - - let pool = Domain_pool.create () in - - (* Create batch of computations: increment 100 numbers *) - let computations = List.init 100 (fun i -> - let subject = Noun.atom i in - let formula = Noun.cell (Noun.atom 4) (Noun.cell (Noun.atom 0) (Noun.atom 1)) in (* [4 0 1] = increment subject *) - (subject, formula) - ) in - - Printf.printf " Executing %d Nock computations in parallel...\n" (List.length computations); - - let start = Unix.gettimeofday () in - let results = Nock_parallel.parallel_batch pool computations in - let time = Unix.gettimeofday () -. start in - - Printf.printf " Completed in %.4f seconds\n" time; - - (* Check all succeeded *) - let successes = List.filter (function - | Nock_parallel.Success _ -> true - | _ -> false - ) results in - - Printf.printf " Successes: %d/%d\n" (List.length successes) (List.length results); - - (* Print first few errors if any *) - if List.length successes < List.length computations then begin - Printf.printf " First few errors:\n"; - let errors = List.filter (function - | Nock_parallel.Error _ -> true - | _ -> false - ) results in - List.iteri (fun i result -> - if i < 3 then - match result with - | Nock_parallel.Error msg -> Printf.printf " Error %d: %s\n" i msg - | _ -> () - ) errors - end; - - assert (List.length successes = List.length computations); - - Domain_pool.shutdown pool; - - Printf.printf " ✓ Parallel batch execution works!\n\n" - -let test_parallel_scry _env = - Printf.printf "Test: Parallel scry (read-only queries)...\n"; - - let pool = Domain_pool.create () in - - (* Create a "kernel state" *) - let state = Noun.cell (Noun.atom 42) (Noun.atom 99) in - - (* Create 50 scry queries: all just read the head *) - let queries = List.init 50 (fun _ -> - Noun.cell (Noun.atom 0) (Noun.atom 2) (* Formula: [0 2] = head *) - ) in - - Printf.printf " Executing %d scry queries in parallel...\n" (List.length queries); - - let start = Unix.gettimeofday () in - let results = Nock_parallel.parallel_scry pool state queries in - let time = Unix.gettimeofday () -. start in - - Printf.printf " Completed in %.4f seconds\n" time; - - (* All should return 42 (the head) *) - let successes = List.filter_map (function - | Nock_parallel.Success noun -> Some noun - | _ -> None - ) results in - - let all_correct = List.for_all (fun noun -> - noun = Noun.atom 42 - ) successes in - - assert all_correct; - - Printf.printf " All %d queries returned correct results\n" (List.length successes); - - Domain_pool.shutdown pool; - - Printf.printf " ✓ Parallel scry works! (This is huge for serving many clients!)\n\n" - -let test_async_execution _env = - Printf.printf "Test: Async Nock execution...\n"; - - let pool = Domain_pool.create () in - - (* Launch 10 async Nock computations *) - let promises = List.init 10 (fun i -> - let subject = Noun.atom i in - let formula = Noun.cell (Noun.atom 4) (Noun.cell (Noun.atom 0) (Noun.atom 1)) in (* [4 0 1] = increment *) - Nock_parallel.async_nock pool subject formula - ) in - - Printf.printf " Launched %d async computations\n" (List.length promises); - - (* Wait for all to complete *) - let results = List.map (fun promise -> - Domainslib.Task.await pool.Domain_pool.pool promise - ) promises in - - let successes = List.filter (function - | Nock_parallel.Success _ -> true - | _ -> false - ) results in - - Printf.printf " Completed: %d/%d\n" (List.length successes) (List.length promises); - - assert (List.length successes = List.length promises); - - Domain_pool.shutdown pool; - - Printf.printf " ✓ Async execution works!\n\n" - -let test_parallel_speedup _env = - Printf.printf "Test: Parallel speedup benchmark...\n"; - - let pool = Domain_pool.create () in - let stats = Domain_pool.stats pool in - - Printf.printf " Testing with %d domains across %d cores\n" - stats.num_domains stats.available_cores; - - (* Run benchmark with increasing workload *) - let counts = [10; 50; 100; 500] in - - List.iter (fun count -> - Printf.printf "\n === Workload: %d increments ===\n" count; - - let bench = Nock_parallel.parallel_increment_bench pool count in - - Printf.printf " Sequential: %.4f seconds\n" bench.sequential_time; - Printf.printf " Parallel: %.4f seconds\n" bench.parallel_time; - Printf.printf " Speedup: %.2fx\n" bench.speedup; - Printf.printf " Correct: %b\n" bench.results_match; - - assert bench.results_match; - - if bench.speedup > 1.0 then - Printf.printf " ✓ Parallel is faster!\n" - else if count < 100 then - Printf.printf " (Small workload - overhead dominates)\n" - else - Printf.printf " (Note: Speedup limited by workload size)\n" - ) counts; - - Domain_pool.shutdown pool; - - Printf.printf "\n ✓ Benchmark complete!\n\n" - -let test_large_parallel_batch _env = - Printf.printf "Test: Large parallel batch (1000 computations)...\n"; - - let pool = Domain_pool.create () in - - (* Create 1000 computations *) - let computations = List.init 1000 (fun i -> - let subject = Noun.atom i in - let formula = Noun.cell (Noun.atom 4) (Noun.cell (Noun.atom 0) (Noun.atom 1)) in (* [4 0 1] = increment *) - (subject, formula) - ) in - - Printf.printf " Executing %d Nock computations...\n" (List.length computations); - - let start = Unix.gettimeofday () in - let results = Nock_parallel.parallel_batch pool computations in - let time = Unix.gettimeofday () -. start in - - let successes = List.filter (function - | Nock_parallel.Success _ -> true - | _ -> false - ) results in - - Printf.printf " Completed %d/%d in %.4f seconds\n" - (List.length successes) (List.length results) time; - - Printf.printf " Throughput: %.0f ops/sec\n" - (float_of_int (List.length successes) /. time); - - assert (List.length successes = 1000); - - Domain_pool.shutdown pool; - - Printf.printf " ✓ Large batch processing works!\n\n" - -let () = - Eio_main.run @@ fun env -> - Printf.printf "\n🚀🚀🚀 === PARALLEL NOCK TESTS === 🚀🚀🚀\n\n"; - Printf.printf "OCaml %s with %d CPU cores available\n\n" - Sys.ocaml_version (Domain.recommended_domain_count ()); - - test_domain_pool env; - test_parallel_batch env; - test_parallel_scry env; - test_async_execution env; - test_parallel_speedup env; - test_large_parallel_batch env; - - Printf.printf "🎉🎉🎉 === ALL PARALLEL NOCK TESTS PASSED! === 🎉🎉🎉\n\n"; - Printf.printf "🔥 THE BREAKTHROUGH IS REAL! 🔥\n\n"; - Printf.printf "We just proved:\n"; - Printf.printf "- Nock can run across multiple CPU cores ✓\n"; - Printf.printf "- Parallel scry for serving many clients ✓\n"; - Printf.printf "- Async execution for non-blocking operations ✓\n"; - Printf.printf "- Parallel speedup (faster than sequential!) ✓\n\n"; - Printf.printf "C Vere is stuck on 1 core. We can use ALL %d cores!\n" - (Domain.recommended_domain_count ()); - Printf.printf "\nThis changes EVERYTHING for Urbit scalability! 🚀\n" diff --git a/ocaml/test/test_pill_depth.ml b/ocaml/test/test_pill_depth.ml deleted file mode 100644 index 329465b..0000000 --- a/ocaml/test/test_pill_depth.ml +++ /dev/null @@ -1,98 +0,0 @@ -(* Examine Pill Structure at Depth - * - * Maybe Arvo is nested inside the pill structure - *) - -open Nock_lib - -let rec find_gates noun depth max_depth path = - if depth > max_depth then [] - else - match noun with - | Noun.Atom _ -> [] - | Noun.Cell (head, tail) -> - let this_is_gate = - (* A gate has: [battery sample context] where battery is a cell *) - Noun.is_cell head && - Noun.is_cell tail && - Noun.is_cell (Noun.head tail) in (* tail = [sample context] *) - - let gates = if this_is_gate then [(depth, List.rev path, noun)] else [] in - let head_gates = find_gates head (depth + 1) max_depth (2 :: path) in - let tail_gates = find_gates tail (depth + 1) max_depth (3 :: path) in - gates @ head_gates @ tail_gates - -let test_pill_depth env = - Printf.printf "🔍 Searching for Gates in Pill Structure\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Load ivory pill *) - let state = State.create () in - match Boot.boot_from_file ~fs state "ivory.pill" with - | Error msg -> - Printf.printf "✗ Failed to load pill: %s\n%!" msg - | Ok () -> - let kernel = State.get_arvo state in - - Printf.printf "Searching for gate structures (depth 0-8)...\n\n"; - - let gates = find_gates kernel 0 8 [] in - - if List.length gates = 0 then - Printf.printf "No gate structures found!\n\n" - else begin - Printf.printf "Found %d potential gates:\n\n" (List.length gates); - List.iteri (fun i (depth, path, gate) -> - Printf.printf "%d. At depth %d, path: [%s]\n" (i + 1) depth - (String.concat " " (List.map string_of_int path)); - - (* Try to call it *) - try - let formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - let _result = Nock.nock_on gate formula in - Printf.printf " ✓ CALLABLE! Path to Arvo: [%s]\n\n" - (String.concat " " (List.map string_of_int path)) - with e -> - Printf.printf " ✗ Not callable: %s\n\n" (Printexc.to_string e) - ) gates - end; - - (* Also check: maybe pill is [type data] *) - Printf.printf "Checking if pill is a tagged pair...\n"; - if Noun.is_cell kernel then begin - let tag = Noun.head kernel in - let payload = Noun.tail kernel in - - match tag with - | Noun.Atom z when Z.numbits z < 32 -> - Printf.printf " Tag: %s\n" (Z.to_string z); - Printf.printf " Payload: %s\n" - (if Noun.is_cell payload then "Cell" else "Atom"); - - (* Try calling payload *) - if Noun.is_cell payload then begin - Printf.printf "\n Trying to call payload...\n"; - try - let formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - let _result = Nock.nock_on payload formula in - Printf.printf " ✓ Payload is callable!\n" - with e -> - Printf.printf " ✗ Payload not callable: %s\n" (Printexc.to_string e) - end - | _ -> Printf.printf " Not a simple tagged pair\n" - end - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Searching for Arvo in Pill Structure\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_pill_depth diff --git a/ocaml/test/test_poke_formulas.ml b/ocaml/test/test_poke_formulas.ml deleted file mode 100644 index 54c08ff..0000000 --- a/ocaml/test/test_poke_formulas.ml +++ /dev/null @@ -1,85 +0,0 @@ -(* Test Different Poke Formulas - * - * Try various Nock formulas to figure out how to call Arvo - *) - -open Nock_lib - -let test_formula name formula kernel event = - Printf.printf "Testing: %s\n" name; - Printf.printf " Formula: %s\n" formula; - - let subject = Noun.cell event kernel in - - try - let start = Unix.gettimeofday () in - let result = Nock.nock_on subject - (match name with - | "Slot 3" -> Noun.cell (Noun.atom 0) (Noun.atom 3) - | "Call slot 3 arm 2" -> - Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 3))) - | "Compose [event kernel] then call" -> - (* [7 formula-a formula-b]: compute a, use as subject for b *) - Noun.cell (Noun.atom 7) - (Noun.cell - (Noun.cell (Noun.atom 0) (Noun.atom 2)) (* formula-a: get event *) - (Noun.cell (Noun.atom 9) (* formula-b: call arm 2 *) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 3))))) (* of kernel *) - | _ -> Noun.cell (Noun.atom 0) (Noun.atom 1)) in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf " ✓ Success in %.4fs\n" elapsed; - (match result with - | Noun.Atom z -> - if Z.numbits z < 20 then - Printf.printf " Result: Atom(%s)\n" (Z.to_string z) - else - Printf.printf " Result: Atom(large: %d bits)\n" (Z.numbits z) - | Noun.Cell _ -> Printf.printf " Result: Cell(...)\n"); - Printf.printf "\n"; - true - - with e -> - Printf.printf " ✗ Failed: %s\n\n" (Printexc.to_string e); - false - -let test_poke_formulas env = - Printf.printf "🧪 Testing Different Poke Formulas\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Load ivory pill *) - let state = State.create () in - match Boot.boot_from_file ~fs state "ivory.pill" with - | Error msg -> - Printf.printf "✗ Failed to load pill: %s\n%!" msg - | Ok () -> - let kernel = State.get_arvo state in - let event = Noun.cell (Noun.atom 0) (Noun.atom 42) in - - Printf.printf "Kernel loaded, trying different formulas...\n\n"; - - let formulas = [ - ("Slot 3", "[0 3] - just return kernel"); - ("Call slot 3 arm 2", "[9 2 0 3] - call arm 2 of kernel"); - ("Compose [event kernel] then call", "[7 [0 2] [0 3] [9 2 0 1]]"); - ] in - - let _ = List.map (fun (name, desc) -> - test_formula name desc kernel event - ) formulas in - - () - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Testing Different Poke Formulas on Arvo\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_poke_formulas diff --git a/ocaml/test/test_poke_solid_arvo.ml b/ocaml/test/test_poke_solid_arvo.ml deleted file mode 100644 index e81c41f..0000000 --- a/ocaml/test/test_poke_solid_arvo.ml +++ /dev/null @@ -1,120 +0,0 @@ -(* Test poking the Arvo kernel from solid pill *) - -open Nock_lib - -let extract_arvo_from_solid () = - Printf.printf "Extracting Arvo from solid pill...\n"; - - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (_tag, events) -> - (* Get event 1 which should be the initial kernel *) - let rec nth n noun = - match noun with - | Noun.Atom _ -> None - | Noun.Cell (item, rest) -> - if n = 0 then Some item - else nth (n - 1) rest - in - - begin match nth 1 events with - | Some (Noun.Cell (_wire, card)) -> - Printf.printf "✓ Extracted Arvo from event 1\n\n"; - Some card - | _ -> - Printf.printf "✗ Could not extract event 1\n"; - None - end - - | _ -> None - -let test_poke _env = - Printf.printf "🎯 Testing Arvo Poke from Solid Pill\n\n"; - - match extract_arvo_from_solid () with - | None -> - Printf.printf "✗ Failed to extract Arvo\n" - - | Some arvo -> - Printf.printf "Creating test event...\n"; - - (* Simple test event: [wire card] *) - let test_event = Noun.cell - (Noun.atom 0) (* wire *) - (Noun.cell (Noun.atom 1) (Noun.atom 42)) (* card [1 42] *) - in - - Printf.printf "Test event: [0 [1 42]]\n\n"; - - try - (* Get poke gate *) - let gate = Noun.slot (Z.of_int 23) arvo in - Printf.printf "✓ Found poke gate at slot 23\n\n"; - - (* Build subject: [event gate] *) - let subject = Noun.cell test_event gate in - - (* Call gate: [9 2 [0 2] [0 3]] *) - let formula = Noun.cell - (Noun.atom 9) - (Noun.cell - (Noun.atom 2) - (Noun.cell - (Noun.cell (Noun.atom 0) (Noun.atom 2)) - (Noun.cell (Noun.atom 0) (Noun.atom 3)))) - in - - Printf.printf "Calling Arvo poke gate...\n%!"; - let start = Unix.gettimeofday () in - let result = Nock.nock_on subject formula in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf "✓ Poke succeeded in %.4fs!\n\n" elapsed; - - (* Examine result *) - begin match result with - | Noun.Cell (effects, new_kernel) -> - Printf.printf "Result structure: [effects new_kernel]\n"; - Printf.printf " Effects: %s\n" - (match effects with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - Printf.printf " New kernel: %s\n\n" - (match new_kernel with Noun.Atom _ -> "atom" | Noun.Cell _ -> "cell"); - - (* Check if new kernel still has poke gate *) - begin try - let _new_gate = Noun.slot (Z.of_int 23) new_kernel in - Printf.printf "✓ New kernel has poke gate\n\n"; - Printf.printf "🎉 ARVO IS FULLY FUNCTIONAL!\n"; - Printf.printf "\nWe can now:\n"; - Printf.printf " - Send events to Arvo\n"; - Printf.printf " - Process effects\n"; - Printf.printf " - Build a full Urbit runtime!\n" - with _ -> - Printf.printf "✗ New kernel missing poke gate\n" - end - - | Noun.Atom _ -> - Printf.printf "Result is an atom (unexpected)\n" - end - - with - | Noun.Exit -> - Printf.printf "✗ Nock failed (Exit)\n"; - Printf.printf "\nThis might mean:\n"; - Printf.printf " - Wrong gate location (not slot 23)\n"; - Printf.printf " - Wrong formula\n"; - Printf.printf " - Event format is incorrect\n" - | Not_found -> - Printf.printf "✗ No gate at slot 23\n" - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Test Poking Solid Pill Arvo\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_poke diff --git a/ocaml/test/test_real_arvo.ml b/ocaml/test/test_real_arvo.ml deleted file mode 100644 index 0c052d7..0000000 --- a/ocaml/test/test_real_arvo.ml +++ /dev/null @@ -1,111 +0,0 @@ -(* Extract and Test Real Arvo - * - * We found a callable gate at depth 8 - let's extract and test it! - *) - -open Nock_lib - -let rec navigate_to_depth noun path = - match path with - | [] -> noun - | slot :: rest -> - let next = Noun.slot (Z.of_int slot) noun in - navigate_to_depth next rest - -let test_real_arvo env = - Printf.printf "🎯 Testing Real Arvo Gate\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Load ivory pill *) - let state = State.create () in - match Boot.boot_from_file ~fs state "ivory.pill" with - | Error msg -> - Printf.printf "✗ Failed to load pill: %s\n%!" msg - | Ok () -> - let pill = State.get_arvo state in - - (* Navigate to the callable gate we found - * We need to find which path leads to depth 8 callable gate - * Let me try common paths *) - - let test_paths = [ - ([3; 3; 2; 3; 2; 3; 3; 2], "REAL ARVO PATH"); - ] in - - Printf.printf "Trying different paths to depth 8...\n\n"; - - List.iter (fun (path, desc) -> - Printf.printf "Path %s: " desc; - try - let gate = navigate_to_depth pill path in - - (* Check if it's a gate *) - if Noun.is_cell gate && - Noun.is_cell (Noun.head gate) && (* battery is cell *) - Noun.is_cell (Noun.tail gate) then begin - - (* Try to call it *) - try - let formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - let _result = Nock.nock_on gate formula in - Printf.printf "✓ FOUND ARVO!\n\n"; - - (* Now try a real poke *) - Printf.printf " Testing poke with event...\n"; - let event = Noun.cell (Noun.atom 0) (Noun.atom 42) in - let poke_subject = Noun.cell event gate in - - (* Try different poke formulas *) - - (* Formula 1: [8 gate [9 2 [0 1]]] - push gate, call arm 2 *) - Printf.printf " Trying formula 1: [8 gate [9 2 [0 1]]]...\n"; - (try - let f1 = Noun.cell (Noun.atom 8) - (Noun.cell gate - (Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))))) in - let _ = Nock.nock_on poke_subject f1 in - Printf.printf " ✓ Formula 1 works!\n" - with e -> - Printf.printf " ✗ Formula 1 failed: %s\n" (Printexc.to_string e)); - - (* Formula 2: [7 [[0 2] gate] [9 2 [0 1]]] - compose event with gate, call *) - Printf.printf " Trying formula 2: [7 [[0 2] gate] [9 2 [0 1]]]...\n"; - let poke_formula = Noun.cell (Noun.atom 7) - (Noun.cell - (Noun.cell (Noun.cell (Noun.atom 0) (Noun.atom 2)) gate) (* [event gate] *) - (Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))))) in (* call arm 2 *) - - let start = Unix.gettimeofday () in - let result = Nock.nock_on poke_subject poke_formula in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf " ✓ POKE SUCCEEDED in %.4fs!\n" elapsed; - Printf.printf " Result is: %s\n\n" - (if Noun.is_cell result then "Cell (new state + effects)" else "Atom"); - - Printf.printf "🎉 WE CAN CALL ARVO!\n" - with e -> - Printf.printf "✗ Call failed: %s\n\n" (Printexc.to_string e) - end else - Printf.printf "not a gate\n" - - with e -> - Printf.printf "✗ %s\n" (Printexc.to_string e) - ) test_paths - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Extracting and Testing Real Arvo\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_real_arvo diff --git a/ocaml/test/test_roundtrip.ml b/ocaml/test/test_roundtrip.ml deleted file mode 100644 index 4a4e635..0000000 --- a/ocaml/test/test_roundtrip.ml +++ /dev/null @@ -1,15 +0,0 @@ -open Nock_lib.Noun -open Nock_lib.Serial - -let () = - Printf.printf "Testing roundtrip...\n"; - let n = atom 42 in - for i = 1 to 5 do - Printf.printf "Iteration %d\n" i; - let j = jam n in - Printf.printf " jammed: %s\n" (bytes_to_hex j); - let c = cue j in - Format.printf " cued: %a\n" pp_noun c; - flush stdout - done; - Printf.printf "Done!\n" diff --git a/ocaml/test/test_runtime.ml b/ocaml/test/test_runtime.ml deleted file mode 100644 index ff0514c..0000000 --- a/ocaml/test/test_runtime.ml +++ /dev/null @@ -1,178 +0,0 @@ -(* Runtime Tests - Testing the Eio-based Urbit runtime - * - * Tests: - * 1. Basic runtime creation - * 2. Event processing - * 3. Effect execution - * 4. Timer driver (Behn) - * 5. Concurrent event processing - *) - -open Nock_lib - -let test_runtime_creation env = - Printf.printf "Test: Runtime creation...\n"; - - (* Create pier directory *) - (try Unix.mkdir "tmp/test_pier" 0o755 with _ -> ()); - - let config = Runtime.default_config ~pier_path:"tmp/test_pier" () in - let events = [ - Noun.atom 1; - Noun.atom 2; - Noun.atom 3; - ] in - - let runtime = Runtime.run_simple ~env config events in - let stats = Runtime.get_stats runtime in - - Printf.printf " Events processed: %Ld\n" stats.events_processed; - Printf.printf " State: %s\n" stats.state_summary; - - assert (stats.events_processed = 3L); - - Printf.printf " ✓ Runtime created and processed events!\n\n" - -let test_effect_queue _env = - Printf.printf "Test: Effect queue...\n"; - - let queue = Nock_lib.Effects.create_queue () in - - (* Add some effects *) - Nock_lib.Effects.enqueue queue (Nock_lib.Effects.Log "Test message 1"); - Nock_lib.Effects.enqueue queue (Nock_lib.Effects.SetTimer { id = 1L; time = 123.0 }); - Nock_lib.Effects.enqueue queue (Nock_lib.Effects.Log "Test message 2"); - - Printf.printf " Queue length: %d\n" (Nock_lib.Effects.queue_length queue); - assert (Nock_lib.Effects.queue_length queue = 3); - - (* Dequeue *) - let eff1 = Nock_lib.Effects.dequeue queue in - (match eff1 with - | Nock_lib.Effects.Log msg -> Printf.printf " Dequeued: Log(%s)\n" msg - | _ -> failwith "Wrong effect type" - ); - - assert (Nock_lib.Effects.queue_length queue = 2); - - Printf.printf " ✓ Effect queue works!\n\n" - -let test_behn_driver env = - Printf.printf "Test: Behn timer driver...\n"; - - Eio.Switch.run @@ fun _sw -> - - let behn = Io_drivers.Behn.create () in - let now = Unix.gettimeofday () in - - (* Set a timer for 0.1 seconds from now *) - Io_drivers.Behn.set_timer behn ~id:1L ~fire_time:(now +. 0.1); - - Printf.printf " Active timers: %d\n" (Io_drivers.Behn.active_timers behn); - assert (Io_drivers.Behn.active_timers behn = 1); - - (* Sleep to let timer fire *) - Eio.Time.sleep (Eio.Stdenv.clock env) 0.2; - - Printf.printf " Active timers after fire: %d\n" (Io_drivers.Behn.active_timers behn); - - Printf.printf " ✓ Behn driver works!\n\n" - -let test_timer_cancellation env = - Printf.printf "Test: Timer cancellation...\n"; - - Eio.Switch.run @@ fun _sw -> - - let behn = Io_drivers.Behn.create () in - let now = Unix.gettimeofday () in - - (* Set a timer *) - Io_drivers.Behn.set_timer behn ~id:1L ~fire_time:(now +. 1.0); - assert (Io_drivers.Behn.active_timers behn = 1); - - (* Cancel it immediately *) - Io_drivers.Behn.cancel_timer behn ~id:1L; - - (* Sleep *) - Eio.Time.sleep (Eio.Stdenv.clock env) 0.1; - - Printf.printf " ✓ Timer cancelled successfully!\n\n" - -let test_concurrent_timers env = - Printf.printf "Test: Concurrent timers...\n"; - - Eio.Switch.run @@ fun sw -> - - let behn = Io_drivers.Behn.create () in - let effect_queue = Nock_lib.Effects.create_queue () in - let event_stream = Eio.Stream.create 100 in - - let now = Unix.gettimeofday () in - - (* Set multiple timers with different delays *) - let timer_ids = [1L; 2L; 3L; 4L; 5L] in - List.iteri (fun i id -> - let delay = 0.05 *. float_of_int (i + 1) in - Nock_lib.Effects.enqueue effect_queue (Nock_lib.Effects.SetTimer { - id; - time = now +. delay; - }) - ) timer_ids; - - Printf.printf " Set %d timers\n" (List.length timer_ids); - - (* Run behn driver fiber with timeout *) - Eio.Fiber.fork ~sw (fun () -> - (* Run for limited time *) - let start = Unix.gettimeofday () in - let rec loop () = - if Unix.gettimeofday () -. start < 0.5 then begin - match Nock_lib.Effects.try_dequeue effect_queue with - | Some (Nock_lib.Effects.SetTimer { id; time }) -> - Io_drivers.Behn.set_timer behn ~id ~fire_time:time; - let timer = Hashtbl.find behn.timers id in - Eio.Fiber.fork ~sw (fun () -> - Io_drivers.Behn.timer_fiber behn ~env ~event_stream timer - ); - loop () - | _ -> - Eio.Time.sleep (Eio.Stdenv.clock env) 0.01; - loop () - end - in - loop () - ); - - (* Sleep to allow driver to run *) - Eio.Time.sleep (Eio.Stdenv.clock env) 0.6; - - (* Count events produced *) - let event_count = ref 0 in - while Eio.Stream.length event_stream > 0 do - let _ = Eio.Stream.take event_stream in - event_count := !event_count + 1 - done; - - Printf.printf " Events produced: %d\n" !event_count; - Printf.printf " ✓ Concurrent timers work!\n\n" - -let () = - Eio_main.run @@ fun env -> - Printf.printf "\n🚀 === EIO RUNTIME TESTS === 🚀\n\n"; - - (* Clean up test directories *) - (try Unix.system "rm -rf tmp/test_pier*" |> ignore with _ -> ()); - - test_runtime_creation env; - test_effect_queue env; - test_behn_driver env; - test_timer_cancellation env; - test_concurrent_timers env; - - Printf.printf "🎉 === ALL RUNTIME TESTS PASSED! === 🎉\n"; - Printf.printf "\nThe Eio runtime is working!\n"; - Printf.printf "- Event processing ✓\n"; - Printf.printf "- Effect execution ✓\n"; - Printf.printf "- Timer driver (Behn) ✓\n"; - Printf.printf "- Concurrent fibers ✓\n\n"; - Printf.printf "Ready for a full runtime with all I/O drivers!\n" diff --git a/ocaml/test/test_serial.ml b/ocaml/test/test_serial.ml deleted file mode 100644 index fca30f8..0000000 --- a/ocaml/test/test_serial.ml +++ /dev/null @@ -1,185 +0,0 @@ -open Nock_lib.Noun -open Nock_lib.Serial - -(** Test utilities *) - -let assert_equal expected actual msg = - if not (equal expected actual) then begin - Printf.printf "FAIL: %s\n" msg; - Format.printf " Expected: %a@." pp_noun expected; - Format.printf " Actual: %a@." pp_noun actual; - exit 1 - end else - Printf.printf "PASS: %s\n" msg - -let _assert_bytes_equal expected actual msg = - if expected <> actual then begin - Printf.printf "FAIL: %s\n" msg; - Printf.printf " Expected: %s\n" (bytes_to_hex expected); - Printf.printf " Actual: %s\n" (bytes_to_hex actual); - exit 1 - end else - Printf.printf "PASS: %s\n" msg - -(** Round-trip test: jam then cue should give original *) -let test_roundtrip noun msg = - let jammed = jam noun in - let cued = cue jammed in - assert_equal noun cued msg - -(** Test basic atoms *) -let test_atoms () = - Printf.printf "\n=== Testing atom serialization ===\n"; - - (* Test 0 *) - let n = atom 0 in - test_roundtrip n "atom 0 roundtrip"; - - (* Test small atoms *) - test_roundtrip (atom 1) "atom 1 roundtrip"; - test_roundtrip (atom 2) "atom 2 roundtrip"; - test_roundtrip (atom 42) "atom 42 roundtrip"; - test_roundtrip (atom 255) "atom 255 roundtrip"; - test_roundtrip (atom 256) "atom 256 roundtrip"; - - (* Test larger atoms *) - test_roundtrip (atom 65535) "atom 65535 roundtrip"; - test_roundtrip (atom 1000000) "atom 1000000 roundtrip" - -(** Test basic cells *) -let test_cells () = - Printf.printf "\n=== Testing cell serialization ===\n"; - - (* Simple cell [1 2] *) - let c = cell (atom 1) (atom 2) in - test_roundtrip c "cell [1 2] roundtrip"; - - (* Nested cells [[1 2] 3] *) - let c = cell (cell (atom 1) (atom 2)) (atom 3) in - test_roundtrip c "cell [[1 2] 3] roundtrip"; - - (* Deep nesting *) - let c = cell (cell (cell (atom 1) (atom 2)) (atom 3)) (atom 4) in - test_roundtrip c "cell [[[1 2] 3] 4] roundtrip"; - - (* Larger values *) - let c = cell (atom 1000) (atom 2000) in - test_roundtrip c "cell [1000 2000] roundtrip" - -(** Test trees *) -let test_trees () = - Printf.printf "\n=== Testing tree serialization ===\n"; - - (* Binary tree *) - let tree = cell (cell (atom 1) (atom 2)) (cell (atom 3) (atom 4)) in - test_roundtrip tree "binary tree roundtrip"; - - (* Unbalanced tree *) - let tree = cell (atom 1) (cell (atom 2) (cell (atom 3) (atom 4))) in - test_roundtrip tree "right-leaning tree roundtrip"; - - (* List-like structure [1 [2 [3 0]]] *) - let list = cell (atom 1) (cell (atom 2) (cell (atom 3) (atom 0))) in - test_roundtrip list "list-like structure roundtrip" - -(** Test backreferences - - When the same sub-noun appears multiple times, jam should use backreferences -*) -let test_backrefs () = - Printf.printf "\n=== Testing backreferences ===\n"; - - (* Create a noun with shared structure: [42 42] - The second 42 should be a backref to the first *) - let shared = atom 42 in - let n = cell shared shared in - test_roundtrip n "shared atom [42 42] roundtrip"; - - (* More complex sharing: [[1 2] [1 2]] - Second cell should backref to first *) - let sub = cell (atom 1) (atom 2) in - let n = cell sub sub in - test_roundtrip n "shared cell [[1 2] [1 2]] roundtrip"; - - (* Test that backrefs actually save space *) - let sub = cell (atom 100) (atom 200) in - let with_backref = cell sub sub in - let without_backref = cell (cell (atom 100) (atom 200)) (cell (atom 100) (atom 200)) in - - let jammed_with = jam with_backref in - let jammed_without = jam without_backref in - - Printf.printf " Shared structure size: %d bytes\n" (Bytes.length jammed_with); - Printf.printf " Duplicated structure size: %d bytes\n" (Bytes.length jammed_without); - - (* Note: Due to how OCaml constructs values, physical equality might not work as expected, - but logical equality should still work for roundtrip *) - test_roundtrip with_backref "backref optimization roundtrip" - -(** Test known encodings - - These test vectors would ideally come from the Vere test suite or Urbit dojo -*) -let test_known_encodings () = - Printf.printf "\n=== Testing known encodings ===\n"; - - (* We can generate these from Urbit with (jam 0), (jam 1), etc. *) - - (* jam of 0 should be simple *) - let n = atom 0 in - let jammed = jam n in - Printf.printf " jam(0) = %s (%d bytes)\n" (bytes_to_hex jammed) (Bytes.length jammed); - test_roundtrip n "known encoding: 0"; - - (* jam of 1 *) - let n = atom 1 in - let jammed = jam n in - Printf.printf " jam(1) = %s (%d bytes)\n" (bytes_to_hex jammed) (Bytes.length jammed); - test_roundtrip n "known encoding: 1"; - - (* jam of [0 0] *) - let n = cell (atom 0) (atom 0) in - let jammed = jam n in - Printf.printf " jam([0 0]) = %s (%d bytes)\n" (bytes_to_hex jammed) (Bytes.length jammed); - test_roundtrip n "known encoding: [0 0]" - -(** Test edge cases *) -let test_edge_cases () = - Printf.printf "\n=== Testing edge cases ===\n"; - - (* Very large atom *) - let big = Atom (Z.of_string "123456789012345678901234567890") in - test_roundtrip big "very large atom roundtrip"; - - (* Deep nesting *) - let rec make_deep n = - if n = 0 then atom 0 - else cell (atom n) (make_deep (n - 1)) - in - let deep = make_deep 50 in - test_roundtrip deep "deeply nested structure (50 levels) roundtrip"; - - (* Wide tree *) - let rec make_wide n = - if n = 0 then atom 0 - else cell (make_wide (n - 1)) (make_wide (n - 1)) - in - let wide = make_wide 6 in (* 2^6 = 64 leaves *) - test_roundtrip wide "wide binary tree (6 levels) roundtrip" - -(** Run all tests *) -let () = - Printf.printf "=================================\n"; - Printf.printf "Jam/Cue Serialization Test Suite\n"; - Printf.printf "=================================\n"; - - test_atoms (); - test_cells (); - test_trees (); - test_backrefs (); - test_known_encodings (); - test_edge_cases (); - - Printf.printf "\n=================================\n"; - Printf.printf "All tests passed!\n"; - Printf.printf "=================================\n" diff --git a/ocaml/test/test_slam_directly.ml b/ocaml/test/test_slam_directly.ml deleted file mode 100644 index d7248f5..0000000 --- a/ocaml/test/test_slam_directly.ml +++ /dev/null @@ -1,108 +0,0 @@ -(* Test slamming poke gates directly *) - -open Nock_lib - -let slam_on gate event = - (* C Vere slam_on: [battery [new-sample context]] *) - let battery = Noun.head gate in - let context = Noun.tail (Noun.tail gate) in (* slot 7 *) - let new_core = Noun.cell battery (Noun.cell event context) in - - (* Kick arm 2: [9 2 0 1] *) - let kick_formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - - Nock.nock_on new_core kick_formula - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let test_slam _env = - Printf.printf "Testing direct slam on poke gates...\n\n"; - - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (_tag, events) -> - let event_list = to_list [] events in - - begin match List.nth_opt event_list 1 with - | Some kernel -> - (* Build test event: [now ovum] where ovum = [wire card] *) - Printf.printf "Building test event...\n"; - let wire = Noun.atom 0 in - let card = Noun.cell (Noun.atom 1953719668) (Noun.atom 42) in - let ovum = Noun.cell wire card in - let now = Noun.atom 0 in - let event = Noun.cell now ovum in - Printf.printf " Event: [0 [0 [1953719668 42]]]\n\n"; - - (* Try slot 23 *) - Printf.printf "=== Testing Slot 23 ===\n"; - begin try - let poke_gate = Noun.slot (Z.of_int 23) kernel in - Printf.printf "Slamming slot 23 gate...\n"; - - let start = Unix.gettimeofday () in - let result = slam_on poke_gate event in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf "✓ Slam succeeded in %.4fs!\n\n" elapsed; - - begin match result with - | Noun.Cell (_effects, _new_kernel) -> - Printf.printf "🎉 SLOT 23 WORKS! Result is [effects new-kernel]\n\n" - | Noun.Atom _ -> - Printf.printf "Result is atom (unexpected)\n\n" - end - - with - | Noun.Exit -> - Printf.printf "✗ Slam failed (Nock Exit)\n\n" - | e -> - Printf.printf "✗ Error: %s\n\n" (Printexc.to_string e) - end; - - (* Try slot 42 *) - Printf.printf "=== Testing Slot 42 ===\n"; - begin try - let poke_gate = Noun.slot (Z.of_int 42) kernel in - Printf.printf "Slamming slot 42 gate...\n"; - - let start = Unix.gettimeofday () in - let result = slam_on poke_gate event in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf "✓ Slam succeeded in %.4fs!\n\n" elapsed; - - begin match result with - | Noun.Cell (_effects, _new_kernel) -> - Printf.printf "🎉 SLOT 42 WORKS! Result is [effects new-kernel]\n\n" - | Noun.Atom _ -> - Printf.printf "Result is atom (unexpected)\n\n" - end - - with - | Noun.Exit -> - Printf.printf "✗ Slam failed (Nock Exit)\n\n" - | e -> - Printf.printf "✗ Error: %s\n\n" (Printexc.to_string e) - end - - | None -> - Printf.printf "No event 1\n" - end - - | Noun.Atom _ -> - Printf.printf "Pill is atom\n" - -let () = - Printf.printf "\n═══════════════════════════════════════════\n"; - Printf.printf " Test Direct Slam on Poke Gates\n"; - Printf.printf "═══════════════════════════════════════════\n\n"; - Eio_main.run test_slam diff --git a/ocaml/test/test_solid_boot.ml b/ocaml/test/test_solid_boot.ml deleted file mode 100644 index 08382da..0000000 --- a/ocaml/test/test_solid_boot.ml +++ /dev/null @@ -1,116 +0,0 @@ -(* Test Solid Pill Boot - * - * Try loading solid pill which contains full Arvo kernel - *) - -open Nock_lib - -let test_solid_boot env = - Printf.printf "🎯 Testing Solid Pill Boot\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Load solid pill *) - Printf.printf "Loading solid pill (this may take a while)...\n"; - let file_path = Eio.Path.(fs / "solid.pill") in - let pill_bytes = Eio.Path.load file_path |> Bytes.of_string in - - Printf.printf "Pill size: %.1f MB\n" - (float_of_int (Bytes.length pill_bytes) /. 1024.0 /. 1024.0); - - let start = Unix.gettimeofday () in - let pill = Serial.cue pill_bytes in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf "Cued in %.2fs\n\n" elapsed; - - (* Examine structure *) - Printf.printf "Examining solid pill structure:\n"; - if Noun.is_cell pill then begin - Printf.printf " ✓ Is cell\n"; - - (* Check for tag *) - let head = Noun.head pill in - let tail = Noun.tail pill in - - Printf.printf " Head: %s\n" (if Noun.is_cell head then "Cell" else "Atom"); - (match head with - | Noun.Atom z -> - Printf.printf " Value: %s\n" (Z.to_string z); - Printf.printf " Hex: 0x%s\n" (Z.format "x" z) - | _ -> ()); - - Printf.printf " Tail: %s\n\n" (if Noun.is_cell tail then "Cell" else "Atom"); - - (* Try to navigate to Arvo core at known path *) - Printf.printf "Navigating to Arvo core at [3 3 2 3 2 3 3 2]...\n"; - let path = [3; 3; 2; 3; 2; 3; 3; 2] in - let rec navigate noun = function - | [] -> noun - | slot :: rest -> - navigate (Noun.slot (Z.of_int slot) noun) rest - in - - try - let arvo = navigate tail path in - Printf.printf " ✓ Found Arvo core\n\n"; - - (* Test for slot 23 *) - Printf.printf "Testing for slot 23 (poke interface)...\n"; - (try - let slot_23 = Noun.slot (Z.of_int 23) arvo in - Printf.printf " ✓ Slot 23 exists!\n"; - Printf.printf " Type: %s\n\n" - (if Noun.is_cell slot_23 then "Cell (formula)" else "Atom"); - - (* Try C Vere poke sequence *) - Printf.printf "Attempting poke sequence:\n"; - Printf.printf " 1. Run slot 23 formula on Arvo core\n"; - - let start = Unix.gettimeofday () in - let poke_gate = Nock.nock_on arvo slot_23 in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf " ✓ Got poke gate (%.4fs)\n" elapsed; - - Printf.printf " 2. Slam poke gate with test event\n"; - let event = Noun.cell (Noun.atom 0) (Noun.atom 42) in - - (* Slam: [battery [event context]] *) - let battery = Noun.head poke_gate in - let context = Noun.tail (Noun.tail poke_gate) in - let new_core = Noun.cell battery (Noun.cell event context) in - let kick_formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - - Printf.printf " 3. Call arm 2\n"; - let start = Unix.gettimeofday () in - let result = Nock.nock_on new_core kick_formula in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf " ✓ Poke succeeded in %.4fs!\n" elapsed; - Printf.printf " Result: %s\n\n" - (if Noun.is_cell result then "Cell (effects + new state)" else "Atom"); - - Printf.printf "🎉 SOLID PILL WORKS!\n"; - Printf.printf "We have successfully poked Arvo!\n" - - with e -> - Printf.printf " ✗ Slot 23 test failed: %s\n" (Printexc.to_string e)) - - with e -> - Printf.printf " ✗ Navigation failed: %s\n" (Printexc.to_string e) - - end else - Printf.printf " ✗ Not a cell\n" - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Testing Solid Pill Boot\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_solid_boot diff --git a/ocaml/test/test_solid_cvere_pattern.ml b/ocaml/test/test_solid_cvere_pattern.ml deleted file mode 100644 index a0a4c58..0000000 --- a/ocaml/test/test_solid_cvere_pattern.ml +++ /dev/null @@ -1,129 +0,0 @@ -(* Test C Vere poke pattern on solid pill *) - -open Nock_lib - -let slam_on gate event = - (* C Vere slam_on: [battery [new-sample context]] *) - let battery = Noun.head gate in - let context = Noun.tail (Noun.tail gate) in (* slot 7 *) - let new_core = Noun.cell battery (Noun.cell event context) in - - (* Kick arm 2: [9 2 0 1] *) - let kick_formula = Noun.cell (Noun.atom 9) - (Noun.cell (Noun.atom 2) - (Noun.cell (Noun.atom 0) (Noun.atom 1))) in - - Nock.nock_on new_core kick_formula - -let rec to_list acc noun = - match noun with - | Noun.Atom _ -> List.rev acc - | Noun.Cell (item, rest) -> to_list (item :: acc) rest - -let test_poke _env = - Printf.printf "🎯 Testing C Vere Pattern on Solid Pill\n\n"; - - (* Load solid pill *) - Printf.printf "Loading solid pill...\n"; - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - - match pill with - | Noun.Cell (_tag, events) -> - let event_list = to_list [] events in - Printf.printf "Found %d events\n\n" (List.length event_list); - - (* Event 1 is the initial kernel *) - begin match List.nth_opt event_list 1 with - | Some kernel -> - Printf.printf "Testing on Event 1 (initial kernel):\n\n"; - - (* Try slot 23 (C Vere pattern) *) - Printf.printf "Step 1: Get formula from slot 23...\n"; - begin try - let slot_23_formula = Noun.slot (Z.of_int 23) kernel in - Printf.printf " ✓ Found formula at slot 23\n\n"; - - Printf.printf "Step 2: Run formula to compute poke gate...\n"; - let poke_gate = Nock.nock_on kernel slot_23_formula in - Printf.printf " ✓ Computed poke gate\n\n"; - - Printf.printf "Step 3: Build test event...\n"; - (* Build proper ovum: [wire card] *) - let wire = Noun.atom 0 in - let card = Noun.cell (Noun.atom 1953719668) (Noun.atom 42) in - let ovum = Noun.cell wire card in - - (* Build poke args: [now ovum] *) - let now = Noun.atom 0 in - let event = Noun.cell now ovum in - Printf.printf " Event: [now [wire card]]\n\n"; - - Printf.printf "Step 4: Slam poke gate...\n"; - let start = Unix.gettimeofday () in - let result = slam_on poke_gate event in - let elapsed = Unix.gettimeofday () -. start in - - Printf.printf " ✓ Poke succeeded in %.4fs!\n\n" elapsed; - - begin match result with - | Noun.Cell (_effects, _new_kernel) -> - Printf.printf "Result: [effects new-kernel]\n"; - Printf.printf " ✓ Got expected structure!\n\n"; - Printf.printf "🎉 SOLID PILL ARVO IS WORKING!\n" - | Noun.Atom _ -> - Printf.printf "Result is atom (unexpected)\n" - end - - with - | Noun.Exit -> - Printf.printf " ✗ Nock failed (Exit)\n\n"; - - (* Try slot 42 instead *) - Printf.printf "Trying slot 42 instead...\n"; - begin try - let slot_42 = Noun.slot (Z.of_int 42) kernel in - Printf.printf " ✓ Found something at slot 42\n"; - - (* Check if it's a formula or a gate *) - Printf.printf " Attempting to use as formula...\n"; - let poke_gate = Nock.nock_on kernel slot_42 in - Printf.printf " ✓ Computed gate from slot 42\n\n"; - - let wire = Noun.atom 0 in - let card = Noun.cell (Noun.atom 1953719668) (Noun.atom 42) in - let ovum = Noun.cell wire card in - let now = Noun.atom 0 in - let event = Noun.cell now ovum in - - let result = slam_on poke_gate event in - Printf.printf " ✓ Poke with slot 42 succeeded!\n\n"; - - begin match result with - | Noun.Cell _ -> - Printf.printf "🎉 SLOT 42 WORKS!\n" - | Noun.Atom _ -> - Printf.printf "Result is atom\n" - end - - with - | Noun.Exit -> Printf.printf " ✗ Slot 42 also failed\n" - | Not_found -> Printf.printf " ✗ No slot 42\n" - end - | Not_found -> - Printf.printf " ✗ No slot 23 found\n" - end - - | None -> - Printf.printf "✗ No event 1\n" - end - - | Noun.Atom _ -> - Printf.printf "✗ Pill is atom\n" - -let () = - Printf.printf "\n═══════════════════════════════════════════════════════════\n"; - Printf.printf " Test C Vere Pattern on Solid Pill\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n\n"; - Eio_main.run test_poke diff --git a/ocaml/test/test_solid_structure.ml b/ocaml/test/test_solid_structure.ml deleted file mode 100644 index 21a9433..0000000 --- a/ocaml/test/test_solid_structure.ml +++ /dev/null @@ -1,119 +0,0 @@ -(* Explore solid pill structure to find Arvo *) - -open Nock_lib - -let test_solid env = - Printf.printf "🔍 Exploring Solid Pill Structure\n\n"; - - Eio.Switch.run @@ fun _sw -> - let _fs = Eio.Stdenv.fs env in - - (* Load solid pill (use cached .noun for speed) *) - Printf.printf "Loading solid pill from cache...\n"; - let in_channel = open_in_bin "solid.noun" in - let pill = (Marshal.from_channel in_channel : Noun.noun) in - close_in in_channel; - Printf.printf "✓ Loaded from solid.noun\n\n"; - - (* Solid pill structure: [tag boot-events] *) - match pill with - | Noun.Atom _ -> - Printf.printf "✗ Pill is an atom (unexpected)\n" - - | Noun.Cell (tag, events) -> - Printf.printf "Pill structure: [tag events]\n"; - begin match tag with - | Noun.Atom a -> - Printf.printf " Tag: %s (hex: 0x%s)\n" - (Z.to_string a) (Z.format "x" a) - | _ -> Printf.printf " Tag: cell\n" - end; - - (* Events should be a list *) - Printf.printf "\nExploring boot events...\n"; - let rec count_list n noun = - match noun with - | Noun.Atom _ -> (n, noun) (* terminator *) - | Noun.Cell (item, rest) -> - Printf.printf " Event %d: %s\n" n - (match item with - | Noun.Atom _ -> "atom" - | Noun.Cell _ -> "cell"); - count_list (n + 1) rest - in - - let (event_count, terminator) = count_list 0 events in - Printf.printf "\nTotal events: %d\n" event_count; - Printf.printf "Terminator: %s\n\n" - (match terminator with - | Noun.Atom a -> Printf.sprintf "atom %s" (Z.to_string a) - | Noun.Cell _ -> "cell"); - - (* The 5th event should be the final Arvo kernel *) - Printf.printf "Extracting final Arvo kernel (last event)...\n"; - let rec get_last noun = - match noun with - | Noun.Atom _ -> None - | Noun.Cell (item, rest) -> - match rest with - | Noun.Atom _ -> Some item (* This is the last *) - | Noun.Cell _ -> get_last rest - in - - match get_last events with - | None -> Printf.printf "✗ Could not find last event\n" - | Some last_event -> - Printf.printf "✓ Found last event\n"; - - (* Last event structure: [wire card] where card produces Arvo *) - begin match last_event with - | Noun.Cell (_wire, card) -> - Printf.printf " Event is [wire card]\n"; - Printf.printf " Card: %s\n\n" - (match card with - | Noun.Atom _ -> "atom" - | Noun.Cell _ -> "cell"); - - (* Try to run this event to get Arvo *) - Printf.printf "Attempting to extract Arvo kernel...\n"; - - (* The card might be the kernel directly, or we need to eval it *) - (* Let's check if card has the poke interface at slot 23 *) - begin try - let potential_arvo = card in - let _gate = Noun.slot (Z.of_int 23) potential_arvo in - Printf.printf "✓ Found gate at slot 23 in card!\n"; - Printf.printf "\nThis looks like the Arvo kernel!\n"; - Printf.printf "Let's explore it...\n\n"; - - (* Show structure *) - for i = 2 to 30 do - try - let slot_val = Noun.slot (Z.of_int i) potential_arvo in - let typ = match slot_val with - | Noun.Cell _ -> "cell" - | Noun.Atom _ -> "atom" - in - Printf.printf " Slot %d: %s\n" i typ - with _ -> () - done; - - Printf.printf "\n🎉 Found Arvo in solid pill!\n" - - with _ -> - Printf.printf "✗ No gate at slot 23\n"; - Printf.printf "Card might need to be evaluated first\n" - end - - | _ -> - Printf.printf " Event is not a cell\n" - end - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Exploring Solid Pill Structure\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_solid diff --git a/ocaml/test/test_state.ml b/ocaml/test/test_state.ml deleted file mode 100644 index 1c841c8..0000000 --- a/ocaml/test/test_state.ml +++ /dev/null @@ -1,165 +0,0 @@ -(* State Management Tests - Domain-safe state with Eio - * - * Tests: - * 1. Basic state creation and access - * 2. Atomic event counter - * 3. Save/load snapshots - * 4. Concurrent access across domains (future) - *) - -open Nock_lib - -let test_basic_state _env = - Printf.printf "Test: Basic state creation and access...\n"; - - let state = State.create () in - - (* Check initial values *) - let eve = State.event_num state in - Printf.printf " Initial event number: %Ld\n" eve; - assert (eve = 0L); - - (* Create a simple kernel state *) - let kernel = Noun.cell (Noun.atom 1) (Noun.atom 2) in - State.boot state kernel; - - let arvo = State.get_arvo state in - Printf.printf " Kernel state loaded\n"; - assert (arvo = kernel); - - Printf.printf " ✓ Basic state operations work!\n\n" - -let test_atomic_counter _env = - Printf.printf "Test: Atomic event counter...\n"; - - let state = State.create () in - - (* Initial counter *) - assert (State.event_num state = 0L); - - (* Increment a few times *) - for _i = 1 to 10 do - let _old = State.inc_event state in - () - done; - - let final = State.event_num state in - Printf.printf " After 10 increments: %Ld\n" final; - assert (final = 10L); - - Printf.printf " ✓ Atomic counter works!\n\n" - -let test_snapshot_save_load env = - Printf.printf "Test: Snapshot save/load...\n"; - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Create state with some data *) - let state1 = State.create () in - let kernel = Noun.cell - (Noun.cell (Noun.atom 42) (Noun.atom 99)) - (Noun.atom 1000000) in - State.boot state1 kernel; - - (* Increment event counter *) - for _i = 1 to 5 do - let _ = State.inc_event state1 in - () - done; - - Printf.printf " State before save: %s\n" (State.summary state1); - - (* Save snapshot *) - State.save_snapshot state1 ~fs "tmp/test_state.snapshot"; - Printf.printf " Snapshot saved\n"; - - (* Create new state and load snapshot *) - let state2 = State.create () in - let result = State.load_snapshot state2 ~fs "tmp/test_state.snapshot" in - - match result with - | Ok eve -> - Printf.printf " Snapshot loaded, event: %Ld\n" eve; - Printf.printf " State after load: %s\n" (State.summary state2); - - (* Verify event number *) - assert (State.event_num state2 = 5L); - - (* Verify kernel state *) - let loaded_kernel = State.get_arvo state2 in - assert (loaded_kernel = kernel); - - Printf.printf " ✓ Snapshot save/load works!\n\n" - | Error msg -> - failwith ("Snapshot load failed: " ^ msg) - -let test_poke env = - Printf.printf "Test: Poke (event processing)...\n"; - Eio.Switch.run @@ fun _sw -> - let _fs = Eio.Stdenv.fs env in - - let state = State.create () in - - (* Boot with a simple kernel *) - State.boot state (Noun.atom 0); - assert (State.event_num state = 0L); - - (* Poke with an event *) - let event = Noun.cell (Noun.atom 1) (Noun.atom 2) in - let _effects = State.poke state event in - - (* Event number should have incremented *) - assert (State.event_num state = 1L); - Printf.printf " Event processed, new event number: %Ld\n" (State.event_num state); - - (* Poke again *) - let _effects = State.poke state event in - assert (State.event_num state = 2L); - - Printf.printf " ✓ Poke increments event counter!\n\n" - -let test_peek _env = - Printf.printf "Test: Peek (read-only queries)...\n"; - - let state = State.create () in - let kernel = Noun.atom 42 in - State.boot state kernel; - - (* Peek should return something (formula returns [path kernel]) *) - let result = State.peek state (Noun.atom 0) in - match result with - | Some _noun -> - (* Peek succeeded *) - Printf.printf " ✓ Peek works!\n\n" - | None -> - failwith "Peek returned None" - -let test_cache _env = - Printf.printf "Test: Wish cache...\n"; - - let state = State.create () in - - (* Check initial cache is empty *) - assert (String.contains (State.summary state) '0'); - - (* Clear cache (should be safe to call) *) - State.clear_cache state; - - Printf.printf " ✓ Cache operations work!\n\n" - -let () = - Eio_main.run @@ fun env -> - Printf.printf "\n=== State Management Tests (Domain-safe with Eio) ===\n\n"; - - (* Clean up old test files *) - (try Unix.system "rm -rf tmp/test_state*" |> ignore with _ -> ()); - - test_basic_state env; - test_atomic_counter env; - test_snapshot_save_load env; - test_poke env; - test_peek env; - test_cache env; - - Printf.printf "=== All state tests passed! ✓ ===\n"; - Printf.printf "\nNext: Test concurrent access across domains...\n" diff --git a/ocaml/test/test_two_phase_boot.ml b/ocaml/test/test_two_phase_boot.ml deleted file mode 100644 index 0669b92..0000000 --- a/ocaml/test/test_two_phase_boot.ml +++ /dev/null @@ -1,42 +0,0 @@ -(* Test Two-Phase Boot: Ivory → Solid - * - * This matches the C Vere boot flow: - * 1. Boot ivory pill (lite boot, creates minimal kernel) - * 2. Boot solid events (metamorphosis to full kernel) - *) - -open Nock_lib - -let test_boot env = - Printf.printf "🎯 Testing Two-Phase Boot (Ivory → Solid)\n\n"; - - Eio.Switch.run @@ fun _sw -> - let fs = Eio.Stdenv.fs env in - - (* Create runtime state *) - let state = State.create () in - - (* Boot with ivory + solid *) - match Boot.boot_solid ~fs state "ivory.pill" "solid.pill" with - | Error msg -> - Printf.printf "❌ Boot failed: %s\n" msg; - exit 1 - | Ok () -> - Printf.printf "✅ Boot succeeded!\n\n"; - - (* Check kernel state *) - let arvo = State.get_arvo state in - Printf.printf "Arvo kernel structure:\n"; - Printf.printf " Type: %s\n" - (if Noun.is_cell arvo then "Cell" else "Atom"); - - Printf.printf "\n🎉 TWO-PHASE BOOT COMPLETE!\n" - -let () = - Printf.printf "\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf " Testing Two-Phase Boot System\n"; - Printf.printf "═══════════════════════════════════════════════════════════\n"; - Printf.printf "\n"; - - Eio_main.run test_boot -- cgit v1.2.3