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.
118 lines
3 KiB
V
118 lines
3 KiB
V
// Unit tests for un.v - tests internal functions without API calls
|
|
// Run with: v run test_v.v
|
|
|
|
import os
|
|
|
|
fn main() {
|
|
mut passed := 0
|
|
mut failed := 0
|
|
|
|
ext_map := {
|
|
'.py': 'python'
|
|
'.js': 'javascript'
|
|
'.ts': 'typescript'
|
|
'.rb': 'ruby'
|
|
'.go': 'go'
|
|
'.rs': 'rust'
|
|
'.c': 'c'
|
|
'.v': 'v'
|
|
'.java': 'java'
|
|
'.kt': 'kotlin'
|
|
}
|
|
|
|
get_language := fn [ext_map] (ext string) string {
|
|
return ext_map[ext] or { '' }
|
|
}
|
|
|
|
get_extension := fn (filename string) string {
|
|
idx := filename.last_index('.') or { return '' }
|
|
return filename[idx..]
|
|
}
|
|
|
|
get_basename := fn (path string) string {
|
|
idx := path.last_index('/') or { return path }
|
|
return path[idx + 1..]
|
|
}
|
|
|
|
test := fn [mut passed, mut failed] (name string, result bool) {
|
|
if result {
|
|
println(' ✓ ${name}')
|
|
passed++
|
|
} else {
|
|
println(' ✗ ${name}')
|
|
failed++
|
|
}
|
|
}
|
|
|
|
println('\n=== Extension Mapping Tests ===')
|
|
|
|
test('Python extension maps correctly', get_language('.py') == 'python')
|
|
|
|
test('V extension maps correctly', get_language('.v') == 'v')
|
|
|
|
test('JavaScript extension maps correctly', get_language('.js') == 'javascript')
|
|
|
|
test('Go extension maps correctly', get_language('.go') == 'go')
|
|
|
|
println('\n=== Signature Format Tests ===')
|
|
|
|
timestamp := '1704067200'
|
|
method := 'POST'
|
|
endpoint := '/execute'
|
|
body := '{"language":"python"}'
|
|
message := '${timestamp}:${method}:${endpoint}:${body}'
|
|
|
|
test('Signature format starts with timestamp', message.starts_with(timestamp))
|
|
|
|
test('Signature format contains :POST:', message.contains(':POST:'))
|
|
|
|
test('Signature format contains :/execute:', message.contains(':/execute:'))
|
|
|
|
println('\n=== Language Detection Tests ===')
|
|
|
|
content := '#!/usr/bin/env python3\nprint(\'hello\')'
|
|
first_line := content.split('\n')[0]
|
|
|
|
test('Python shebang detection - starts with #!', first_line.starts_with('#!'))
|
|
|
|
test('Python shebang detection - contains python', first_line.contains('python'))
|
|
|
|
println('\n=== Argument Parsing Tests ===')
|
|
|
|
arg1 := 'DEBUG=1'
|
|
eq1 := arg1.index('=') or { 0 }
|
|
key1 := arg1[..eq1]
|
|
value1 := arg1[eq1 + 1..]
|
|
|
|
test('Parse -e KEY=VALUE format - key', key1 == 'DEBUG')
|
|
|
|
test('Parse -e KEY=VALUE format - value', value1 == '1')
|
|
|
|
arg2 := 'URL=https://example.com?foo=bar'
|
|
eq2 := arg2.index('=') or { 0 }
|
|
key2 := arg2[..eq2]
|
|
value2 := arg2[eq2 + 1..]
|
|
|
|
test('Parse -e KEY=VALUE with equals in value', key2 == 'URL' && value2 == 'https://example.com?foo=bar')
|
|
|
|
println('\n=== File Operations Tests ===')
|
|
|
|
test('Extract file basename', get_basename('/home/user/project/script.v') == 'script.v')
|
|
|
|
test('Extract file extension', get_extension('/home/user/project/script.v') == '.v')
|
|
|
|
println('\n=== API Constants Tests ===')
|
|
|
|
api_base := 'https://api.unsandbox.com'
|
|
|
|
test('API base URL starts with https://', api_base.starts_with('https://'))
|
|
|
|
test('API base URL contains unsandbox.com', api_base.contains('unsandbox.com'))
|
|
|
|
println('\n=== Summary ===')
|
|
println('Passed: ${passed}')
|
|
println('Failed: ${failed}')
|
|
println('Total: ${passed + failed}')
|
|
|
|
exit(if failed > 0 { 1 } else { 0 })
|
|
}
|