112 lines
3.1 KiB
Racket
112 lines
3.1 KiB
Racket
#lang racket
|
|
|
|
(require "test-util.rkt")
|
|
(require "remove-complex-oper.rkt")
|
|
(require "c2.rkt")
|
|
|
|
(define programs
|
|
(list
|
|
`(program ()
|
|
(- 20))
|
|
`(program ()
|
|
(- (- 20)))
|
|
`(program ()
|
|
(- (- (- 20))))
|
|
`(program () (+ 3 (- 20)))
|
|
`(program () (+ (+ 3 2) (+ 4 5)))
|
|
`(program () (let ([x 1]) x))
|
|
`(program () (let ([x (+ (- 2) 3)]) (+ x (+ 2 3))))
|
|
`(program () (+ (let ([x (+ (- 1) 2)]) (+ x 2)) (+ 4 5)))
|
|
`(program ()
|
|
(let ([a 42])
|
|
(let ([b a])
|
|
b)))
|
|
`(program () (let ([tmp (- 1)]) tmp))
|
|
`(program () (- (let ([x 1]) x)))
|
|
`(program () (let ([x (let ([x 1]) x)]) (+ 2 x)))
|
|
`(program ()
|
|
(let ([y (let ([x 20])
|
|
(+ x (let ([x 22]) x)))]) y))
|
|
`(program ()
|
|
(+ (read) (read)))))
|
|
|
|
(define inputs
|
|
(let ([empty-inputs (build-list (length programs) (lambda (_) ""))])
|
|
(list-set empty-inputs 13 "2\n3")))
|
|
|
|
(for ([program programs]
|
|
[env (build-list (length programs) (lambda (_) '()))]
|
|
[input-string inputs])
|
|
(test-eq (with-input-from-string input-string
|
|
(lambda () ((interp-R1 env) program)))
|
|
(with-input-from-string input-string
|
|
(lambda () ((interp-R1 env) (remove-complex-opera* program))))))
|
|
|
|
(test-eq
|
|
(remove-complex-opera* (list-ref programs 0))
|
|
`(program () (- 20)))
|
|
|
|
(test-eq
|
|
(remove-complex-opera* (list-ref programs 1))
|
|
`(program () (let ([tmp.1 (- 20)]) (- tmp.1))))
|
|
|
|
(test-eq
|
|
(remove-complex-opera* (list-ref programs 2))
|
|
`(program () (let ([tmp.1 (- 20)]) (let ([tmp.2 (- tmp.1)]) (- tmp.2)))))
|
|
|
|
(test-eq
|
|
(remove-complex-opera* (list-ref programs 3))
|
|
`(program () (let ((tmp.1 (- 20))) (+ 3 tmp.1))))
|
|
|
|
(test-eq
|
|
(remove-complex-opera* (list-ref programs 4))
|
|
`(program () (let ((tmp.1 (+ 3 2))) (let ((tmp.2 (+ 4 5))) (+ tmp.1 tmp.2)))))
|
|
|
|
(test-eq
|
|
(remove-complex-opera* (list-ref programs 5))
|
|
`(program ()
|
|
(let ((x.1 1)) x.1)))
|
|
|
|
(test-eq
|
|
(remove-complex-opera* (list-ref programs 6))
|
|
`(program ()
|
|
(let ((x.1
|
|
(let ((tmp.1 (- 2)))
|
|
(+ tmp.1 3))))
|
|
(let ((tmp.2 (+ 2 3)))
|
|
(+ x.1 tmp.2)))))
|
|
|
|
(test-eq
|
|
(remove-complex-opera* (list-ref programs 7))
|
|
`(program ()
|
|
(let ((x.1
|
|
(let ((tmp.1 (- 1)))
|
|
(+ tmp.1 2))))
|
|
(let ((tmp.2 (+ x.1 2)))
|
|
(let ((tmp.3 (+ 4 5)))
|
|
(+ tmp.2 tmp.3))))))
|
|
|
|
(test-eq
|
|
(remove-complex-opera* (list-ref programs 8))
|
|
`(program () (let([a.1 42]) (let ([b.1 a.1]) b.1))))
|
|
|
|
(test-eq
|
|
(remove-complex-opera* (list-ref programs 9))
|
|
`(program () (let ([tmp.1 (- 1)]) tmp.1)))
|
|
|
|
(test-eq
|
|
(remove-complex-opera* (list-ref programs 10))
|
|
`(program () (let ((x.1 1)) (- x.1))))
|
|
|
|
(test-eq
|
|
(remove-complex-opera* (list-ref programs 11))
|
|
`(program () (let ((x.1 (let ((x.2 1)) x.2))) (+ 2 x.1))))
|
|
|
|
(test-eq
|
|
(remove-complex-opera* (list-ref programs 12))
|
|
`(program () (let ((y.1 (let ((x.1 20)) (let ((x.2 22)) (+ x.1 x.2))))) y.1)))
|
|
|
|
(test-eq
|
|
(remove-complex-opera* (list-ref programs 13))
|
|
`(program () (let ((tmp.1 (read))) (let ((tmp.2 (read))) (+ tmp.1 tmp.2)))))
|