un-inception/tests/unit/test_ocaml.ml
Russell Ballestrini a1eedc55ea Fix failing unit tests in GitHub Actions matrix
- Clojure: Use 'clojure' instead of 'clj -M' for standalone script
- Dart: Add proper pubspec.yaml with SDK environment constraint
- Julia: Install SHA package before running tests
- Lua: Use lua5.4 explicitly, add awk for portable HMAC output parsing
- Perl: Install libjson-perl and libwww-perl dependencies
- Bash: Make un.sh executable before test
- OCaml: Add str.cma and unix.cma for Str module support
- OCaml unit test: Remove Str dependency with pure string search
2026-01-06 09:20:41 -05:00

137 lines
3.9 KiB
OCaml

(* Unit tests for un.ml - tests internal functions without API calls *)
(* Run with: ocaml test_ocaml.ml *)
let passed = ref 0
let failed = ref 0
let test name result =
if result then begin
Printf.printf " ✓ %s\n" name;
incr passed
end else begin
Printf.printf " ✗ %s\n" name;
incr failed
end
let ext_map = [
(".py", "python"); (".js", "javascript"); (".ts", "typescript");
(".rb", "ruby"); (".go", "go"); (".rs", "rust"); (".c", "c");
(".ml", "ocaml"); (".java", "java"); (".hs", "haskell")
]
let get_language ext =
try List.assoc ext ext_map
with Not_found -> ""
let get_extension filename =
try
let idx = String.rindex filename '.' in
String.sub filename idx (String.length filename - idx)
with Not_found -> ""
let get_basename path =
try
let idx = String.rindex path '/' in
String.sub path (idx + 1) (String.length path - idx - 1)
with Not_found -> path
let starts_with prefix str =
let plen = String.length prefix in
String.length str >= plen && String.sub str 0 plen = prefix
let contains haystack needle =
let rec search i =
if i + String.length needle > String.length haystack then false
else if String.sub haystack i (String.length needle) = needle then true
else search (i + 1)
in
search 0
let () =
print_endline "\n=== Extension Mapping Tests ===";
test "Python extension maps correctly"
(get_language ".py" = "python");
test "OCaml extension maps correctly"
(get_language ".ml" = "ocaml");
test "JavaScript extension maps correctly"
(get_language ".js" = "javascript");
test "Go extension maps correctly"
(get_language ".go" = "go");
print_endline "\n=== Signature Format Tests ===";
let timestamp = "1704067200" in
let http_method = "POST" in
let endpoint = "/execute" in
let body = {|{"language":"python"}|} in
let message = Printf.sprintf "%s:%s:%s:%s" timestamp http_method endpoint body in
test "Signature format starts with timestamp"
(starts_with timestamp message);
test "Signature format contains :POST:"
(contains message ":POST:");
test "Signature format contains :/execute:"
(contains message ":/execute:");
print_endline "\n=== Language Detection Tests ===";
let content = "#!/usr/bin/env python3\nprint('hello')" in
let first_line = List.hd (String.split_on_char '\n' content) in
test "Python shebang detection - starts with #!"
(starts_with "#!" first_line);
test "Python shebang detection - contains python"
(contains first_line "python");
print_endline "\n=== Argument Parsing Tests ===";
let arg1 = "DEBUG=1" in
let idx1 = String.index arg1 '=' in
let key1 = String.sub arg1 0 idx1 in
let value1 = String.sub arg1 (idx1 + 1) (String.length arg1 - idx1 - 1) in
test "Parse -e KEY=VALUE format - key"
(key1 = "DEBUG");
test "Parse -e KEY=VALUE format - value"
(value1 = "1");
let arg2 = "URL=https://example.com?foo=bar" in
let idx2 = String.index arg2 '=' in
let key2 = String.sub arg2 0 idx2 in
let value2 = String.sub arg2 (idx2 + 1) (String.length arg2 - idx2 - 1) in
test "Parse -e KEY=VALUE with equals in value"
(key2 = "URL" && value2 = "https://example.com?foo=bar");
print_endline "\n=== File Operations Tests ===";
test "Extract file basename"
(get_basename "/home/user/project/script.ml" = "script.ml");
test "Extract file extension"
(get_extension "/home/user/project/script.ml" = ".ml");
print_endline "\n=== API Constants Tests ===";
let api_base = "https://api.unsandbox.com" in
test "API base URL starts with https://"
(starts_with "https://" api_base);
test "API base URL contains unsandbox.com"
(contains api_base "unsandbox.com");
print_endline "\n=== Summary ===";
Printf.printf "Passed: %d\n" !passed;
Printf.printf "Failed: %d\n" !failed;
Printf.printf "Total: %d\n" (!passed + !failed);
exit (if !failed > 0 then 1 else 0)