un-inception/tests/test_un_ex.exs

207 lines
5.6 KiB
Elixir
Executable file

#!/usr/bin/env elixir
# This is free software for the public good of a permacomputer hosted at
# permacomputer.com, an always-on computer by the people, for the people.
# One which is durable, easy to repair, & distributed like tap water
# for machine learning intelligence.
#
# The permacomputer is community-owned infrastructure optimized around
# four values:
#
# TRUTH First principles, math & science, open source code freely distributed
# FREEDOM Voluntary partnerships, freedom from tyranny & corporate control
# HARMONY Minimal waste, self-renewing systems with diverse thriving connections
# LOVE Be yourself without hurting others, cooperation through natural law
#
# This software contributes to that vision by enabling code execution across 42+ programming languages through a unified interface, accessible to all.
# Code is seeds to sprout on any abandoned technology.
# Elixir UN CLI Test Suite
#
# Usage:
# chmod +x test_un_ex.exs
# ./test_un_ex.exs
#
# Or with elixir:
# elixir test_un_ex.exs
#
# Tests the Elixir UN CLI implementation (un.ex) for:
# 1. Extension detection logic
# 2. API integration (if UNSANDBOX_API_KEY is set)
# 3. End-to-end execution with fib.ex test file
defmodule UnCLITest do
# ANSI color codes
@green "\x1b[32m"
@red "\x1b[31m"
@yellow "\x1b[33m"
@reset "\x1b[0m"
# Extension to language mapping (from un.ex)
@ext_to_lang %{
".hs" => "haskell",
".ml" => "ocaml",
".clj" => "clojure",
".scm" => "scheme",
".lisp" => "commonlisp",
".erl" => "erlang",
".ex" => "elixir",
".py" => "python",
".js" => "javascript",
".rb" => "ruby",
".go" => "go",
".rs" => "rust",
".c" => "c",
".cpp" => "cpp",
".java" => "java"
}
# Test result structure
defstruct passed: false, message: nil
# Print test result
def print_result(test_name, %__MODULE__{passed: true}) do
IO.puts("#{@green}✓ PASS#{@reset} - #{test_name}")
true
end
def print_result(test_name, %__MODULE__{passed: false, message: msg}) do
IO.puts("#{@red}✗ FAIL#{@reset} - #{test_name}")
if msg, do: IO.puts(" Error: #{msg}")
false
end
# Test 1: Extension detection
def test_extension_detection do
tests = [
{".hs", "haskell"},
{".ml", "ocaml"},
{".clj", "clojure"},
{".scm", "scheme"},
{".lisp", "commonlisp"},
{".erl", "erlang"},
{".ex", "elixir"},
{".py", "python"},
{".js", "javascript"},
{".rb", "ruby"}
]
failures =
Enum.filter(tests, fn {ext, expected} ->
Map.get(@ext_to_lang, ext) != expected
end)
if Enum.empty?(failures) do
%__MODULE__{passed: true}
else
%__MODULE__{passed: false, message: "#{length(failures)} tests failed"}
end
end
# Run command and capture output
defp run_command(cmd) do
try do
{output, status} = System.cmd("sh", ["-c", cmd], stderr_to_stdout: true)
{status, output}
rescue
e -> {1, "Exception: #{inspect(e)}"}
end
end
# Test 2: API integration
def test_api_integration do
case System.get_env("UNSANDBOX_API_KEY") do
nil ->
%__MODULE__{passed: true}
_ ->
try do
# Create a simple test file
test_code = "IO.puts(\"test\")\n"
File.write!("/tmp/test_un_ex_api.ex", test_code)
# Run the CLI
{status, output} = run_command("./un.ex /tmp/test_un_ex_api.ex 2>&1")
# Check if it executed successfully
if status == 0 && String.contains?(output, "test") do
%__MODULE__{passed: true}
else
%__MODULE__{
passed: false,
message: "API call failed: #{status}, output: #{output}"
}
end
rescue
e ->
%__MODULE__{passed: false, message: "Exception: #{inspect(e)}"}
end
end
end
# Test 3: Functional test with fib.ex
def test_fibonacci do
case System.get_env("UNSANDBOX_API_KEY") do
nil ->
%__MODULE__{passed: true}
_ ->
try do
# Check if fib.ex exists
fib_path = "../test/fib.ex"
# Run the CLI with fib.ex
{status, output} = run_command("./un.ex #{fib_path} 2>&1")
# Check if output contains expected fibonacci result
if status == 0 && String.contains?(output, "fib(10) = 55") do
%__MODULE__{passed: true}
else
%__MODULE__{
passed: false,
message: "Fibonacci test failed: #{status}, output: #{output}"
}
end
rescue
e ->
%__MODULE__{passed: false, message: "Exception: #{inspect(e)}"}
end
end
end
# Main test runner
def run do
IO.puts("=== Elixir UN CLI Test Suite ===\n")
# Check if API key is set
unless System.get_env("UNSANDBOX_API_KEY") do
IO.puts(
"#{@yellow}⚠ WARNING#{@reset} - UNSANDBOX_API_KEY not set, skipping API tests\n"
)
end
# Run tests
results = [
print_result("Extension detection", test_extension_detection()),
print_result("API integration", test_api_integration()),
print_result("Fibonacci end-to-end test", test_fibonacci())
]
IO.puts("")
# Summary
passed = Enum.count(results, & &1)
total = length(results)
if passed == total do
IO.puts("#{@green}✓ All tests passed (#{passed}/#{total})#{@reset}")
System.halt(0)
else
IO.puts("#{@red}✗ Some tests failed (#{passed}/#{total} passed)#{@reset}")
System.halt(1)
end
end
end
# Entry point
UnCLITest.run()