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.
161 lines
5.7 KiB
R
Executable file
161 lines
5.7 KiB
R
Executable file
#!/usr/bin/env Rscript
|
||
# Comprehensive tests for un.r (R UN CLI Inception implementation)
|
||
# Run with: Rscript test_un_r.r
|
||
|
||
# Color codes
|
||
GREEN <- "\033[32m"
|
||
RED <- "\033[31m"
|
||
BLUE <- "\033[34m"
|
||
RESET <- "\033[0m"
|
||
|
||
# Test counters
|
||
passed <- 0
|
||
failed <- 0
|
||
|
||
# Extension to language mapping (from un.r)
|
||
ext_map <- list(
|
||
".jl" = "julia",
|
||
".r" = "r",
|
||
".cr" = "crystal",
|
||
".f90" = "fortran",
|
||
".cob" = "cobol",
|
||
".pro" = "prolog",
|
||
".forth" = "forth",
|
||
".4th" = "forth",
|
||
".py" = "python",
|
||
".js" = "javascript",
|
||
".rb" = "ruby",
|
||
".go" = "go",
|
||
".rs" = "rust",
|
||
".c" = "c",
|
||
".cpp" = "cpp",
|
||
".java" = "java",
|
||
".sh" = "bash"
|
||
)
|
||
|
||
detect_language <- function(filename) {
|
||
ext <- tolower(sub(".*(\\..*?)$", "\\1", filename))
|
||
lang <- ext_map[[ext]]
|
||
if (is.null(lang)) {
|
||
return("unknown")
|
||
}
|
||
return(lang)
|
||
}
|
||
|
||
print_test <- function(name, result) {
|
||
if (result) {
|
||
cat(sprintf("%s✓ PASS%s: %s\n", GREEN, RESET, name))
|
||
passed <<- passed + 1
|
||
} else {
|
||
cat(sprintf("%s✗ FAIL%s: %s\n", RED, RESET, name))
|
||
failed <<- failed + 1
|
||
}
|
||
}
|
||
|
||
cat(sprintf("\n%s========================================%s\n", BLUE, RESET))
|
||
cat(sprintf("%sUN CLI Inception Tests - R%s\n", BLUE, RESET))
|
||
cat(sprintf("%s========================================%s\n\n", BLUE, RESET))
|
||
|
||
# Test 1: Extension detection tests
|
||
cat(sprintf("%sTest Suite 1: Extension Detection%s\n", BLUE, RESET))
|
||
print_test("Detect .jl as julia", detect_language("test.jl") == "julia")
|
||
print_test("Detect .r as r", detect_language("test.r") == "r")
|
||
print_test("Detect .cr as crystal", detect_language("test.cr") == "crystal")
|
||
print_test("Detect .f90 as fortran", detect_language("test.f90") == "fortran")
|
||
print_test("Detect .cob as cobol", detect_language("test.cob") == "cobol")
|
||
print_test("Detect .pro as prolog", detect_language("test.pro") == "prolog")
|
||
print_test("Detect .forth as forth", detect_language("test.forth") == "forth")
|
||
print_test("Detect .4th as forth", detect_language("test.4th") == "forth")
|
||
print_test("Detect .py as python", detect_language("test.py") == "python")
|
||
print_test("Detect .rs as rust", detect_language("test.rs") == "rust")
|
||
print_test("Detect unknown extension", detect_language("test.xyz") == "unknown")
|
||
|
||
# Test 2: API Integration Test
|
||
cat(sprintf("\n%sTest Suite 2: API Integration%s\n", BLUE, RESET))
|
||
api_key <- Sys.getenv("UNSANDBOX_API_KEY")
|
||
if (api_key == "") {
|
||
cat(sprintf("%sℹ SKIP%s: API integration test (UNSANDBOX_API_KEY not set)\n", BLUE, RESET))
|
||
} else {
|
||
tryCatch({
|
||
library(httr)
|
||
library(jsonlite)
|
||
|
||
url <- "https://api.unsandbox.com/execute"
|
||
headers <- add_headers(
|
||
`Content-Type` = "application/json",
|
||
`Authorization` = paste("Bearer", api_key)
|
||
)
|
||
body <- toJSON(list(
|
||
language = "python",
|
||
code = "print('Hello from test')"
|
||
), auto_unbox = TRUE)
|
||
|
||
response <- POST(url, headers, body = body, encode = "raw")
|
||
result <- fromJSON(content(response, "text", encoding = "UTF-8"))
|
||
|
||
api_works <- !is.null(result$stdout) && grepl("Hello from test", result$stdout)
|
||
print_test("API endpoint reachable and functional", api_works)
|
||
}, error = function(e) {
|
||
print_test("API endpoint reachable and functional", FALSE)
|
||
cat(sprintf(" Error: %s\n", e$message))
|
||
})
|
||
}
|
||
|
||
# Test 3: End-to-end functional test
|
||
cat(sprintf("\n%sTest Suite 3: End-to-End Functional Test%s\n", BLUE, RESET))
|
||
if (api_key == "") {
|
||
cat(sprintf("%sℹ SKIP%s: E2E test (UNSANDBOX_API_KEY not set)\n", BLUE, RESET))
|
||
} else {
|
||
fib_file <- "../../test/fib.r"
|
||
if (!file.exists(fib_file)) {
|
||
fib_file <- "/home/fox/git/unsandbox.com/cli/test/fib.r"
|
||
}
|
||
|
||
if (file.exists(fib_file)) {
|
||
tryCatch({
|
||
un_script <- "../un.r"
|
||
if (!file.exists(un_script)) {
|
||
un_script <- "/home/fox/git/unsandbox.com/cli/inception/un.r"
|
||
}
|
||
|
||
result <- system2("Rscript", args = c(un_script, fib_file),
|
||
stdout = TRUE, stderr = TRUE)
|
||
result_str <- paste(result, collapse = "\n")
|
||
|
||
has_fib10 <- grepl("fib\\(10\\) = 55", result_str)
|
||
has_fib5 <- grepl("fib\\(5\\) = 5", result_str)
|
||
has_fib0 <- grepl("fib\\(0\\) = 0", result_str)
|
||
|
||
print_test("E2E: fib.r produces fib(10) = 55", has_fib10)
|
||
print_test("E2E: fib.r produces fib(5) = 5", has_fib5)
|
||
print_test("E2E: fib.r produces fib(0) = 0", has_fib0)
|
||
}, error = function(e) {
|
||
print_test("E2E: fib.r execution", FALSE)
|
||
cat(sprintf(" Error: %s\n", e$message))
|
||
})
|
||
} else {
|
||
cat(sprintf("%sℹ SKIP%s: E2E test (fib.r not found at expected location)\n", BLUE, RESET))
|
||
}
|
||
}
|
||
|
||
# Test 4: Error handling tests
|
||
cat(sprintf("\n%sTest Suite 4: Error Handling%s\n", BLUE, RESET))
|
||
print_test("Unknown extension returns 'unknown'", detect_language("file.unknown") == "unknown")
|
||
print_test("Case insensitive detection", detect_language("TEST.R") == "r")
|
||
print_test("Multiple dots in filename", detect_language("my.test.py") == "python")
|
||
|
||
# Print summary
|
||
cat(sprintf("\n%s========================================%s\n", BLUE, RESET))
|
||
cat(sprintf("%sTest Summary%s\n", BLUE, RESET))
|
||
cat(sprintf("%s========================================%s\n", BLUE, RESET))
|
||
cat(sprintf("%sPassed: %d%s\n", GREEN, passed, RESET))
|
||
cat(sprintf("%sFailed: %d%s\n", RED, failed, RESET))
|
||
cat(sprintf("%sTotal: %d%s\n", BLUE, passed + failed, RESET))
|
||
|
||
if (failed > 0) {
|
||
cat(sprintf("\n%sTESTS FAILED%s\n", RED, RESET))
|
||
quit(status = 1)
|
||
} else {
|
||
cat(sprintf("\n%sALL TESTS PASSED%s\n", GREEN, RESET))
|
||
quit(status = 0)
|
||
}
|