]> git.rkrishnan.org Git - sicp.git/blobdiff - src/sicp/metacircular2-lazy-test.rkt
Lazy version of evaluator and tests.
[sicp.git] / src / sicp / metacircular2-lazy-test.rkt
diff --git a/src/sicp/metacircular2-lazy-test.rkt b/src/sicp/metacircular2-lazy-test.rkt
new file mode 100644 (file)
index 0000000..b19f2c8
--- /dev/null
@@ -0,0 +1,88 @@
+#lang racket
+
+(require "metacircular2-lazy.rkt"
+         rackunit)
+
+(require rackunit/text-ui)
+
+(define metacircular2-tests
+  (test-suite "test suite for meta circular evaluator"
+   (let ([env1 (make-environment)])
+#|     
+     (check-equal? (eval '(+ 1 1) env1) 2 "simple addition")
+     (check-equal? (eval '(- 2 1) env1) 1 "simple subtraction")
+     (check-equal? (eval '(quote x) env1) 'x "quote")
+     (eval '(define x 20) env1)
+     (check-equal? (eval 'x env1) 20 "definition of identifiers with simple values")
+     (eval '(set! x 42) env1) 
+     (check-equal? (eval 'x env1) 42 "set!")
+     (eval '(define (square x) (* x x)) env1)
+     (check-equal? (eval '(square 10) env1) 100 "simple function definition")
+     (eval '(define (square x) (let ([s (* x x)]) s)) env1)
+     (check-equal? (eval '(square 20) env1) 400 "different way to define square")
+     (eval '(define (absolute x)
+              (cond ((> x 0) x)
+                    ((= x 0) (display 'zero) 0)
+                    (else (- x))))
+           env1)
+     (check-equal? (eval '(absolute -2) env1) 2 "conditionals")
+     (check-equal? (eval '(absolute 2) env1) 2 "conditionals")
+     (eval '(define (foo) (let ((x 42) (y 100)) (list x y))) env1)
+     (check-equal? (eval '(foo) env1) '(42 100) "simple let")
+     (check-equal? (eval '(let* ((x 3)
+                                 (y (+ x 2))
+                                 (z (+ x y 5)))
+                            (* x z))
+                         env1)
+                   39
+                   "let* test")
+     (eval '(define (f x)
+              (define (even? n)
+                (if (= n 0)
+                    true
+                    (odd? (- n 1))))
+              (define (odd? n)
+                (if (= n 0)
+                    false
+                    (even? (- n 1))))
+              (odd? x))
+           env1)
+     (check-equal? (eval '(f 2) env1) false "internal definitions")
+     (check-equal? (eval '(f 3) env1) true "internal definitions")
+     (eval '(define (f1 x)
+              (letrec ((even?
+                        (lambda (n)
+                          (if (= n 0)
+                              true
+                              (odd? (- n 1)))))
+                       (odd?
+                        (lambda (n)
+                          (if (= n 0)
+                              false
+                              (even? (- n 1))))))
+                (even? x)))
+           env1)
+     (check-equal? (eval '(f1 2) env1) true "internal definitions")
+     (check-equal? (eval '(f1 3) env1) false "internal definitions")
+     (eval '(define (fib n)
+              (let fib-iter ((a 1)
+                             (b 0)
+                             (count n))
+                (if (= count 0)
+                    b
+                    (fib-iter (+ a b) a (- count 1)))))
+           env1)
+     (check-equal? (eval '(fib 10) env1) 55 "named let")
+     (eval '(define (factorial n)
+              (if (= n 1)
+                  1
+                  (* (factorial (- n 1)) n)))
+           env1)
+     (check-equal? (eval '(factorial 10) env1) 3628800 "factorial test")
+     (check-equal? (eval '(unless true "true" "false") env1) "false" "unless test 1")
+     (check-equal? (eval '(unless false "true" "false") env1) "true" "unless test 2"))))
+|#
+     (eval '(define (try a b) (if (= a 0) 1 b)) env1)
+     (check-equal? (eval '(try 0 (/ 1 0)) env1) 1 "lazy test1"))))
+
+(run-tests metacircular2-tests)
\ No newline at end of file