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.
167 lines
6.1 KiB
Fortran
167 lines
6.1 KiB
Fortran
program test_un_f90
|
||
! Comprehensive tests for un.f90 (Fortran UN CLI Inception implementation)
|
||
! Compile and run with: gfortran -o test_un_f90 test_un_f90.f90 && ./test_un_f90
|
||
|
||
implicit none
|
||
integer :: passed, failed, total
|
||
character(len=32) :: GREEN, RED, BLUE, RESET
|
||
|
||
! ANSI color codes
|
||
GREEN = char(27) // '[32m'
|
||
RED = char(27) // '[31m'
|
||
BLUE = char(27) // '[34m'
|
||
RESET = char(27) // '[0m'
|
||
|
||
passed = 0
|
||
failed = 0
|
||
|
||
write(*, '(A)') ''
|
||
write(*, '(A)') trim(BLUE) // '========================================' // trim(RESET)
|
||
write(*, '(A)') trim(BLUE) // 'UN CLI Inception Tests - Fortran' // trim(RESET)
|
||
write(*, '(A)') trim(BLUE) // '========================================' // trim(RESET)
|
||
write(*, '(A)') ''
|
||
|
||
! Test Suite 1: Extension Detection
|
||
write(*, '(A)') trim(BLUE) // 'Test Suite 1: Extension Detection' // trim(RESET)
|
||
call test_extension('.jl', 'julia', passed, failed)
|
||
call test_extension('.r', 'r', passed, failed)
|
||
call test_extension('.cr', 'crystal', passed, failed)
|
||
call test_extension('.f90', 'fortran', passed, failed)
|
||
call test_extension('.cob', 'cobol', passed, failed)
|
||
call test_extension('.pro', 'prolog', passed, failed)
|
||
call test_extension('.forth', 'forth', passed, failed)
|
||
call test_extension('.4th', 'forth', passed, failed)
|
||
call test_extension('.py', 'python', passed, failed)
|
||
call test_extension('.rs', 'rust', passed, failed)
|
||
call test_extension('.xyz', 'unknown', passed, failed)
|
||
|
||
! Test Suite 2: API Integration
|
||
write(*, '(A)') ''
|
||
write(*, '(A)') trim(BLUE) // 'Test Suite 2: API Integration' // trim(RESET)
|
||
write(*, '(A)') trim(BLUE) // 'ℹ SKIP' // trim(RESET) // &
|
||
': API integration test (requires runtime environment)'
|
||
|
||
! Test Suite 3: End-to-End
|
||
write(*, '(A)') ''
|
||
write(*, '(A)') trim(BLUE) // 'Test Suite 3: End-to-End Functional Test' // trim(RESET)
|
||
write(*, '(A)') trim(BLUE) // 'ℹ SKIP' // trim(RESET) // &
|
||
': E2E test (requires runtime environment and API key)'
|
||
|
||
! Test Suite 4: Error Handling
|
||
write(*, '(A)') ''
|
||
write(*, '(A)') trim(BLUE) // 'Test Suite 4: Error Handling' // trim(RESET)
|
||
call test_extension('.unknown', 'unknown', passed, failed)
|
||
call test_extension('.PY', 'python', passed, failed) ! Case insensitive
|
||
|
||
! Print summary
|
||
total = passed + failed
|
||
write(*, '(A)') ''
|
||
write(*, '(A)') trim(BLUE) // '========================================' // trim(RESET)
|
||
write(*, '(A)') trim(BLUE) // 'Test Summary' // trim(RESET)
|
||
write(*, '(A)') trim(BLUE) // '========================================' // trim(RESET)
|
||
write(*, '(A,I0,A)') trim(GREEN) // 'Passed: ', passed, trim(RESET)
|
||
write(*, '(A,I0,A)') trim(RED) // 'Failed: ', failed, trim(RESET)
|
||
write(*, '(A,I0,A)') trim(BLUE) // 'Total: ', total, trim(RESET)
|
||
|
||
if (failed > 0) then
|
||
write(*, '(A)') ''
|
||
write(*, '(A)') trim(RED) // 'TESTS FAILED' // trim(RESET)
|
||
stop 1
|
||
else
|
||
write(*, '(A)') ''
|
||
write(*, '(A)') trim(GREEN) // 'ALL TESTS PASSED' // trim(RESET)
|
||
stop 0
|
||
end if
|
||
|
||
contains
|
||
|
||
subroutine test_extension(ext, expected_lang, passed, failed)
|
||
character(len=*), intent(in) :: ext, expected_lang
|
||
integer, intent(inout) :: passed, failed
|
||
character(len=32) :: lang
|
||
character(len=100) :: filename, test_name
|
||
character(len=32) :: GREEN, RED, RESET
|
||
logical :: result
|
||
|
||
GREEN = char(27) // '[32m'
|
||
RED = char(27) // '[31m'
|
||
RESET = char(27) // '[0m'
|
||
|
||
! Create test filename
|
||
filename = 'test' // trim(ext)
|
||
|
||
! Detect language
|
||
call detect_lang(filename, lang)
|
||
|
||
! Check result
|
||
result = trim(lang) == trim(expected_lang)
|
||
|
||
! Print result
|
||
write(test_name, '(A,A,A,A)') 'Detect ', trim(ext), ' as ', trim(expected_lang)
|
||
if (result) then
|
||
write(*, '(A,A,A,A)') trim(GREEN), '✓ PASS', trim(RESET), ': ' // trim(test_name)
|
||
passed = passed + 1
|
||
else
|
||
write(*, '(A,A,A,A)') trim(RED), '✗ FAIL', trim(RESET), ': ' // trim(test_name)
|
||
write(*, '(A,A,A,A)') ' Expected: ', trim(expected_lang), ', Got: ', trim(lang)
|
||
failed = failed + 1
|
||
end if
|
||
end subroutine test_extension
|
||
|
||
subroutine detect_lang(filename, language)
|
||
character(len=*), intent(in) :: filename
|
||
character(len=*), intent(out) :: language
|
||
character(len=32) :: ext
|
||
integer :: dot_pos, i, len_fn
|
||
|
||
! Find last dot
|
||
len_fn = len_trim(filename)
|
||
dot_pos = 0
|
||
do i = len_fn, 1, -1
|
||
if (filename(i:i) == '.') then
|
||
dot_pos = i
|
||
exit
|
||
end if
|
||
end do
|
||
|
||
if (dot_pos == 0) then
|
||
language = 'unknown'
|
||
return
|
||
end if
|
||
|
||
ext = filename(dot_pos:len_fn)
|
||
call to_lower(ext)
|
||
|
||
! Map extension to language
|
||
language = 'unknown'
|
||
if (trim(ext) == '.jl') language = 'julia'
|
||
if (trim(ext) == '.r') language = 'r'
|
||
if (trim(ext) == '.cr') language = 'crystal'
|
||
if (trim(ext) == '.f90') language = 'fortran'
|
||
if (trim(ext) == '.cob') language = 'cobol'
|
||
if (trim(ext) == '.pro') language = 'prolog'
|
||
if (trim(ext) == '.forth' .or. trim(ext) == '.4th') language = 'forth'
|
||
if (trim(ext) == '.py') language = 'python'
|
||
if (trim(ext) == '.js') language = 'javascript'
|
||
if (trim(ext) == '.rb') language = 'ruby'
|
||
if (trim(ext) == '.go') language = 'go'
|
||
if (trim(ext) == '.rs') language = 'rust'
|
||
if (trim(ext) == '.c') language = 'c'
|
||
if (trim(ext) == '.cpp') language = 'cpp'
|
||
if (trim(ext) == '.java') language = 'java'
|
||
if (trim(ext) == '.sh') language = 'bash'
|
||
end subroutine detect_lang
|
||
|
||
subroutine to_lower(str)
|
||
character(len=*), intent(inout) :: str
|
||
integer :: i, ic
|
||
|
||
do i = 1, len_trim(str)
|
||
ic = ichar(str(i:i))
|
||
if (ic >= 65 .and. ic <= 90) then
|
||
str(i:i) = char(ic + 32)
|
||
end if
|
||
end do
|
||
end subroutine to_lower
|
||
|
||
end program test_un_f90
|