un-inception/tests/test_un_rs.rs
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

219 lines
5.9 KiB
Rust

// Test suite for UN CLI Rust implementation
// Compile: rustc test_un_rs.rs -o test_un_rs
// Run: ./test_un_rs
//
// Tests:
// 1. Unit tests for extension detection
// 2. Integration test for API availability (requires UNSANDBOX_API_KEY)
// 3. Functional test running fib.go
use std::env;
use std::fs;
use std::path::Path;
use std::process::{self, Command};
// Copy of detect_language from un.rs for testing
fn detect_language(filename: &str) -> Option<&'static str> {
let ext = Path::new(filename)
.extension()
.and_then(|e| e.to_str())
.unwrap_or("");
match ext {
"py" => Some("python"),
"js" => Some("javascript"),
"go" => Some("go"),
"rs" => Some("rust"),
"c" => Some("c"),
"cpp" => Some("cpp"),
"d" => Some("d"),
"zig" => Some("zig"),
"nim" => Some("nim"),
"v" => Some("v"),
_ => None,
}
}
fn test_extension_detection() -> bool {
println!("=== Test 1: Extension Detection ===");
let tests = vec![
("script.py", Some("python")),
("app.js", Some("javascript")),
("main.go", Some("go")),
("program.rs", Some("rust")),
("code.c", Some("c")),
("app.cpp", Some("cpp")),
("prog.d", Some("d")),
("main.zig", Some("zig")),
("script.nim", Some("nim")),
("app.v", Some("v")),
("unknown.xyz", None),
];
let mut passed = 0;
let mut failed = 0;
for (filename, expected) in tests {
let result = detect_language(filename);
if result == expected {
println!(" PASS: {} -> {:?}", filename, result);
passed += 1;
} else {
println!(" FAIL: {} -> got {:?}, expected {:?}", filename, result, expected);
failed += 1;
}
}
println!("Extension Detection: {} passed, {} failed\n", passed, failed);
failed == 0
}
fn test_api_connection() -> bool {
println!("=== Test 2: API Connection ===");
let api_key = match env::var("UNSANDBOX_API_KEY") {
Ok(key) => key,
Err(_) => {
println!(" SKIP: UNSANDBOX_API_KEY not set");
println!("API Connection: skipped\n");
return true;
}
};
// Simple Python script to test API
let code = "print('Hello from API test')";
let client = reqwest::blocking::Client::new();
let request_body = serde_json::json!({
"language": "python",
"code": code
});
let response = match client
.post("https://api.unsandbox.com/execute")
.header("Authorization", format!("Bearer {}", api_key))
.json(&request_body)
.send()
{
Ok(resp) => resp,
Err(e) => {
println!(" FAIL: HTTP request error: {}", e);
return false;
}
};
if !response.status().is_success() {
println!(" FAIL: HTTP status {}", response.status());
return false;
}
let result: serde_json::Value = match response.json() {
Ok(json) => json,
Err(e) => {
println!(" FAIL: JSON parse error: {}", e);
return false;
}
};
let stdout_str = result["stdout"].as_str().unwrap_or("");
if !stdout_str.contains("Hello from API test") {
println!(" FAIL: Unexpected output: {}", stdout_str);
return false;
}
println!(" PASS: API connection successful");
println!("API Connection: passed\n");
true
}
fn test_fib_execution() -> bool {
println!("=== Test 3: Functional Test (fib.go) ===");
let api_key = match env::var("UNSANDBOX_API_KEY") {
Ok(_) => {},
Err(_) => {
println!(" SKIP: UNSANDBOX_API_KEY not set");
println!("Functional Test: skipped\n");
return true;
}
};
// Check if un_rust binary exists
let un_binary = "../un_rust";
if !Path::new(un_binary).exists() {
println!(" SKIP: {} binary not found (run: cd .. && rustc un.rs -o un_rust)", un_binary);
println!("Functional Test: skipped\n");
return true;
}
// Check if fib.go exists
let fib_file = "fib.go";
if !Path::new(fib_file).exists() {
println!(" SKIP: {} not found", fib_file);
println!("Functional Test: skipped\n");
return true;
}
// Run un_rust with fib.go
let output = match Command::new(un_binary)
.arg(fib_file)
.output()
{
Ok(out) => out,
Err(e) => {
println!(" FAIL: Execution error: {}", e);
return false;
}
};
if !output.status.success() {
println!(" FAIL: Command failed with exit code: {:?}", output.status.code());
println!(" STDERR: {}", String::from_utf8_lossy(&output.stderr));
return false;
}
let stdout_str = String::from_utf8_lossy(&output.stdout);
if !stdout_str.contains("fib(10) = 55") {
println!(" FAIL: Expected output to contain 'fib(10) = 55', got: {}", stdout_str);
return false;
}
println!(" PASS: fib.go executed successfully");
print!(" Output: {}", stdout_str);
println!("Functional Test: passed\n");
true
}
fn main() {
println!("UN CLI Rust Implementation Test Suite");
println!("======================================\n");
let mut all_passed = true;
if !test_extension_detection() {
all_passed = false;
}
if !test_api_connection() {
all_passed = false;
}
if !test_fib_execution() {
all_passed = false;
}
println!("======================================");
if all_passed {
println!("RESULT: ALL TESTS PASSED");
process::exit(0);
} else {
println!("RESULT: SOME TESTS FAILED");
process::exit(1);
}
}
// Note: This test requires the following dependencies if compiled with cargo:
// [dependencies]
// reqwest = { version = "0.11", features = ["blocking", "json"] }
// serde_json = "1.0"