Advertisement
timothy235

sicp-4-1-7-repl-test

Mar 16th, 2017
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 6.75 KB | None | 0 0
  1. #lang racket
  2. (require rackunit
  3.          "4-1-7-repl-program.rkt")
  4.  
  5. ;; The same as "4-1-4-repl-test.rkt" only a new test case for letrec was added.
  6.  
  7. (test-case "self-evaluating expression"
  8.            (check-equal? (my-eval "x" the-global-environment)
  9.                          "x")
  10.            (check-equal? (my-eval 23 the-global-environment)
  11.                          23)
  12.            )
  13.  
  14. (test-case "quotation"
  15.            (define quote-expr '(quote ("x" 23 a)))
  16.            (check-equal? (my-eval quote-expr the-global-environment)
  17.                          '("x" 23 a))
  18.            )
  19.  
  20. (test-case "variable definition"
  21.            (define def-expr '(define a 42))
  22.            (check-equal? (my-eval def-expr the-global-environment)
  23.                          'ok)
  24.            (check-equal? (my-eval 'a the-global-environment)
  25.                          42)
  26.            )
  27.  
  28. (test-case "procedure definition"
  29.            (define proc-expr '(define (multiply x y) (* x y)))
  30.            (check-equal? (my-eval proc-expr the-global-environment)
  31.                          'ok)
  32.            )
  33.  
  34. (test-case "procedure application"
  35.            (define application-expr '(multiply 3 4))
  36.            (check-equal? (my-eval application-expr the-global-environment)
  37.                          12)
  38.            (check-equal? (my-eval '(car (cons 1 (cons 2 '())))
  39.                                   the-global-environment)
  40.                          1)
  41.            )
  42.  
  43. (test-case "assignment"
  44.            (define assign-expr '(set! a 23))
  45.            (check-equal? (my-eval assign-expr the-global-environment)
  46.                          'ok)
  47.            (check-equal? (my-eval 'a the-global-environment)
  48.                          23)
  49.            )
  50.  
  51. (test-case "predicate"
  52.            (check-true (true? (my-eval 'a the-global-environment)))
  53.            (check-true (true? (my-eval "false" the-global-environment)))
  54.            (check-false (true? (my-eval 'false the-global-environment)))
  55.            (check-true (false? (my-eval 'false the-global-environment)))
  56.            )
  57.  
  58. (test-case "if statement"
  59.            (define ie '(if true 1 2))
  60.            (check-equal? (my-eval ie the-global-environment)
  61.                          1)
  62.            (define ie2 '(if false 1 2))
  63.            (check-equal? (my-eval ie2 the-global-environment)
  64.                          2)
  65.            )
  66.  
  67. (test-case "cond statement"
  68.            (define ce '(cond ("a" 1 2) ("b" 3)))
  69.            (check-equal? (my-eval ce the-global-environment)
  70.                          2)
  71.            (define alt-ce '(cond ((cons 1 (cons 2 '())) => car) (else 87)))
  72.            (check-equal? (my-eval alt-ce the-global-environment)
  73.                          1)
  74.            )
  75.  
  76. (test-case "begin statement"
  77.            (define be '(begin "a" "b" 1 2 (* 3 4)))
  78.            (check-equal? (my-eval be the-global-environment)
  79.                          12)
  80.            )
  81.  
  82. (test-case "boolean operator"
  83.            (my-eval '(define c 38) the-global-environment)
  84.            (check-equal? (my-eval '(and 1 "a" c) the-global-environment)
  85.                          38)
  86.            (check-equal? (my-eval '(and 1 1 false) the-global-environment)
  87.                         false)
  88.            (check-equal? (my-eval '(or false false 1) the-global-environment)
  89.                          1)
  90.            (check-equal? (my-eval '(or false false false) the-global-environment)
  91.                         false)
  92.            )
  93.  
  94. (test-case "let"
  95.            (define le '(let ((x 1) (y 2) (z 3)) 'side-effect (+ x y z)))
  96.            (check-equal? (my-eval le the-global-environment)
  97.                          6)
  98.            (define le2 '(let ((x 1) (y 2)) (+ x y)))
  99.            (check-equal? (my-eval le2 the-global-environment)
  100.                          3)
  101.            (define le3 '(let ((x 1)) 'side-effect (+ x 2)))
  102.            (check-equal? (my-eval le3 the-global-environment)
  103.                          3)
  104.            (define le4 '(let () 'side-effect (+ 3 2)))
  105.            (check-equal? (my-eval le4 the-global-environment)
  106.                          5)
  107.            (define le5 '(let () (+ 3 2)))
  108.            (check-equal? (my-eval le5 the-global-environment)
  109.                          5)
  110.            ; let with internal defines
  111.            (define le6 '(let ([x 1]) (define y 2) (+ x y)))
  112.            (check-equal? (my-eval le6 the-global-environment)
  113.                          3)
  114.            (define le7 '(let* ([x 1]
  115.                                [y (+ x 1)])
  116.                           (define z (+ x y))
  117.                           (define w (+ z 1))
  118.                           (+ x y z w)))
  119.            (check-equal? (my-eval le7 the-global-environment)
  120.                          10)
  121.            )
  122.  
  123. (test-case "named-let"
  124.            (my-eval '(define (fib n)
  125.                        (let fib-iter ((a 1)
  126.                                       (b 0)
  127.                                       (my-count n))
  128.                          (if (= my-count 0)
  129.                            b
  130.                            (fib-iter (+ a b) a (+ my-count -1)))))
  131.                     the-global-environment)
  132.            (check-equal? (my-eval '(fib 0) the-global-environment)
  133.                          0)
  134.            (check-equal? (my-eval '(fib 1) the-global-environment)
  135.                          1)
  136.            (check-equal? (my-eval '(fib 10) the-global-environment)
  137.                          55)
  138.            )
  139.  
  140. (test-case "let*"
  141.            (define lse '(let* ((x 1) (y (+ x 1)) (z (+ y 1))) (+ x y z)))
  142.            (check-equal? (my-eval lse the-global-environment)
  143.                          6)
  144.            (define lse2 '(let* ((a 1) (b 2)) 'side-effect (+ a b)))
  145.            (check-equal? (my-eval lse2 the-global-environment)
  146.                          3)
  147.            (define lse3 '(let* ((a 1)) 'side-effect (+ a 2)))
  148.            (check-equal? (my-eval lse3 the-global-environment)
  149.                          3)
  150.            (define lse4 '(let* ((a 1)) (+ a 2)))
  151.            (check-equal? (my-eval lse4 the-global-environment)
  152.                          3)
  153.            )
  154.  
  155. (test-case "letrec"
  156.            (my-eval '(define (my-even? x)
  157.                        (letrec ((ev? (lambda (n)
  158.                                        (if (= n 0)
  159.                                         true
  160.                                          (od? (- n 1)))))
  161.                                 (od? (lambda (n)
  162.                                        (if (= n 0)
  163.                                         false
  164.                                          (ev? (- n 1))))))
  165.                          (ev? x)))
  166.                     the-global-environment)
  167.            (check-equal? (my-eval '(my-even? 11) the-global-environment)
  168.                         false)
  169.            (check-equal? (my-eval '(my-even? 12) the-global-environment)
  170.                         true)
  171.            )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement