276 lines
12 KiB
Plaintext
276 lines
12 KiB
Plaintext
#!/usr/bin/env clyx
|
|
# Clyx core implementation test suite
|
|
# Created by Luxferre in 2026, released into the public domain
|
|
_start [
|
|
# 1. Stack Manipulation
|
|
"Testing stack operations..." puts cr
|
|
|
|
5 dup = if [ " dup PASS" puts cr ] [ " dup FAIL" puts cr ] # Test dup
|
|
5 6 drop 5 = if [ " drop PASS" puts cr ] [ " drop FAIL" puts cr ] # Test drop
|
|
5 6 swap - 1 = if [ " swap PASS" puts cr ] [ " swap FAIL" puts cr ] # Test swap
|
|
5 6 7 rot [] cons cons cons [ 6 7 5 ] streq if [ " rot PASS" puts cr ] [ " rot FAIL" puts cr ] # Test rot
|
|
5 6 over [] cons cons cons [ 5 6 5 ] streq if [ " over PASS" puts cr ] [ " over FAIL" puts cr ] # Test over
|
|
5 6 nip 6 = if [ " nip PASS" puts cr ] [ " nip FAIL" puts cr ] # Test nip
|
|
5 6 tuck [] cons cons cons [ 6 5 6 ] streq if [ " tuck PASS" puts cr ] [ " tuck FAIL" puts cr ] # Test tuck
|
|
|
|
# 2. Control Flow
|
|
"Testing control flow..." puts cr
|
|
|
|
[ 42 ] i 42 = if [ " i PASS" puts cr ] [ " i FAIL" puts cr ] # Test i
|
|
1 if [ " if true PASS" ] [ " if true FAIL" ] puts cr # Test if true
|
|
0 if [ " if false FAIL" ] [ " if false PASS" ] puts cr # Test if false
|
|
10 20 [ 5 - ] dip [] cons cons [ 5 20 ] streq if [ " dip PASS" puts cr ] [ " dip FAIL" puts cr ] # Test dip
|
|
5 dup while [ 1 - dup ] 0 = if [ " while loop PASS" puts cr ] [ " while loop FAIL" puts cr ] # Test while
|
|
:: test_while_word [ 5 dup while [ 1 - dup ] ] test_while_word 0 = if [ " while in word PASS" puts cr ] [ " while in word FAIL" puts cr ] # Test while in word
|
|
0 [ + ] [ 1 2 3 ] qfor 6 = 0 [ + ] [] qfor 0 = and if [ " qfor PASS" puts cr ] [ " qfor FAIL" puts cr ] # Test qfor
|
|
0 for [ 1 4 range ] [ + ] 6 = 0 for [ [] ] [ + ] 0 = and if [ " for PASS" puts cr ] [ " for FAIL" puts cr ] # Test for
|
|
|
|
|
|
# 3. Mathematics & Arithmetic
|
|
"Testing math and logic..." puts cr
|
|
|
|
10 4 - 6 = if [ " subtraction PASS" puts cr ] [ " subtraction FAIL" puts cr ] # Test subtraction
|
|
0 0= if [ " 0= with zero PASS" puts cr ] [ " 0= with zero FAIL" puts cr ] # Test 0=
|
|
5 0= if [ " 0= with non-zero FAIL" puts cr ] [ " 0= with non-zero PASS" puts cr ] # Test 0=
|
|
-5 0< if [ " 0< with negative PASS" puts cr ] [ " 0< with negative FAIL" puts cr ] # Test 0<
|
|
0 0< if [ " 0< with zero FAIL" puts cr ] [ " 0< with zero PASS" puts cr ] # Test 0<
|
|
5 0< if [ " 0< with positive FAIL" puts cr ] [ " 0< with positive PASS" puts cr ] # Test 0<
|
|
5 3 nand -2 = if [ " nand PASS" puts cr ] [ " nand FAIL" puts cr ] # Test nand
|
|
5 3 * 15 = if [ " multiplication PASS" puts cr ] [ " multiplication FAIL" puts cr ] # Test multiplication
|
|
10 4 / 2.5 = if [ " division PASS" puts cr ] [ " division FAIL" puts cr ] # Test division
|
|
10 4 divmod [] cons cons [ 2 2 ] streq if [ " divmod PASS" puts cr ] [ " divmod FAIL" puts cr ] # Test divmod
|
|
10 4 div 2 = if [ " integer division PASS" puts cr ] [ " integer division FAIL" puts cr ] # Test div
|
|
10 4 mod 2 = if [ " modulo PASS" puts cr ] [ " modulo FAIL" puts cr ] # Test mod
|
|
5 2 shl 20 = if [ " shl left PASS" puts cr ] [ " shl left FAIL" puts cr ] # Test shl left
|
|
20 -2 shl 5 = if [ " shl right PASS" puts cr ] [ " shl right FAIL" puts cr ] # Test shl right
|
|
0 tan 0= if [ " tan PASS" puts cr ] [ " tan FAIL" puts cr ] # Test tan
|
|
0.5 cotan 0.5 cos 0.5 sin / = if [ " cotan PASS" puts cr ] [ " cotan FAIL" puts cr ] # Test cotan
|
|
5 neg -5 = if [ " neg PASS" puts cr ] [ " neg FAIL" puts cr ] # Test neg
|
|
5 1/ 0.2 = if [ " 1/ PASS" puts cr ] [ " 1/ FAIL" puts cr ] # Test 1/
|
|
20 2 shr 5 = if [ " shr PASS" puts cr ] [ " shr FAIL" puts cr ] # Test shr
|
|
2 3 ^ 8 = if [ " power PASS" puts cr ] [ " power FAIL" puts cr ] # Test power
|
|
0 sin 0= if [ " sin PASS" puts cr ] [ " sin FAIL" puts cr ] # Test sin
|
|
0 cos 1.0 = if [ " cos PASS" puts cr ] [ " cos FAIL" puts cr ] # Test cos
|
|
0 atan 0= if [ " atan PASS" puts cr ] [ " atan FAIL" puts cr ] # Test atan
|
|
0 exp 1.0 = if [ " exp PASS" puts cr ] [ " exp FAIL" puts cr ] # Test exp
|
|
1 log 0= if [ " log PASS" puts cr ] [ " log FAIL" puts cr ] # Test log
|
|
9 sqrt 3.0 = if [ " sqrt PASS" puts cr ] [ " sqrt FAIL" puts cr ] # Test sqrt
|
|
"Testing random..." puts cr
|
|
10 rand 10 div 0 = if [ 1 rand 0 = if [ " rand PASS" puts cr ] [ " rand FAIL" puts cr ] ] [ " rand FAIL" puts cr ] # Test rand
|
|
|
|
# 4. Logical Operators
|
|
"Testing logical operators..." puts cr
|
|
|
|
0 not 1 =
|
|
1 not 0 = and
|
|
1 1 and 1 = and
|
|
1 0 and 0 = and
|
|
1 0 or 1 = and
|
|
0 0 or 0 = and
|
|
if [
|
|
" logic PASS" puts cr
|
|
] [
|
|
" logic FAIL" puts cr
|
|
]
|
|
|
|
# 5. Input / Output & Networking
|
|
"Testing I/O..." puts cr
|
|
|
|
" Testing dot: " puts 123 . # Test dot
|
|
" Testing emit: " puts 65 emit cr # Test emit
|
|
" Testing space: " puts 65 emit space 66 emit cr # Test space
|
|
" Testing say: " puts say "hello from say"
|
|
" Testing readln: " puts
|
|
readln puts cr # Test readln
|
|
" Testing .s: " puts .s cr # Test .s
|
|
"ok" "test_temp.txt" writef 2 = if [ "test_temp.txt" readf "ok" streq if [ "test_temp.txt" delf " file I/O PASS" puts cr ] [ "test_temp.txt" delf " file I/O FAIL" puts cr ] ] [ " file I/O FAIL" puts cr ] # Test file I/O
|
|
"test_dir_clyx" maked "test_dir_clyx" listd qlen 0 = if [ "test_dir_clyx" deld " dir PASS" puts cr ] [ "test_dir_clyx" deld " dir FAIL" puts cr ] # Test dir
|
|
1000 rand 9000 + dup nlstn swap "127.0.0.1" swap nopen over read swap dup 10 chr "hello" + write drop swap dup read [ close ] dip [ close ] dip swap close "hello" streq if [ " sockets PASS" puts cr ] [ " sockets FAIL" puts cr ] # Test sockets
|
|
|
|
# 6. Type Checking & Comparison
|
|
"Testing type and predicates..." puts cr
|
|
|
|
42 type 0 = [ "hello" type 1 = ] dip and [ [ 1 2 ] type 2 = ] dip and if [
|
|
drop drop drop " type PASS" puts cr
|
|
] [
|
|
drop drop drop " type FAIL" puts cr
|
|
]
|
|
42 isnum [ "hello" isnum not ] dip and [ [ 1 2 ] isnum not ] dip and if [
|
|
drop drop drop " isnum PASS" puts cr
|
|
] [
|
|
drop drop drop " isnum FAIL" puts cr
|
|
]
|
|
"hello" isstr [ 42 isstr not ] dip and [ [ 1 2 ] isstr not ] dip and if [
|
|
drop drop drop " isstr PASS" puts cr
|
|
] [
|
|
drop drop drop " isstr FAIL" puts cr
|
|
]
|
|
[ 1 2 ] isq [ 42 isq not ] dip and [ "hello" isq not ] dip and if [
|
|
drop drop drop " isq PASS" puts cr
|
|
] [
|
|
drop drop drop " isq FAIL" puts cr
|
|
]
|
|
"Testing binary predicates..." puts cr
|
|
5 3 >
|
|
3 5 > not and
|
|
3 5 < and
|
|
5 3 < not and
|
|
5 5 >= and
|
|
5 3 >= and
|
|
3 5 >= not and
|
|
5 5 <= and
|
|
3 5 <= and
|
|
5 3 <= not and
|
|
5 5 = and
|
|
5 3 = not and
|
|
5 3 != and
|
|
5 5 != not and
|
|
if [
|
|
" binary predicates PASS" puts cr
|
|
] [
|
|
" binary predicates FAIL" puts cr
|
|
]
|
|
"Testing streq and vlen..." puts cr
|
|
"abc" "abc" streq
|
|
"abc" "abd" streq not and
|
|
"abc" "ab" streq not and
|
|
"abc" vlen 3 = and
|
|
[ 1 2 3 4 ] vlen 4 = and
|
|
if [
|
|
" streq and vlen PASS" puts cr
|
|
] [
|
|
" streq and vlen FAIL" puts cr
|
|
]
|
|
|
|
# 7. String Operations
|
|
"Testing string operations..." puts cr
|
|
|
|
"abc" slen 3 = if [ "" slen 0 = if [ 5 slen 0 = if [ " slen PASS" puts cr ] [ " slen FAIL" puts cr ] ] [ " slen FAIL" puts cr ] ] [ " slen FAIL" puts cr ] # Test slen
|
|
65 chr uncons 1 = if [ 65 = if [ uncons 0= if [ drop " chr PASS" puts cr ] [ drop " chr FAIL" puts cr ] ] [ " chr FAIL" puts cr ] ] [ " chr FAIL" puts cr ] # Test chr
|
|
"A" asc 65 = if [ " asc PASS" puts cr ] [ " asc FAIL" puts cr ] # Test asc
|
|
"a\"b" slen 3 = if [ "a\"b" uncons drop drop uncons drop swap drop 34 = if [ " backslash quote escape PASS" puts cr ] [ " backslash quote escape FAIL" puts cr ] ] [ " backslash quote escape FAIL" puts cr ] # Test escape
|
|
"a\nb" uncons drop drop uncons drop swap drop 10 =
|
|
"a\tb" uncons drop drop uncons drop swap drop 9 = and
|
|
"a\rb" uncons drop drop uncons drop swap drop 13 = and
|
|
"a\sb" uncons drop drop uncons drop swap drop 32 = and
|
|
"a\bb" uncons drop drop uncons drop swap drop 8 = and
|
|
"a\fb" uncons drop drop uncons drop swap drop 12 = and
|
|
[ " hello " ] i " hello " streq and
|
|
[ "\shello\s" ] i "\shello\s" streq and
|
|
if [
|
|
" whitespace escape PASS" puts cr
|
|
] [
|
|
" whitespace escape FAIL" puts cr
|
|
]
|
|
"AbC" lower "abc" streq
|
|
"aBc" upper "ABC" streq and
|
|
"abc" "def" s+ "abcdef" streq and
|
|
"abc" s2q [ 97 98 99 ] streq and
|
|
"abc" s2q q2s "abc" streq and
|
|
[ 1 2 3 ] s2q [ 1 2 3 ] streq and
|
|
"" s2q [ ] streq and
|
|
[ 97 98 99 ] q2s "abc" streq and
|
|
[ ] q2s "" streq and
|
|
if [
|
|
" q2s, streq, lower, and upper PASS" puts cr
|
|
] [
|
|
" q2s, streq, lower, and upper FAIL" puts cr
|
|
]
|
|
"ñ" s2q [ 195 177 ] streq
|
|
[ 195 177 ] q2s "ñ" streq and
|
|
"ñ" slen 1 = and
|
|
if [
|
|
" Unicode and s2q/q2s PASS" puts cr
|
|
] [
|
|
" Unicode and s2q/q2s FAIL" puts cr
|
|
]
|
|
|
|
# 8. Q-form Operations
|
|
"Testing Q-form operations..." puts cr
|
|
|
|
5 [ 6 ] cons uncons 1 = [ 5 = ] dip and [ [ 6 ] streq ] dip and if [ " cons/uncons PASS" puts cr ] [ " cons/uncons FAIL" puts cr ] # Test cons/uncons
|
|
5 [ 6 ] qpush [ 6 5 ] streq if [ " qpush PASS" puts cr ] [ " qpush FAIL" puts cr ] # Test qpush
|
|
[ 6 5 ] qpop 5 = [ [ 6 ] streq ] dip and if [ " qpop PASS" puts cr ] [ " qpop FAIL" puts cr ] # Test qpop
|
|
[ 1 2 3 ] qlen 3 = if [ [ ] qlen 0 = if [ 5 qlen 0 = if [ " qlen PASS" puts cr ] [ " qlen FAIL" puts cr ] ] [ " qlen FAIL" puts cr ] ] [ " qlen FAIL" puts cr ] # Test qlen
|
|
[ 10 20 30 ] 1 qget 20 = if [ [ 10 20 30 ] 0 qget 10 = if [ " qget PASS" puts cr ] [ " qget FAIL" puts cr ] ] [ " qget FAIL" puts cr ] # Test qget
|
|
99 [ 10 20 30 ] 1 qset [ 10 99 30 ] streq if [ " qset PASS" puts cr ] [ " qset FAIL" puts cr ] # Test qset
|
|
[ 1 2 3 ] rev [ 3 2 1 ] streq
|
|
[ 1 2 ] [ 3 4 ] lcat [ 1 2 3 4 ] streq and
|
|
[ 1 2 ] s2q [ 1 2 ] streq and
|
|
if [
|
|
" rev, lcat and s2q PASS" puts cr
|
|
] [
|
|
" rev, lcat and s2q FAIL" puts cr
|
|
]
|
|
2 5 range [ 2 3 4 ] streq 5 2 range [] streq and 5 5 range [] streq and if [ " range PASS" puts cr ] [ " range FAIL" puts cr ] # Test range
|
|
3 allot [ 0 0 0 ] streq 0 allot [] streq and if [ " allot PASS" puts cr ] [ " allot FAIL" puts cr ] # Test allot
|
|
[ 1 2 3 ] [ 2 * ] map [ 2 4 6 ] streq
|
|
[ 1 2 3 ] [ neg ] map [ -1 -2 -3 ] streq and
|
|
if [ " map PASS" puts cr ] [ " map FAIL" puts cr ] # Test map
|
|
[ 1 2 3 4 5 ] [ 3 > ] filter [ 4 5 ] streq
|
|
[ 1 2 3 4 5 ] [ isnum ] filter [ 1 2 3 4 5 ] streq and
|
|
if [ " filter PASS" puts cr ] [ " filter FAIL" puts cr ] # Test filter
|
|
|
|
|
|
# 9. Bitwise Operations
|
|
"Testing bitwise operations..." puts cr
|
|
|
|
0 bitnot -1 =
|
|
-1 bitnot 0 = and
|
|
3 5 bitand 1 = and
|
|
3 5 bitor 7 = and
|
|
3 5 bitxor 6 = and
|
|
if [
|
|
" bitwise PASS" puts cr
|
|
] [
|
|
" bitwise FAIL" puts cr
|
|
]
|
|
|
|
# 10. Word Definition
|
|
"Testing definition words..." puts cr
|
|
|
|
"my_const" [ 99 ] defw my_const 99 = if [ " defw (no-inline) PASS" puts cr ] [ " defw (no-inline) FAIL" puts cr ] # Test defw
|
|
:: my_inline [ 100 ]
|
|
my_inline 100 = if [ " :: (inline) PASS" puts cr ] [ " :: (inline) FAIL" puts cr ] # Test inline ::
|
|
5 then 5 = if [ " then PASS" puts cr ] [ " then FAIL" puts cr ] # Test then
|
|
":: source_test_word [ 99 ]" "test_source.clx" writef drop source test_source.clx source_test_word 99 = if [ "test_source.clx" delf " source PASS" puts cr ] [ "test_source.clx" delf " source FAIL" puts cr ] # Test source
|
|
my_is_word is [ 200 ]
|
|
my_is_word 200 =
|
|
my_str_word is "abc"
|
|
my_str_word "abc" streq and
|
|
:: "my_inline_string_word" [ 400 ]
|
|
my_inline_string_word 400 = and
|
|
if [ " is PASS" puts cr ] [ " is FAIL" puts cr ] # Test is
|
|
set my_set_word [ 500 ]
|
|
my_set_word 500 =
|
|
set my_set_num 600
|
|
my_set_num 600 = and
|
|
set my_set_str "hello_set"
|
|
my_set_str "hello_set" streq and
|
|
if [ " set PASS" puts cr ] [ " set FAIL" puts cr ] # Test set
|
|
:: wrap_is [ is ]
|
|
wrap_is test_wrapped_const [ 888 ]
|
|
test_wrapped_const 888 = if [ " nested next PASS" puts cr ] [ " nested next FAIL" puts cr ]
|
|
" _start PASS" puts cr # Test _start (executed via entry point)
|
|
|
|
# 11. Host Language Evaluation: hseval
|
|
# "Testing host language evaluation..." puts cr
|
|
# "[1, 2] * 2" hseval [ 1 2 1 2 ] streq
|
|
# "1 + 2" hseval 3 = and
|
|
# if [
|
|
# " hseval PASS" puts cr
|
|
# ] [
|
|
# " hseval FAIL" puts cr
|
|
# ]
|
|
|
|
# 12. Host Arguments & Host Exit
|
|
"Testing host arguments and exit..." puts cr
|
|
hsargs isq [ hsargs qlen 0 > ] and if [
|
|
" hsargs PASS" puts cr
|
|
] [
|
|
" hsargs FAIL" puts cr
|
|
]
|
|
|
|
0 hsexit
|
|
]
|