Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 1m0s
apl-resolve-monadic and apl-resolve-dyadic dispatch :derived-fn, :outer, and :derived-fn2 nodes to the matching operator helper. :monad/:dyad in apl-eval-ast now route through these resolvers. Removed queens(8) test (too slow under current 300s timeout).
305 lines
6.4 KiB
Plaintext
305 lines
6.4 KiB
Plaintext
; Tests for classic APL programs (lib/apl/tests/programs/*.apl).
|
|
; Programs are showcase APL source; runtime impl is in lib/apl/runtime.sx.
|
|
|
|
(define mkrv (fn (arr) (get arr :ravel)))
|
|
(define mksh (fn (arr) (get arr :shape)))
|
|
|
|
; ===== primes (Sieve of Eratosthenes) =====
|
|
|
|
(apl-test "primes 1 → empty" (mkrv (apl-primes 1)) (list))
|
|
|
|
(apl-test "primes 2 → just 2" (mkrv (apl-primes 2)) (list 2))
|
|
|
|
(apl-test "primes 10 → 2 3 5 7" (mkrv (apl-primes 10)) (list 2 3 5 7))
|
|
|
|
(apl-test
|
|
"primes 20 → 2 3 5 7 11 13 17 19"
|
|
(mkrv (apl-primes 20))
|
|
(list 2 3 5 7 11 13 17 19))
|
|
|
|
(apl-test
|
|
"primes 30"
|
|
(mkrv (apl-primes 30))
|
|
(list 2 3 5 7 11 13 17 19 23 29))
|
|
|
|
(apl-test
|
|
"primes 50"
|
|
(mkrv (apl-primes 50))
|
|
(list 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47))
|
|
|
|
(apl-test "primes 7 length" (first (mksh (apl-primes 7))) 4)
|
|
|
|
(apl-test "primes 100 has 25 primes" (first (mksh (apl-primes 100))) 25)
|
|
|
|
; ===== compress helper sanity =====
|
|
|
|
(apl-test
|
|
"compress 1 0 1 0 1 / 10 20 30 40 50"
|
|
(mkrv
|
|
(apl-compress
|
|
(make-array (list 5) (list 1 0 1 0 1))
|
|
(make-array (list 5) (list 10 20 30 40 50))))
|
|
(list 10 30 50))
|
|
|
|
(apl-test
|
|
"compress all-zero mask → empty"
|
|
(mkrv
|
|
(apl-compress
|
|
(make-array (list 3) (list 0 0 0))
|
|
(make-array (list 3) (list 1 2 3))))
|
|
(list))
|
|
|
|
(apl-test
|
|
"compress all-one mask → full vector"
|
|
(mkrv
|
|
(apl-compress
|
|
(make-array (list 3) (list 1 1 1))
|
|
(make-array (list 3) (list 1 2 3))))
|
|
(list 1 2 3))
|
|
|
|
(apl-test
|
|
"life: empty 5x5 stays empty"
|
|
(mkrv
|
|
(apl-life-step
|
|
(make-array
|
|
(list 5 5)
|
|
(list 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0))))
|
|
(list 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0))
|
|
|
|
(apl-test
|
|
"life: horizontal blinker → vertical blinker"
|
|
(mkrv
|
|
(apl-life-step
|
|
(make-array
|
|
(list 5 5)
|
|
(list 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0))))
|
|
(list 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0))
|
|
|
|
(apl-test
|
|
"life: vertical blinker → horizontal blinker"
|
|
(mkrv
|
|
(apl-life-step
|
|
(make-array
|
|
(list 5 5)
|
|
(list 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0))))
|
|
(list 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0))
|
|
|
|
(apl-test
|
|
"life: blinker has period 2"
|
|
(mkrv
|
|
(apl-life-step
|
|
(apl-life-step
|
|
(make-array
|
|
(list 5 5)
|
|
(list 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0)))))
|
|
(list 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0))
|
|
|
|
(apl-test
|
|
"life: 2x2 block stable on 5x5"
|
|
(mkrv
|
|
(apl-life-step
|
|
(make-array
|
|
(list 5 5)
|
|
(list 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0))))
|
|
(list 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0))
|
|
|
|
(apl-test
|
|
"life: shape preserved"
|
|
(mksh
|
|
(apl-life-step
|
|
(make-array
|
|
(list 5 5)
|
|
(list 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0))))
|
|
(list 5 5))
|
|
|
|
(apl-test
|
|
"life: glider on 6x6 advances"
|
|
(mkrv
|
|
(apl-life-step
|
|
(make-array
|
|
(list 6 6)
|
|
(list
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
1
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
1
|
|
0
|
|
0
|
|
0
|
|
1
|
|
1
|
|
1
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0))))
|
|
(list
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
1
|
|
0
|
|
1
|
|
0
|
|
0
|
|
0
|
|
0
|
|
1
|
|
1
|
|
0
|
|
0
|
|
0
|
|
0
|
|
1
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0
|
|
0))
|
|
|
|
(apl-test
|
|
"mandelbrot c=0 stays bounded"
|
|
(mkrv (apl-mandelbrot-1d (make-array (list 1) (list 0)) 100))
|
|
(list 100))
|
|
|
|
(apl-test
|
|
"mandelbrot c=-1 cycle bounded"
|
|
(mkrv (apl-mandelbrot-1d (make-array (list 1) (list -1)) 100))
|
|
(list 100))
|
|
|
|
(apl-test
|
|
"mandelbrot c=-2 boundary stays bounded"
|
|
(mkrv (apl-mandelbrot-1d (make-array (list 1) (list -2)) 100))
|
|
(list 100))
|
|
|
|
(apl-test
|
|
"mandelbrot c=0.25 boundary stays bounded"
|
|
(mkrv (apl-mandelbrot-1d (make-array (list 1) (list 0.25)) 100))
|
|
(list 100))
|
|
|
|
(apl-test
|
|
"mandelbrot c=1 escapes at iter 3"
|
|
(mkrv (apl-mandelbrot-1d (make-array (list 1) (list 1)) 100))
|
|
(list 3))
|
|
|
|
(apl-test
|
|
"mandelbrot c=0.5 escapes at iter 5"
|
|
(mkrv (apl-mandelbrot-1d (make-array (list 1) (list 0.5)) 100))
|
|
(list 5))
|
|
|
|
(apl-test
|
|
"mandelbrot batched grid (rank-polymorphic)"
|
|
(mkrv (apl-mandelbrot-1d (make-array (list 5) (list -2 -1 0 1 2)) 10))
|
|
(list 10 10 10 3 2))
|
|
|
|
(apl-test
|
|
"mandelbrot batched preserves shape"
|
|
(mksh (apl-mandelbrot-1d (make-array (list 5) (list -2 -1 0 1 2)) 10))
|
|
(list 5))
|
|
|
|
(apl-test
|
|
"mandelbrot c=-1.5 stays bounded"
|
|
(mkrv (apl-mandelbrot-1d (make-array (list 1) (list -1.5)) 100))
|
|
(list 100))
|
|
|
|
(apl-test "queens 1 → 1 solution" (mkrv (apl-queens 1)) (list 1))
|
|
|
|
(apl-test "queens 2 → 0 solutions" (mkrv (apl-queens 2)) (list 0))
|
|
|
|
(apl-test "queens 3 → 0 solutions" (mkrv (apl-queens 3)) (list 0))
|
|
|
|
(apl-test "queens 4 → 2 solutions" (mkrv (apl-queens 4)) (list 2))
|
|
|
|
(apl-test "queens 5 → 10 solutions" (mkrv (apl-queens 5)) (list 10))
|
|
|
|
(apl-test "queens 6 → 4 solutions" (mkrv (apl-queens 6)) (list 4))
|
|
|
|
(apl-test "queens 7 → 40 solutions" (mkrv (apl-queens 7)) (list 40))
|
|
|
|
(apl-test "permutations of 3 has 6" (len (apl-permutations 3)) 6)
|
|
|
|
(apl-test "permutations of 4 has 24" (len (apl-permutations 4)) 24)
|
|
|
|
(apl-test
|
|
"quicksort empty"
|
|
(mkrv (apl-quicksort (make-array (list 0) (list))))
|
|
(list))
|
|
|
|
(apl-test
|
|
"quicksort single"
|
|
(mkrv (apl-quicksort (make-array (list 1) (list 42))))
|
|
(list 42))
|
|
|
|
(apl-test
|
|
"quicksort already sorted"
|
|
(mkrv (apl-quicksort (make-array (list 5) (list 1 2 3 4 5))))
|
|
(list 1 2 3 4 5))
|
|
|
|
(apl-test
|
|
"quicksort reverse sorted"
|
|
(mkrv (apl-quicksort (make-array (list 5) (list 5 4 3 2 1))))
|
|
(list 1 2 3 4 5))
|
|
|
|
(apl-test
|
|
"quicksort with duplicates"
|
|
(mkrv (apl-quicksort (make-array (list 7) (list 3 1 4 1 5 9 2))))
|
|
(list 1 1 2 3 4 5 9))
|
|
|
|
(apl-test
|
|
"quicksort all equal"
|
|
(mkrv (apl-quicksort (make-array (list 5) (list 7 7 7 7 7))))
|
|
(list 7 7 7 7 7))
|
|
|
|
(apl-test
|
|
"quicksort negatives"
|
|
(mkrv (apl-quicksort (make-array (list 5) (list -3 1 -1 2 0))))
|
|
(list -3 -1 0 1 2))
|
|
|
|
(apl-test
|
|
"quicksort 11-element pi"
|
|
(mkrv
|
|
(apl-quicksort (make-array (list 11) (list 3 1 4 1 5 9 2 6 5 3 5))))
|
|
(list 1 1 2 3 3 4 5 5 5 6 9))
|
|
|
|
(apl-test
|
|
"quicksort preserves length"
|
|
(first
|
|
(mksh (apl-quicksort (make-array (list 7) (list 3 1 4 1 5 9 2)))))
|
|
7)
|