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.
136 lines
3.6 KiB
D
136 lines
3.6 KiB
D
// Unit tests for un.d - tests internal functions without API calls
|
|
// Run with: rdmd test_d.d
|
|
|
|
import std.stdio;
|
|
import std.string;
|
|
import std.algorithm;
|
|
import std.array;
|
|
import core.stdc.stdlib : exit;
|
|
|
|
int passed = 0;
|
|
int failed = 0;
|
|
|
|
void test(string name, bool result) {
|
|
if (result) {
|
|
writefln(" ✓ %s", name);
|
|
passed++;
|
|
} else {
|
|
writefln(" ✗ %s", name);
|
|
failed++;
|
|
}
|
|
}
|
|
|
|
string[string] extMap;
|
|
|
|
static this() {
|
|
extMap = [
|
|
".py": "python", ".js": "javascript", ".ts": "typescript",
|
|
".rb": "ruby", ".go": "go", ".rs": "rust", ".c": "c",
|
|
".d": "d", ".java": "java", ".kt": "kotlin", ".hs": "haskell"
|
|
];
|
|
}
|
|
|
|
string getLanguage(string ext) {
|
|
auto p = ext in extMap;
|
|
return p ? *p : "";
|
|
}
|
|
|
|
string getExtension(string filename) {
|
|
auto idx = filename.lastIndexOf('.');
|
|
return idx >= 0 ? filename[idx .. $] : "";
|
|
}
|
|
|
|
string getBasename(string path) {
|
|
auto idx = path.lastIndexOf('/');
|
|
return idx >= 0 ? path[idx + 1 .. $] : path;
|
|
}
|
|
|
|
void main() {
|
|
writeln("\n=== Extension Mapping Tests ===");
|
|
|
|
test("Python extension maps correctly",
|
|
getLanguage(".py") == "python");
|
|
|
|
test("D extension maps correctly",
|
|
getLanguage(".d") == "d");
|
|
|
|
test("JavaScript extension maps correctly",
|
|
getLanguage(".js") == "javascript");
|
|
|
|
test("Go extension maps correctly",
|
|
getLanguage(".go") == "go");
|
|
|
|
writeln("\n=== Signature Format Tests ===");
|
|
|
|
string timestamp = "1704067200";
|
|
string method = "POST";
|
|
string endpoint = "/execute";
|
|
string reqBody = `{"language":"python"}`;
|
|
string message = timestamp ~ ":" ~ method ~ ":" ~ endpoint ~ ":" ~ reqBody;
|
|
|
|
test("Signature format starts with timestamp",
|
|
message.startsWith(timestamp));
|
|
|
|
test("Signature format contains :POST:",
|
|
message.canFind(":POST:"));
|
|
|
|
test("Signature format contains :/execute:",
|
|
message.canFind(":/execute:"));
|
|
|
|
writeln("\n=== Language Detection Tests ===");
|
|
|
|
string content = "#!/usr/bin/env python3\nprint('hello')";
|
|
string firstLine = content.split("\n")[0];
|
|
|
|
test("Python shebang detection - starts with #!",
|
|
firstLine.startsWith("#!"));
|
|
|
|
test("Python shebang detection - contains python",
|
|
firstLine.canFind("python"));
|
|
|
|
writeln("\n=== Argument Parsing Tests ===");
|
|
|
|
string arg1 = "DEBUG=1";
|
|
auto parts1 = arg1.findSplit("=");
|
|
string key1 = parts1[0];
|
|
string value1 = parts1[2];
|
|
|
|
test("Parse -e KEY=VALUE format - key",
|
|
key1 == "DEBUG");
|
|
|
|
test("Parse -e KEY=VALUE format - value",
|
|
value1 == "1");
|
|
|
|
string arg2 = "URL=https://example.com?foo=bar";
|
|
auto parts2 = arg2.findSplit("=");
|
|
string key2 = parts2[0];
|
|
string value2 = parts2[2];
|
|
|
|
test("Parse -e KEY=VALUE with equals in value",
|
|
key2 == "URL" && value2 == "https://example.com?foo=bar");
|
|
|
|
writeln("\n=== File Operations Tests ===");
|
|
|
|
test("Extract file basename",
|
|
getBasename("/home/user/project/script.d") == "script.d");
|
|
|
|
test("Extract file extension",
|
|
getExtension("/home/user/project/script.d") == ".d");
|
|
|
|
writeln("\n=== API Constants Tests ===");
|
|
|
|
string apiBase = "https://api.unsandbox.com";
|
|
|
|
test("API base URL starts with https://",
|
|
apiBase.startsWith("https://"));
|
|
|
|
test("API base URL contains unsandbox.com",
|
|
apiBase.canFind("unsandbox.com"));
|
|
|
|
writeln("\n=== Summary ===");
|
|
writefln("Passed: %d", passed);
|
|
writefln("Failed: %d", failed);
|
|
writefln("Total: %d", passed + failed);
|
|
|
|
exit(failed > 0 ? 1 : 0);
|
|
}
|