un-inception/tests/test_un_ml.ml
Russell Ballestrini 2b35819393 Initial commit: 42 UN CLI implementations
Unsandbox CLI implementations in 42 programming languages for the
permacomputer project. Public domain software for code execution
across all ecosystems.

Languages: Python, JavaScript, Ruby, Go, Rust, C, C++, Java, Kotlin,
C#, F#, Haskell, OCaml, Clojure, Scheme, Common Lisp, Erlang, Elixir,
D, Nim, Zig, V, Dart, Groovy, Scala, Julia, R, Crystal, Fortran,
COBOL, Prolog, Forth, Tcl, Raku, Lua, PHP, Perl, Bash, TypeScript,
Objective-C, PowerShell, AWK

Includes test suites and service lifecycle tests.
2025-12-23 09:57:08 -05:00

176 lines
4.8 KiB
OCaml
Executable file

#!/usr/bin/env ocaml
(*
OCaml UN CLI Test Suite
Usage:
chmod +x test_un_ml.ml
ocaml test_un_ml.ml
Or compile and run:
ocamlopt test_un_ml.ml -o test_un_ml
./test_un_ml
Tests the OCaml UN CLI implementation (un.ml) for:
1. Extension detection logic
2. API integration (if UNSANDBOX_API_KEY is set)
3. End-to-end execution with fib.ml test file
*)
(* ANSI color codes *)
let green = "\x1b[32m"
let red = "\x1b[31m"
let yellow = "\x1b[33m"
let reset = "\x1b[0m"
(* Extension to language mapping (from un.ml) *)
let ext_to_lang ext =
match ext with
| ".hs" -> Some "haskell"
| ".ml" -> Some "ocaml"
| ".clj" -> Some "clojure"
| ".scm" -> Some "scheme"
| ".lisp" -> Some "commonlisp"
| ".erl" -> Some "erlang"
| ".ex" -> Some "elixir"
| ".py" -> Some "python"
| ".js" -> Some "javascript"
| ".rb" -> Some "ruby"
| ".go" -> Some "go"
| ".rs" -> Some "rust"
| ".c" -> Some "c"
| ".cpp" -> Some "cpp"
| ".java" -> Some "java"
| _ -> None
(* Test result type *)
type test_result = Pass | Fail of string
(* Print test result *)
let print_result test_name result =
match result with
| Pass ->
Printf.printf "%s✓ PASS%s - %s\n" green reset test_name;
true
| Fail msg ->
Printf.printf "%s✗ FAIL%s - %s\n" red reset test_name;
Printf.printf " Error: %s\n" msg;
false
(* Test 1: Extension detection *)
let test_extension_detection () =
let tests = [
(".hs", Some "haskell");
(".ml", Some "ocaml");
(".clj", Some "clojure");
(".scm", Some "scheme");
(".lisp", Some "commonlisp");
(".erl", Some "erlang");
(".ex", Some "elixir");
(".py", Some "python");
(".js", Some "javascript");
(".rb", Some "ruby");
] in
let failures = List.filter (fun (ext, expected) ->
let actual = ext_to_lang ext in
actual <> expected
) tests in
if List.length failures = 0 then
Pass
else
Fail (Printf.sprintf "Extension mappings failed: %d tests" (List.length failures))
(* Test 2: API integration *)
let test_api_integration () =
try
let api_key = Sys.getenv "UNSANDBOX_API_KEY" in
(* Create a simple test file *)
let test_code = "let () = print_endline \"test\"\n" in
let oc = open_out "/tmp/test_un_ml_api.ml" in
output_string oc test_code;
close_out oc;
(* Run the CLI *)
let cmd = "./un.ml /tmp/test_un_ml_api.ml 2>&1" in
let ic = Unix.open_process_in cmd in
let output = really_input_string ic (in_channel_length ic) in
let status = Unix.close_process_in ic in
(* Check if it executed successfully *)
if status = Unix.WEXITED 0 && String.sub output 0 4 = "test" then
Pass
else
Fail (Printf.sprintf "API call failed: %s" output)
with
| Not_found -> Pass (* Skip test if no API key *)
| e -> Fail (Printf.sprintf "Exception: %s" (Printexc.to_string e))
(* Test 3: Functional test with fib.ml *)
let test_fibonacci () =
try
let _ = Sys.getenv "UNSANDBOX_API_KEY" in
(* Check if fib.ml exists *)
let fib_path = "../test/fib.ml" in
(* Run the CLI with fib.ml *)
let cmd = Printf.sprintf "./un.ml %s 2>&1" fib_path in
let ic = Unix.open_process_in cmd in
let buffer = Buffer.create 1024 in
(try
while true do
let line = input_line ic in
Buffer.add_string buffer line;
Buffer.add_char buffer '\n'
done
with End_of_file -> ());
let output = Buffer.contents buffer in
let status = Unix.close_process_in ic in
(* Check if output contains expected fibonacci result *)
if status = Unix.WEXITED 0 &&
(try ignore (Str.search_forward (Str.regexp "fib(10) = 55") output 0); true
with Not_found -> false) then
Pass
else
Fail (Printf.sprintf "Fibonacci test failed: %s" output)
with
| Not_found -> Pass (* Skip test if no API key *)
| e -> Fail (Printf.sprintf "Exception: %s" (Printexc.to_string e))
(* Main test runner *)
let main () =
Printf.printf "=== OCaml UN CLI Test Suite ===\n\n";
(* Check if API key is set *)
(try
ignore (Sys.getenv "UNSANDBOX_API_KEY")
with Not_found ->
Printf.printf "%s⚠ WARNING%s - UNSANDBOX_API_KEY not set, skipping API tests\n\n"
yellow reset);
(* Run tests *)
let results = [
print_result "Extension detection" (test_extension_detection ());
print_result "API integration" (test_api_integration ());
print_result "Fibonacci end-to-end test" (test_fibonacci ());
] in
Printf.printf "\n";
(* Summary *)
let passed = List.length (List.filter (fun x -> x) results) in
let total = List.length results in
if passed = total then begin
Printf.printf "%s✓ All tests passed (%d/%d)%s\n" green passed total reset;
exit 0
end else begin
Printf.printf "%s✗ Some tests failed (%d/%d passed)%s\n" red passed total reset;
exit 1
end
let () = main ()