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.
176 lines
4.8 KiB
OCaml
Executable file
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 ()
|