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.
214 lines
5.6 KiB
D
214 lines
5.6 KiB
D
// Test suite for UN CLI D implementation
|
|
// Compile: dmd test_un_d.d -of=test_un_d
|
|
// Or with LDC: ldc2 test_un_d.d -of=test_un_d
|
|
// Run: ./test_un_d
|
|
//
|
|
// Tests:
|
|
// 1. Unit tests for extension detection
|
|
// 2. Integration test for API availability (requires UNSANDBOX_API_KEY)
|
|
// 3. Functional test running fib.go
|
|
|
|
import std.stdio;
|
|
import std.file;
|
|
import std.path;
|
|
import std.process;
|
|
import std.net.curl;
|
|
import std.json;
|
|
import std.string;
|
|
import std.algorithm;
|
|
import std.conv;
|
|
|
|
// Copy of detectLanguage from un.d for testing
|
|
string detectLanguage(string filename) {
|
|
string[string] langMap = [
|
|
".py": "python",
|
|
".js": "javascript",
|
|
".go": "go",
|
|
".rs": "rust",
|
|
".c": "c",
|
|
".cpp": "cpp",
|
|
".d": "d",
|
|
".zig": "zig",
|
|
".nim": "nim",
|
|
".v": "v"
|
|
];
|
|
|
|
string ext = extension(filename);
|
|
if (ext in langMap) {
|
|
return langMap[ext];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
bool testExtensionDetection() {
|
|
writeln("=== Test 1: Extension Detection ===");
|
|
|
|
struct Test {
|
|
string filename;
|
|
string expected;
|
|
}
|
|
|
|
Test[] tests = [
|
|
Test("script.py", "python"),
|
|
Test("app.js", "javascript"),
|
|
Test("main.go", "go"),
|
|
Test("program.rs", "rust"),
|
|
Test("code.c", "c"),
|
|
Test("app.cpp", "cpp"),
|
|
Test("prog.d", "d"),
|
|
Test("main.zig", "zig"),
|
|
Test("script.nim", "nim"),
|
|
Test("app.v", "v"),
|
|
Test("unknown.xyz", null),
|
|
];
|
|
|
|
int passed = 0;
|
|
int failed = 0;
|
|
|
|
foreach (test; tests) {
|
|
string result = detectLanguage(test.filename);
|
|
|
|
bool testPassed = false;
|
|
if (test.expected is null && result is null) {
|
|
testPassed = true;
|
|
} else if (test.expected !is null && result !is null && result == test.expected) {
|
|
testPassed = true;
|
|
}
|
|
|
|
if (testPassed) {
|
|
writefln(" PASS: %s -> %s", test.filename, result is null ? "null" : result);
|
|
passed++;
|
|
} else {
|
|
writefln(" FAIL: %s -> got %s, expected %s",
|
|
test.filename,
|
|
result is null ? "null" : result,
|
|
test.expected is null ? "null" : test.expected);
|
|
failed++;
|
|
}
|
|
}
|
|
|
|
writefln("Extension Detection: %d passed, %d failed\n", passed, failed);
|
|
return failed == 0;
|
|
}
|
|
|
|
bool testApiConnection() {
|
|
writeln("=== Test 2: API Connection ===");
|
|
|
|
string apiKey = environment.get("UNSANDBOX_API_KEY");
|
|
if (apiKey is null || apiKey.length == 0) {
|
|
writeln(" SKIP: UNSANDBOX_API_KEY not set");
|
|
writeln("API Connection: skipped\n");
|
|
return true;
|
|
}
|
|
|
|
JSONValue requestBody = JSONValue([
|
|
"language": JSONValue("python"),
|
|
"code": JSONValue("print('Hello from API test')")
|
|
]);
|
|
|
|
string jsonBody = requestBody.toString();
|
|
|
|
auto http = HTTP();
|
|
http.addRequestHeader("Content-Type", "application/json");
|
|
http.addRequestHeader("Authorization", "Bearer " ~ apiKey);
|
|
|
|
string response;
|
|
try {
|
|
response = cast(string) post("https://api.unsandbox.com/execute", jsonBody, http);
|
|
} catch (Exception e) {
|
|
writefln(" FAIL: HTTP request error: %s", e.msg);
|
|
return false;
|
|
}
|
|
|
|
JSONValue result;
|
|
try {
|
|
result = parseJSON(response);
|
|
} catch (Exception e) {
|
|
writefln(" FAIL: JSON parse error: %s", e.msg);
|
|
return false;
|
|
}
|
|
|
|
string stdoutStr = result["stdout"].str;
|
|
if (stdoutStr.indexOf("Hello from API test") == -1) {
|
|
writefln(" FAIL: Unexpected response: %s", stdoutStr);
|
|
return false;
|
|
}
|
|
|
|
writeln(" PASS: API connection successful");
|
|
writeln("API Connection: passed\n");
|
|
return true;
|
|
}
|
|
|
|
bool testFibExecution() {
|
|
writeln("=== Test 3: Functional Test (fib.go) ===");
|
|
|
|
string apiKey = environment.get("UNSANDBOX_API_KEY");
|
|
if (apiKey is null || apiKey.length == 0) {
|
|
writeln(" SKIP: UNSANDBOX_API_KEY not set");
|
|
writeln("Functional Test: skipped\n");
|
|
return true;
|
|
}
|
|
|
|
if (!exists("../un_d")) {
|
|
writeln(" SKIP: ../un_d binary not found (run: cd .. && dmd un.d -of=un_d)");
|
|
writeln("Functional Test: skipped\n");
|
|
return true;
|
|
}
|
|
|
|
if (!exists("fib.go")) {
|
|
writeln(" SKIP: fib.go not found");
|
|
writeln("Functional Test: skipped\n");
|
|
return true;
|
|
}
|
|
|
|
try {
|
|
auto result = execute(["../un_d", "fib.go"]);
|
|
|
|
if (result.status != 0) {
|
|
writefln(" FAIL: Command failed with exit code: %d", result.status);
|
|
writefln(" Output: %s", result.output);
|
|
return false;
|
|
}
|
|
|
|
if (result.output.indexOf("fib(10) = 55") == -1) {
|
|
writefln(" FAIL: Expected output to contain 'fib(10) = 55', got: %s", result.output);
|
|
return false;
|
|
}
|
|
|
|
writeln(" PASS: fib.go executed successfully");
|
|
writef(" Output: %s", result.output);
|
|
writeln("Functional Test: passed\n");
|
|
return true;
|
|
} catch (Exception e) {
|
|
writefln(" FAIL: Execution error: %s", e.msg);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
writeln("UN CLI D Implementation Test Suite");
|
|
writeln("===================================\n");
|
|
|
|
bool allPassed = true;
|
|
|
|
if (!testExtensionDetection()) {
|
|
allPassed = false;
|
|
}
|
|
|
|
if (!testApiConnection()) {
|
|
allPassed = false;
|
|
}
|
|
|
|
if (!testFibExecution()) {
|
|
allPassed = false;
|
|
}
|
|
|
|
writeln("===================================");
|
|
if (allPassed) {
|
|
writeln("RESULT: ALL TESTS PASSED");
|
|
return 0;
|
|
} else {
|
|
writeln("RESULT: SOME TESTS FAILED");
|
|
return 1;
|
|
}
|
|
}
|