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.
219 lines
5.9 KiB
Rust
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"
|