]> git.rkrishnan.org Git - sicp.git/blob - src/sicp/metacircular2-test.rkt
563b0ec846fb4ac8bd1a3cc75238da83191f00f6
[sicp.git] / src / sicp / metacircular2-test.rkt
1 #lang racket
2
3 (require "metacircular2.rkt"
4          rackunit)
5
6 (require rackunit/text-ui)
7
8 (define metacircular2-tests
9   (test-suite "test suite for meta circular evaluator"
10    (let ([env1 (make-environment)])
11      (check-equal? (eval '(+ 1 1) env1) 2 "simple addition")
12      (check-equal? (eval '(- 2 1) env1) 1 "simple subtraction")
13      (check-equal? (eval '(quote x) env1) 'x "quote")
14      (eval '(define x 20) env1)
15      (check-equal? (eval 'x env1) 20 "definition of identifiers with simple values")
16      (eval '(set! x 42) env1) 
17      (check-equal? (eval 'x env1) 42 "set!")
18      (eval '(define (square x) (* x x)) env1)
19      (check-equal? (eval '(square 10) env1) 100 "simple function definition")
20      (eval '(define (square x) (let ([s (* x x)]) s)) env1)
21      (check-equal? (eval '(square 20) env1) 400 "different way to define square")
22      (eval '(define (absolute x)
23               (cond ((> x 0) x)
24                     ((= x 0) (display 'zero) 0)
25                     (else (- x))))
26            env1)
27      (check-equal? (eval '(absolute -2) env1) 2 "conditionals")
28      (check-equal? (eval '(absolute 2) env1) 2 "conditionals")
29      (eval '(define (foo) (let ((x 42) (y 100)) (list x y))) env1)
30      (check-equal? (eval '(foo) env1) '(42 100) "simple let")
31      (check-equal? (eval '(let* ((x 3)
32                                  (y (+ x 2))
33                                  (z (+ x y 5)))
34                             (* x z))
35                          env1)
36                    39
37                    "let* test"))))
38
39
40 (run-tests metacircular2-tests)