un-inception/tests/unit/test_lisp.lisp
Russell Ballestrini 0b7c6fd08d Add unit tests for all 42 language implementations
Unit tests for extension mapping, signature format, language detection,
argument parsing, file operations, and API constants for:

Systems: C, C++, Rust, Go, Zig, Nim, D, V, Crystal
JVM: Java, Kotlin, Groovy, Clojure
.NET: C#, F#
Functional: Haskell, OCaml, Scheme, Common Lisp, Erlang, Elixir
Scripting: Python, Ruby, JavaScript, TypeScript, Lua, Perl, PHP, Tcl, Bash, AWK, PowerShell
Scientific: Julia, R, Fortran
Legacy/Exotic: COBOL, Prolog, Forth, Raku, Objective-C, Dart

All tests validate internal functions without API calls.
2026-01-05 22:07:13 -05:00

128 lines
3.7 KiB
Common Lisp

#!/usr/bin/env sbcl --script
;;; Unit tests for un.lisp - tests internal functions without API calls
;;; Run with: sbcl --script test_lisp.lisp
(defvar *passed* 0)
(defvar *failed* 0)
(defun test (name result)
(if result
(progn
(format t " ✓ ~a~%" name)
(incf *passed*))
(progn
(format t " ✗ ~a~%" name)
(incf *failed*))))
(defvar *ext-map*
'((".py" . "python") (".js" . "javascript") (".ts" . "typescript")
(".rb" . "ruby") (".go" . "go") (".rs" . "rust") (".c" . "c")
(".lisp" . "lisp") (".java" . "java") (".hs" . "haskell")))
(defun get-language (ext)
(cdr (assoc ext *ext-map* :test #'string=)))
(defun get-extension (filename)
(let ((pos (position #\. filename :from-end t)))
(if pos (subseq filename pos) "")))
(defun get-basename (path)
(let ((pos (position #\/ path :from-end t)))
(if pos (subseq path (1+ pos)) path)))
(defun starts-with (prefix str)
(and (>= (length str) (length prefix))
(string= prefix (subseq str 0 (length prefix)))))
(defun string-contains (haystack needle)
(search needle haystack))
(format t "~%=== Extension Mapping Tests ===~%")
(test "Python extension maps correctly"
(string= (get-language ".py") "python"))
(test "Common Lisp extension maps correctly"
(string= (get-language ".lisp") "lisp"))
(test "JavaScript extension maps correctly"
(string= (get-language ".js") "javascript"))
(test "Go extension maps correctly"
(string= (get-language ".go") "go"))
(format t "~%=== Signature Format Tests ===~%")
(let* ((timestamp "1704067200")
(method "POST")
(endpoint "/execute")
(body "{\"language\":\"python\"}")
(message (format nil "~a:~a:~a:~a" timestamp method endpoint body)))
(test "Signature format starts with timestamp"
(starts-with timestamp message))
(test "Signature format contains :POST:"
(string-contains message ":POST:"))
(test "Signature format contains :/execute:"
(string-contains message ":/execute:")))
(format t "~%=== Language Detection Tests ===~%")
(let* ((content "#!/usr/bin/env python3
print('hello')")
(first-line (subseq content 0 (position #\Newline content))))
(test "Python shebang detection - starts with #!"
(starts-with "#!" first-line))
(test "Python shebang detection - contains python"
(string-contains first-line "python")))
(format t "~%=== Argument Parsing Tests ===~%")
(let* ((arg1 "DEBUG=1")
(eq-pos (position #\= arg1))
(key1 (subseq arg1 0 eq-pos))
(value1 (subseq arg1 (1+ eq-pos))))
(test "Parse -e KEY=VALUE format - key"
(string= key1 "DEBUG"))
(test "Parse -e KEY=VALUE format - value"
(string= value1 "1")))
(let* ((arg2 "URL=https://example.com?foo=bar")
(eq-pos (position #\= arg2))
(key2 (subseq arg2 0 eq-pos))
(value2 (subseq arg2 (1+ eq-pos))))
(test "Parse -e KEY=VALUE with equals in value"
(and (string= key2 "URL")
(string= value2 "https://example.com?foo=bar"))))
(format t "~%=== File Operations Tests ===~%")
(test "Extract file basename"
(string= (get-basename "/home/user/project/script.lisp") "script.lisp"))
(test "Extract file extension"
(string= (get-extension "/home/user/project/script.lisp") ".lisp"))
(format t "~%=== API Constants Tests ===~%")
(let ((api-base "https://api.unsandbox.com"))
(test "API base URL starts with https://"
(starts-with "https://" api-base))
(test "API base URL contains unsandbox.com"
(string-contains api-base "unsandbox.com")))
(format t "~%=== Summary ===~%")
(format t "Passed: ~a~%" *passed*)
(format t "Failed: ~a~%" *failed*)
(format t "Total: ~a~%" (+ *passed* *failed*))
(sb-ext:exit :code (if (> *failed* 0) 1 0))