Fix rvar subtraction, convert tests to rackunit

This commit is contained in:
Enrico Lumetti 2022-08-10 23:33:20 +02:00
parent 14d6b476bd
commit e4d469ea95
2 changed files with 39 additions and 27 deletions

View File

@ -23,6 +23,7 @@
[(Var name) (eval-symbol env name)] [(Var name) (eval-symbol env name)]
[(Prim 'read '()) (read-fixnum)] [(Prim 'read '()) (read-fixnum)]
[(Prim '- (list e)) (fx- 0 ((interp-exp env) e))] [(Prim '- (list e)) (fx- 0 ((interp-exp env) e))]
[(Prim '- `(,e1 ,e2)) (fx- ((interp-exp env) e1) ((interp-exp env) e2))]
[(Prim '+ `(,e1 ,e2)) (fx+ ((interp-exp env) e1) ((interp-exp env) e2))] [(Prim '+ `(,e1 ,e2)) (fx+ ((interp-exp env) e1) ((interp-exp env) e2))]
[(Let var rexp body) [(Let var rexp body)
(let ([value ((interp-exp env) rexp)]) (let ([value ((interp-exp env) rexp)])

View File

@ -1,39 +1,50 @@
#lang racket #lang racket
(require "test-util.rkt") (provide test-rvar-tests)
(require rackunit)
(require "rvar.rkt") (require "rvar.rkt")
(define (interp-exp env e) (define (interp-exp env e)
((send (new interp-RVar-class) interp-exp env) e)) ((send (new interp-RVar-class) interp-exp env) e))
(test-eq (define test-rvar-tests
(let ([env `((a . 1) (b . 2))]) (test-suite
(interp-exp env (Var 'a))) "RVar interpretation testsuite"
1)
(test-eq (check-equal?
(let ([env `((a . 1) (b . 2))]) (let ([env `((a . 1) (b . 2))])
(interp-exp env (Prim '+ (list (Var 'a) (Int 3))))) (interp-exp env (Var 'a)))
4) 1)
(test-eq (check-equal?
(let ([env `((a . 1) (b . 2))]) (let ([env `((a . 1) (b . 2))])
(interp-exp env (Prim '- `(,(Int 3))))) (interp-exp env (Prim '+ (list (Var 'a) (Int 3)))))
-3) 4)
(test-eq (check-equal?
(let ([env `((a . 1) (b . 2))]) (let ([env `((a . 1) (b . 2))])
(interp-exp env (Prim '+ (list (Var 'a) (Prim `- (list (Var 'b))))))) (interp-exp env (Prim '- `(,(Int 3)))))
-1) -3)
(test-eq (check-equal?
(interp-exp `() (Let 'a (let ([env `((a . 1))])
(Prim '+ (list (Int 1) (Int 2))) (interp-exp env (Prim '- (list (Int 3) (Var 'a)))))
(Prim '+ (list (Var 'a) (Int 3))))) 2)
6)
(test-eq (check-equal?
(interp-RVar (Program `() (Let 'a (let ([env `((a . 1) (b . 2))])
(Prim '+ (list (Int 1) (Int 2))) (interp-exp env (Prim '+ (list (Var 'a) (Prim `- (list (Var 'b)))))))
(Prim '+ (list (Var 'a) (Int 3)))))) -1)
6)
(check-equal?
(interp-exp `() (Let 'a
(Prim '+ (list (Int 1) (Int 2)))
(Prim '+ (list (Var 'a) (Int 3)))))
6)
(check-equal?
(interp-RVar (Program `() (Let 'a
(Prim '+ (list (Int 1) (Int 2)))
(Prim '+ (list (Var 'a) (Int 3))))))
6)))