un-inception/tests/test_un_m.sh
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

190 lines
6 KiB
Bash
Executable file

#!/usr/bin/env bash
# Test suite for un.m (Objective-C implementation)
# Note: un.m requires compilation, so we use a shell wrapper
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
UN_M="$SCRIPT_DIR/../un.m"
TEST_DIR="$SCRIPT_DIR/../../test"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Test counters
TESTS_RUN=0
TESTS_PASSED=0
TESTS_FAILED=0
# Test result tracking
test_passed() {
((TESTS_PASSED++))
((TESTS_RUN++))
echo -e "${GREEN}✓ PASS${NC}: $1"
}
test_failed() {
((TESTS_FAILED++))
((TESTS_RUN++))
echo -e "${RED}✗ FAIL${NC}: $1"
if [ -n "${2:-}" ]; then
echo -e "${RED} Error: $2${NC}"
fi
}
test_skipped() {
echo -e "${YELLOW}⊘ SKIP${NC}: $1"
}
# Check if clang is available
if ! command -v clang &> /dev/null; then
echo -e "${YELLOW}Clang not found - skipping all Objective-C tests${NC}"
exit 0
fi
# Check if Foundation framework is available (macOS/GNUstep)
if ! clang -x objective-c -framework Foundation -o /tmp/test_objc_check_$$ -xc - <<< "int main(){return 0;}" 2>/dev/null; then
# Try with GNUstep
if ! clang -x objective-c $(gnustep-config --objc-flags 2>/dev/null) -o /tmp/test_objc_check_$$ -xc - <<< "int main(){return 0;}" 2>/dev/null; then
echo -e "${YELLOW}Objective-C Foundation framework not found - skipping all tests${NC}"
rm -f /tmp/test_objc_check_$$
exit 0
fi
fi
rm -f /tmp/test_objc_check_$$
# Unit Tests
echo -e "${BLUE}=== Unit Tests for un.m ===${NC}"
# Test: Script exists
if [ -f "$UN_M" ]; then
test_passed "Script exists"
else
test_failed "Script exists" "File not found"
exit 1
fi
# Test: Script is executable
if [ -x "$UN_M" ]; then
test_passed "Script is executable"
else
test_failed "Script is executable" "File not executable"
fi
# Test: Usage message when no arguments
# Note: un.m needs to compile first, which may fail without args
# We'll just check if it produces some error
if output=$("$UN_M" 2>&1); then
# Check output
if echo "$output" | grep -q "Usage:"; then
test_passed "Shows usage message with no arguments"
else
test_failed "Shows usage message with no arguments" "No clear usage indication"
fi
else
# Non-zero exit is expected
if echo "$output" | grep -q "Usage:"; then
test_passed "Shows usage message with no arguments"
else
# May fail at compile stage, which is acceptable
test_skipped "Shows usage message with no arguments (compilation required)"
fi
fi
# Test: Error on non-existent file (if we can compile)
TEST_BINARY="/tmp/un_objc_test_$$"
if clang -x objective-c -framework Foundation "$UN_M" -o "$TEST_BINARY" 2>/dev/null; then
if output=$("$TEST_BINARY" /tmp/nonexistent_file_12345.xyz 2>&1); then
test_failed "Handles non-existent file" "Should exit with error"
else
if echo "$output" | grep -q "not found"; then
test_passed "Handles non-existent file"
else
test_failed "Handles non-existent file" "Expected 'not found' message"
fi
fi
rm -f "$TEST_BINARY"
else
test_skipped "Handles non-existent file (could not compile test binary)"
fi
# Test: Error on unknown extension
if clang -x objective-c -framework Foundation "$UN_M" -o "$TEST_BINARY" 2>/dev/null; then
UNKNOWN_FILE="/tmp/test_unknown_ext_$$.unknownext"
echo "test" > "$UNKNOWN_FILE"
if output=$("$TEST_BINARY" "$UNKNOWN_FILE" 2>&1); then
test_failed "Handles unknown file extension" "Should exit with error"
else
if echo "$output" | grep -q "Unknown file extension"; then
test_passed "Handles unknown file extension"
else
test_failed "Handles unknown file extension" "Expected 'Unknown file extension' message"
fi
fi
rm -f "$UNKNOWN_FILE" "$TEST_BINARY"
else
test_skipped "Handles unknown file extension (could not compile test binary)"
fi
# Integration Tests (require API key and successful compilation)
if [ -n "${UNSANDBOX_API_KEY:-}" ]; then
echo -e "\n${BLUE}=== Integration Tests for un.m ===${NC}"
# Compile the binary for integration tests
if clang -x objective-c -framework Foundation "$UN_M" -o "$TEST_BINARY" 2>/dev/null; then
# Test: Can execute Python file
if [ -f "$TEST_DIR/fib.py" ]; then
if output=$("$TEST_BINARY" "$TEST_DIR/fib.py" 2>&1); then
if echo "$output" | grep -q "fib(10)"; then
test_passed "Executes Python file successfully"
else
test_failed "Executes Python file successfully" "Expected fibonacci output"
fi
else
test_failed "Executes Python file successfully" "Script failed: $output"
fi
else
test_skipped "Executes Python file successfully (fib.py not found)"
fi
# Test: Can execute Bash file
if [ -f "$TEST_DIR/fib.sh" ]; then
if output=$("$TEST_BINARY" "$TEST_DIR/fib.sh" 2>&1); then
if echo "$output" | grep -q "fib(10)"; then
test_passed "Executes Bash file successfully"
else
test_failed "Executes Bash file successfully" "Expected fibonacci output"
fi
else
test_failed "Executes Bash file successfully" "Script failed: $output"
fi
else
test_skipped "Executes Bash file successfully (fib.sh not found)"
fi
rm -f "$TEST_BINARY"
else
echo -e "${YELLOW}Could not compile un.m - skipping integration tests${NC}"
fi
else
echo -e "\n${YELLOW}Skipping integration tests (UNSANDBOX_API_KEY not set)${NC}"
fi
# Summary
echo -e "\n${BLUE}=== Test Summary ===${NC}"
echo "Total: $TESTS_RUN | Passed: $TESTS_PASSED | Failed: $TESTS_FAILED"
if [ $TESTS_FAILED -eq 0 ]; then
echo -e "${GREEN}All tests passed!${NC}"
exit 0
else
echo -e "${RED}Some tests failed!${NC}"
exit 1
fi