Rearrange Redex tests

This commit is contained in:
Max New 2013-09-07 20:28:54 -07:00
parent 6525e8f7c1
commit 3899da968d
3 changed files with 360 additions and 341 deletions

View File

@ -178,8 +178,6 @@
(cons (car l)
(take-while (cdr l) pred))]))
(define bools
(from-list/e (list #t #f)))
(define nats
(enum +inf.f
identity
@ -187,7 +185,7 @@
(unless (>= n 0)
(error 'out-of-range))
n)))
(define ints
(define ints/e
(enum +inf.f
(λ (n)
(if (even? n)
@ -235,26 +233,6 @@
[(a b c . rest)
(sum/e a (apply sum/e b c rest))]))
(define odds
(enum +inf.f
(λ (n)
(+ (* 2 n) 1))
(λ (n)
(if (and (not (zero? (modulo n 2)))
(>= n 0))
(/ (- n 1) 2)
(error 'odd)))))
(define evens
(enum +inf.f
(λ (n)
(* 2 n))
(λ (n)
(if (and (zero? (modulo n 2))
(>= n 0))
(/ n 2)
(error 'even)))))
(define n*n
(enum +inf.f
(λ (n)
@ -601,7 +579,7 @@
(cond [(> low high) (error 'bad-range)]
[(infinite? high)
(if (infinite? low)
ints
ints/e
(map/e
(λ (n)
(+ n low))
@ -663,9 +641,11 @@
(module+
test
(require rackunit)
(provide check-bijection?)
(provide check-bijection?
ints/e
find-size)
(define confidence 1000)
(define nums (build-list confidence identity))
(define-simple-check (check-bijection? e)
(let ([nums (build-list (if (<= (enum-size e) confidence)
(enum-size e)
@ -675,318 +655,4 @@
nums
(map (λ (n)
(encode e (decode e n)))
nums))))
;; const/e tests
(let ([e (const/e 17)])
(test-begin
(check-eq? (decode e 0) 17)
(check-exn exn:fail?
(λ ()
(decode e 1)))
(check-eq? (encode e 17) 0)
(check-exn exn:fail?
(λ ()
(encode e 0)))
(check-bijection? e)))
;; from-list/e tests
(let ([e (from-list/e '(5 4 1 8))])
(test-begin
(check-eq? (decode e 0) 5)
(check-eq? (decode e 3) 8)
(check-exn exn:fail?
(λ () (decode e 4)))
(check-eq? (encode e 5) 0)
(check-eq? (encode e 8) 3)
(check-exn exn:fail?
(λ ()
(encode e 17)))
(check-bijection? e)))
;; map test
(define nats+1 (nats+/e 1))
(test-begin
(check-equal? (size nats+1) +inf.f)
(check-equal? (decode nats+1 0) 1)
(check-equal? (decode nats+1 1) 2)
(check-bijection? nats+1))
;; encode check
(test-begin
(check-exn exn:fail?
(λ ()
(decode nats -1))))
;; ints checks
(test-begin
(check-eq? (decode ints 0) 0) ; 0 -> 0
(check-eq? (decode ints 1) 1) ; 1 -> 1
(check-eq? (decode ints 2) -1) ; 2 -> 1
(check-eq? (encode ints 0) 0)
(check-eq? (encode ints 1) 1)
(check-eq? (encode ints -1) 2)
(check-bijection? ints)) ; -1 -> 2, -3 -> 4
;; sum tests
(test-begin
(let ([bool-or-num (sum/e bools
(from-list/e '(0 1 2)))]
[bool-or-nat (sum/e bools
nats)]
[nat-or-bool (sum/e nats
bools)]
[odd-or-even (sum/e evens
odds)])
(check-equal? (enum-size bool-or-num)
5)
(check-equal? (decode bool-or-num 0) #t)
(check-equal? (decode bool-or-num 1) #f)
(check-equal? (decode bool-or-num 2) 0)
(check-exn exn:fail?
(λ ()
(decode bool-or-num 5)))
(check-equal? (encode bool-or-num #f) 1)
(check-equal? (encode bool-or-num 2) 4)
(check-bijection? bool-or-num)
(check-equal? (enum-size bool-or-nat)
+inf.f)
(check-equal? (decode bool-or-nat 0) #t)
(check-equal? (decode bool-or-nat 2) 0)
(check-bijection? bool-or-nat)
(check-equal? (encode bool-or-num #f) 1)
(check-equal? (encode bool-or-num 2) 4)
(check-equal? (enum-size odd-or-even)
+inf.f)
(check-equal? (decode odd-or-even 0) 0)
(check-equal? (decode odd-or-even 1) 1)
(check-equal? (decode odd-or-even 2) 2)
(check-exn exn:fail?
(λ ()
(decode odd-or-even -1)))
(check-equal? (encode odd-or-even 0) 0)
(check-equal? (encode odd-or-even 1) 1)
(check-equal? (encode odd-or-even 2) 2)
(check-equal? (encode odd-or-even 3) 3)
(check-bijection? odd-or-even)))
;; prod/e tests
(define bool*bool (prod/e bools bools))
(define 1*b (prod/e (const/e 1) bools))
(define bool*nats (prod/e bools nats))
(define nats*bool (prod/e nats bools))
(define nats*nats (prod/e nats nats))
(define ns-equal? (λ (ns ms)
(and (= (car ns)
(car ms))
(= (cdr ns)
(cdr ms)))))
;; prod tests
(test-begin
(check-equal? (size 1*b) 2)
(check-equal? (decode 1*b 0) (cons 1 #t))
(check-equal? (decode 1*b 1) (cons 1 #f))
(check-bijection? 1*b)
(check-equal? (enum-size bool*bool) 4)
(check-equal? (decode bool*bool 0)
(cons #t #t))
(check-equal? (decode bool*bool 1)
(cons #t #f))
(check-equal? (decode bool*bool 2)
(cons #f #t))
(check-equal? (decode bool*bool 3)
(cons #f #f))
(check-bijection? bool*bool)
(check-equal? (enum-size bool*nats) +inf.f)
(check-equal? (decode bool*nats 0)
(cons #t 0))
(check-equal? (decode bool*nats 1)
(cons #f 0))
(check-equal? (decode bool*nats 2)
(cons #t 1))
(check-equal? (decode bool*nats 3)
(cons #f 1))
(check-bijection? bool*nats)
(check-equal? (enum-size nats*bool) +inf.f)
(check-equal? (decode nats*bool 0)
(cons 0 #t))
(check-equal? (decode nats*bool 1)
(cons 0 #f))
(check-equal? (decode nats*bool 2)
(cons 1 #t))
(check-equal? (decode nats*bool 3)
(cons 1 #f))
(check-bijection? nats*bool)
(check-equal? (enum-size nats*nats) +inf.f)
(check ns-equal?
(decode nats*nats 0)
(cons 0 0))
(check ns-equal?
(decode nats*nats 1)
(cons 0 1))
(check ns-equal?
(decode nats*nats 2)
(cons 1 0))
(check ns-equal?
(decode nats*nats 3)
(cons 0 2))
(check ns-equal?
(decode nats*nats 4)
(cons 1 1))
(check-bijection? nats*nats))
;; dep/e tests
(define (up-to n)
(take/e nats (+ n 1)))
(define 3-up
(dep/e
(from-list/e '(0 1 2))
up-to))
(define from-3
(dep/e
(from-list/e '(0 1 2))
nats+/e))
(define nats-to
(dep/e nats up-to))
(define nats-up
(dep/e nats nats+/e))
(test-begin
(check-equal? (size 3-up) 6)
(check-equal? (decode 3-up 0) (cons 0 0))
(check-equal? (decode 3-up 1) (cons 1 0))
(check-equal? (decode 3-up 2) (cons 1 1))
(check-equal? (decode 3-up 3) (cons 2 0))
(check-equal? (decode 3-up 4) (cons 2 1))
(check-equal? (decode 3-up 5) (cons 2 2))
(check-bijection? 3-up)
(check-equal? (size from-3) +inf.f)
(check-equal? (decode from-3 0) (cons 0 0))
(check-equal? (decode from-3 1) (cons 1 1))
(check-equal? (decode from-3 2) (cons 2 2))
(check-equal? (decode from-3 3) (cons 0 1))
(check-equal? (decode from-3 4) (cons 1 2))
(check-equal? (decode from-3 5) (cons 2 3))
(check-equal? (decode from-3 6) (cons 0 2))
(check-bijection? from-3)
(check-equal? (size nats-to) +inf.f)
(check-equal? (decode nats-to 0) (cons 0 0))
(check-equal? (decode nats-to 1) (cons 1 0))
(check-equal? (decode nats-to 2) (cons 1 1))
(check-equal? (decode nats-to 3) (cons 2 0))
(check-equal? (decode nats-to 4) (cons 2 1))
(check-equal? (decode nats-to 5) (cons 2 2))
(check-equal? (decode nats-to 6) (cons 3 0))
(check-bijection? nats-to)
(check-equal? (size nats-up) +inf.f)
(check-equal? (decode nats-up 0) (cons 0 0))
(check-equal? (decode nats-up 1) (cons 0 1))
(check-equal? (decode nats-up 2) (cons 1 1))
(check-equal? (decode nats-up 3) (cons 0 2))
(check-equal? (decode nats-up 4) (cons 1 2))
(check-equal? (decode nats-up 5) (cons 2 2))
(check-equal? (decode nats-up 6) (cons 0 3))
(check-equal? (decode nats-up 7) (cons 1 3))
(check-bijection? nats-up))
;; find-size tests
(check-equal? (find-size (gvector) 5) #f)
(check-equal? (find-size (gvector 5) 4) 0)
(check-equal? (find-size (gvector 1 5 7) 0) 0)
(check-equal? (find-size (gvector 1 5 7) 1) 1)
(check-equal? (find-size (gvector 1 5 7) 4) 1)
(check-equal? (find-size (gvector 1 5 7) 5) 2)
(check-equal? (find-size (gvector 1 5 7) 6) 2)
(check-equal? (find-size (gvector 1 5 7) 7) #f)
;; depend/e tests
;; same as dep unless the right side is finite
(define 3-up-2
(dep/e
(from-list/e '(0 1 2))
up-to))
(define nats-to-2
(dep/e nats up-to))
(test-begin
(check-equal? (size 3-up-2) 6)
(check-equal? (decode 3-up-2 0) (cons 0 0))
(check-equal? (decode 3-up-2 1) (cons 1 0))
(check-equal? (decode 3-up-2 2) (cons 1 1))
(check-equal? (decode 3-up-2 3) (cons 2 0))
(check-equal? (decode 3-up-2 4) (cons 2 1))
(check-equal? (decode 3-up-2 5) (cons 2 2))
(check-equal? (encode 3-up-2 (cons 0 0)) 0)
(check-equal? (encode 3-up-2 (cons 1 0)) 1)
(check-equal? (encode 3-up-2 (cons 1 1)) 2)
(check-equal? (encode 3-up-2 (cons 2 0)) 3)
(check-equal? (size nats-to-2) +inf.f)
(check-equal? (encode nats-to-2 (cons 0 0)) 0)
(check-equal? (encode nats-to-2 (cons 1 0)) 1)
(check-equal? (encode nats-to-2 (cons 1 1)) 2)
(check-equal? (encode nats-to-2 (cons 2 0)) 3)
(check-equal? (encode nats-to-2 (cons 2 1)) 4)
(check-equal? (encode nats-to-2 (cons 2 2)) 5)
(check-equal? (encode nats-to-2 (cons 3 0)) 6)
(check-equal? (decode nats-to-2 0) (cons 0 0))
(check-equal? (decode nats-to-2 1) (cons 1 0))
(check-equal? (decode nats-to-2 2) (cons 1 1))
(check-equal? (decode nats-to-2 3) (cons 2 0))
(check-equal? (decode nats-to-2 4) (cons 2 1))
(check-equal? (decode nats-to-2 5) (cons 2 2))
(check-equal? (decode nats-to-2 6) (cons 3 0)))
;; take/e test
(define to-2 (up-to 2))
(test-begin
(check-equal? (size to-2) 3)
(check-equal? (decode to-2 0) 0)
(check-equal? (decode to-2 1) 1)
(check-equal? (decode to-2 2) 2)
(check-bijection? to-2))
;; to-list test
(test-begin
(check-equal? (to-list (up-to 3))
'(0 1 2 3)))
;; except/e test
(define not-3 (except/e nats '(3)))
(test-begin
(check-equal? (decode not-3 0) 0)
(check-equal? (decode not-3 3) 4)
(check-bijection? not-3))
(define not-a (except/e nats '(a)))
(test-begin
(check-equal? (decode not-a 0) 0)
(check-bijection? not-a))
;; fold-enum tests
(define complicated
(fold-enum
(λ (excepts n)
(except/e (up-to n) excepts))
'(2 4 6)))
(check-bijection? complicated))
nums)))))

View File

@ -0,0 +1,352 @@
#lang racket
(require rackunit
data/gvector
redex/private/enumerator
(submod redex/private/enumerator test))
;; basic enums
(define bools/e
(from-list/e (list #t #f)))
;; const/e tests
(let ([e (const/e 17)])
(test-begin
(check-eq? (decode e 0) 17)
(check-exn exn:fail?
(λ ()
(decode e 1)))
(check-eq? (encode e 17) 0)
(check-exn exn:fail?
(λ ()
(encode e 0)))
(check-bijection? e)))
;; from-list/e tests
(let ([e (from-list/e '(5 4 1 8))])
(test-begin
(check-eq? (decode e 0) 5)
(check-eq? (decode e 3) 8)
(check-exn exn:fail?
(λ () (decode e 4)))
(check-eq? (encode e 5) 0)
(check-eq? (encode e 8) 3)
(check-exn exn:fail?
(λ ()
(encode e 17)))
(check-bijection? e)))
;; map test
(define nats+1 (nats+/e 1))
(test-begin
(check-equal? (size nats+1) +inf.f)
(check-equal? (decode nats+1 0) 1)
(check-equal? (decode nats+1 1) 2)
(check-bijection? nats+1))
;; encode check
(test-begin
(check-exn exn:fail?
(λ ()
(decode nats -1))))
#;
(define (nats+/e n)
(map/e (λ (k)
(+ k n))
(λ (k)
(- k n))))
;; ints checks
(test-begin
(check-eq? (decode ints/e 0) 0) ; 0 -> 0
(check-eq? (decode ints/e 1) 1) ; 1 -> 1
(check-eq? (decode ints/e 2) -1) ; 2 -> 1
(check-eq? (encode ints/e 0) 0)
(check-eq? (encode ints/e 1) 1)
(check-eq? (encode ints/e -1) 2)
(check-bijection? ints/e)) ; -1 -> 2, -3 -> 4
;; sum tests
(define evens/e
(enum +inf.f
(λ (n)
(* 2 n))
(λ (n)
(if (and (zero? (modulo n 2))
(>= n 0))
(/ n 2)
(error 'even)))))
(define odds/e
(enum +inf.f
(λ (n)
(+ (* 2 n) 1))
(λ (n)
(if (and (not (zero? (modulo n 2)))
(>= n 0))
(/ (- n 1) 2)
(error 'odd)))))
(test-begin
(let ([bool-or-num (sum/e bools/e
(from-list/e '(0 1 2)))]
[bool-or-nat (sum/e bools/e
nats)]
[nat-or-bool (sum/e nats
bools/e)]
[odd-or-even (sum/e evens/e
odds/e)])
(check-equal? (size bool-or-num)
5)
(check-equal? (decode bool-or-num 0) #t)
(check-equal? (decode bool-or-num 1) #f)
(check-equal? (decode bool-or-num 2) 0)
(check-exn exn:fail?
(λ ()
(decode bool-or-num 5)))
(check-equal? (encode bool-or-num #f) 1)
(check-equal? (encode bool-or-num 2) 4)
(check-bijection? bool-or-num)
(check-equal? (size bool-or-nat)
+inf.f)
(check-equal? (decode bool-or-nat 0) #t)
(check-equal? (decode bool-or-nat 2) 0)
(check-bijection? bool-or-nat)
(check-equal? (encode bool-or-num #f) 1)
(check-equal? (encode bool-or-num 2) 4)
(check-equal? (size odd-or-even)
+inf.f)
(check-equal? (decode odd-or-even 0) 0)
(check-equal? (decode odd-or-even 1) 1)
(check-equal? (decode odd-or-even 2) 2)
(check-exn exn:fail?
(λ ()
(decode odd-or-even -1)))
(check-equal? (encode odd-or-even 0) 0)
(check-equal? (encode odd-or-even 1) 1)
(check-equal? (encode odd-or-even 2) 2)
(check-equal? (encode odd-or-even 3) 3)
(check-bijection? odd-or-even)))
;; prod/e tests
(define bool*bool (prod/e bools/e bools/e))
(define 1*b (prod/e (const/e 1) bools/e))
(define bool*nats (prod/e bools/e nats))
(define nats*bool (prod/e nats bools/e))
(define nats*nats (prod/e nats nats))
(define ns-equal? (λ (ns ms)
(and (= (car ns)
(car ms))
(= (cdr ns)
(cdr ms)))))
;; prod tests
(test-begin
(check-equal? (size 1*b) 2)
(check-equal? (decode 1*b 0) (cons 1 #t))
(check-equal? (decode 1*b 1) (cons 1 #f))
(check-bijection? 1*b)
(check-equal? (size bool*bool) 4)
(check-equal? (decode bool*bool 0)
(cons #t #t))
(check-equal? (decode bool*bool 1)
(cons #t #f))
(check-equal? (decode bool*bool 2)
(cons #f #t))
(check-equal? (decode bool*bool 3)
(cons #f #f))
(check-bijection? bool*bool)
(check-equal? (size bool*nats) +inf.f)
(check-equal? (decode bool*nats 0)
(cons #t 0))
(check-equal? (decode bool*nats 1)
(cons #f 0))
(check-equal? (decode bool*nats 2)
(cons #t 1))
(check-equal? (decode bool*nats 3)
(cons #f 1))
(check-bijection? bool*nats)
(check-equal? (size nats*bool) +inf.f)
(check-equal? (decode nats*bool 0)
(cons 0 #t))
(check-equal? (decode nats*bool 1)
(cons 0 #f))
(check-equal? (decode nats*bool 2)
(cons 1 #t))
(check-equal? (decode nats*bool 3)
(cons 1 #f))
(check-bijection? nats*bool)
(check-equal? (size nats*nats) +inf.f)
(check ns-equal?
(decode nats*nats 0)
(cons 0 0))
(check ns-equal?
(decode nats*nats 1)
(cons 0 1))
(check ns-equal?
(decode nats*nats 2)
(cons 1 0))
(check ns-equal?
(decode nats*nats 3)
(cons 0 2))
(check ns-equal?
(decode nats*nats 4)
(cons 1 1))
(check-bijection? nats*nats))
;; dep/e tests
(define (up-to n)
(take/e nats (+ n 1)))
(define 3-up
(dep/e
(from-list/e '(0 1 2))
up-to))
(define from-3
(dep/e
(from-list/e '(0 1 2))
nats+/e))
(define nats-to
(dep/e nats up-to))
(define nats-up
(dep/e nats nats+/e))
(test-begin
(check-equal? (size 3-up) 6)
(check-equal? (decode 3-up 0) (cons 0 0))
(check-equal? (decode 3-up 1) (cons 1 0))
(check-equal? (decode 3-up 2) (cons 1 1))
(check-equal? (decode 3-up 3) (cons 2 0))
(check-equal? (decode 3-up 4) (cons 2 1))
(check-equal? (decode 3-up 5) (cons 2 2))
(check-bijection? 3-up)
(check-equal? (size from-3) +inf.f)
(check-equal? (decode from-3 0) (cons 0 0))
(check-equal? (decode from-3 1) (cons 1 1))
(check-equal? (decode from-3 2) (cons 2 2))
(check-equal? (decode from-3 3) (cons 0 1))
(check-equal? (decode from-3 4) (cons 1 2))
(check-equal? (decode from-3 5) (cons 2 3))
(check-equal? (decode from-3 6) (cons 0 2))
(check-bijection? from-3)
(check-equal? (size nats-to) +inf.f)
(check-equal? (decode nats-to 0) (cons 0 0))
(check-equal? (decode nats-to 1) (cons 1 0))
(check-equal? (decode nats-to 2) (cons 1 1))
(check-equal? (decode nats-to 3) (cons 2 0))
(check-equal? (decode nats-to 4) (cons 2 1))
(check-equal? (decode nats-to 5) (cons 2 2))
(check-equal? (decode nats-to 6) (cons 3 0))
(check-bijection? nats-to)
(check-equal? (size nats-up) +inf.f)
(check-equal? (decode nats-up 0) (cons 0 0))
(check-equal? (decode nats-up 1) (cons 0 1))
(check-equal? (decode nats-up 2) (cons 1 1))
(check-equal? (decode nats-up 3) (cons 0 2))
(check-equal? (decode nats-up 4) (cons 1 2))
(check-equal? (decode nats-up 5) (cons 2 2))
(check-equal? (decode nats-up 6) (cons 0 3))
(check-equal? (decode nats-up 7) (cons 1 3))
(check-bijection? nats-up))
;; find-size tests
(check-equal? (find-size (gvector) 5) #f)
(check-equal? (find-size (gvector 5) 4) 0)
(check-equal? (find-size (gvector 1 5 7) 0) 0)
(check-equal? (find-size (gvector 1 5 7) 1) 1)
(check-equal? (find-size (gvector 1 5 7) 4) 1)
(check-equal? (find-size (gvector 1 5 7) 5) 2)
(check-equal? (find-size (gvector 1 5 7) 6) 2)
(check-equal? (find-size (gvector 1 5 7) 7) #f)
;; depend/e tests
;; same as dep unless the right side is finite
(define 3-up-2
(dep/e
(from-list/e '(0 1 2))
up-to))
(define nats-to-2
(dep/e nats up-to))
(test-begin
(check-equal? (size 3-up-2) 6)
(check-equal? (decode 3-up-2 0) (cons 0 0))
(check-equal? (decode 3-up-2 1) (cons 1 0))
(check-equal? (decode 3-up-2 2) (cons 1 1))
(check-equal? (decode 3-up-2 3) (cons 2 0))
(check-equal? (decode 3-up-2 4) (cons 2 1))
(check-equal? (decode 3-up-2 5) (cons 2 2))
(check-equal? (encode 3-up-2 (cons 0 0)) 0)
(check-equal? (encode 3-up-2 (cons 1 0)) 1)
(check-equal? (encode 3-up-2 (cons 1 1)) 2)
(check-equal? (encode 3-up-2 (cons 2 0)) 3)
(check-equal? (size nats-to-2) +inf.f)
(check-equal? (encode nats-to-2 (cons 0 0)) 0)
(check-equal? (encode nats-to-2 (cons 1 0)) 1)
(check-equal? (encode nats-to-2 (cons 1 1)) 2)
(check-equal? (encode nats-to-2 (cons 2 0)) 3)
(check-equal? (encode nats-to-2 (cons 2 1)) 4)
(check-equal? (encode nats-to-2 (cons 2 2)) 5)
(check-equal? (encode nats-to-2 (cons 3 0)) 6)
(check-equal? (decode nats-to-2 0) (cons 0 0))
(check-equal? (decode nats-to-2 1) (cons 1 0))
(check-equal? (decode nats-to-2 2) (cons 1 1))
(check-equal? (decode nats-to-2 3) (cons 2 0))
(check-equal? (decode nats-to-2 4) (cons 2 1))
(check-equal? (decode nats-to-2 5) (cons 2 2))
(check-equal? (decode nats-to-2 6) (cons 3 0)))
;; take/e test
(define to-2 (up-to 2))
(test-begin
(check-equal? (size to-2) 3)
(check-equal? (decode to-2 0) 0)
(check-equal? (decode to-2 1) 1)
(check-equal? (decode to-2 2) 2)
(check-bijection? to-2))
;; to-list test
(test-begin
(check-equal? (to-list (up-to 3))
'(0 1 2 3)))
;; except/e test
(define not-3 (except/e nats '(3)))
(test-begin
(check-equal? (decode not-3 0) 0)
(check-equal? (decode not-3 3) 4)
(check-bijection? not-3))
(define not-a (except/e nats '(a)))
(test-begin
(check-equal? (decode not-a 0) 0)
(check-bijection? not-a))
;; fold-enum tests
(define complicated
(fold-enum
(λ (excepts n)
(except/e (up-to n) excepts))
'(2 4 6)))
(check-bijection? complicated)

View File

@ -35,6 +35,7 @@
"check-syntax-test.rkt"
"test-docs-complete.rkt"
"tut-subst-test.rkt"
"enumerator-test.rkt"
"enum-test.rkt"
"bitmap-test.rkt")
(if test-examples?