eoc/test-remove-complex-opera.rkt

95 lines
3.4 KiB
Racket

#lang racket
(require rackunit)
(require "test-util.rkt")
(require "uniquify.rkt")
(require "remove-complex-oper.rkt")
(require/expose "remove-complex-oper.rkt" (find-tmp-last rco-exp rco-arg))
(require "rvar.rkt")
(test-eq
(find-tmp-last (Program '()
(Let 'tmp.0 (Let 'x (Int 20)
(Prim '+ (list (Var 'x)
(Let 'tmp.1 (Int 22)
(Var 'tmp.1)))))
(Var 'tmp.0))))
1)
(test-eq
(find-tmp-last (Program '()
(Let 'tmp.x (Let 'x (Int 20)
(Prim '+ (list (Var 'x)
(Let 'tmp.y (Int 22)
(Var 'tmp.y)))))
(Var 'tmp.x))))
-1)
(define programs
(list
(Program '()
(Prim '- (list (Int 20))))
(Program '()
(Prim '- (list (Prim '- (list (Int 20))))))
(Program '()
(Prim '- (list (Prim '- (list (Prim '- (list (Int 20))))))))
(Program '() (Prim '+ (list (Int 3) (Prim '- (list (Int 20))))))
(Program '()
(Prim '+ (list (Prim '+ (list (Int 3) (Int 2)))
(Prim '+ (list (Int 4) (Int 5))))))
(Program '() (Let 'x (Int 1) (Var 'x)))
(Program '() (Let 'x (Prim '+ (list (Prim '- (list (Int 2)))
(Int 3)))
(Prim '+ (list (Var 'x)
(Prim '+ (list (Int 2) (Int 3)))))))
(Program '() (Prim '+
(list (Let 'x
(Prim '+
(list (Prim '- (list (Int 1)))
(Int 2)))
(Prim '+ (list (Var 'x) (Int 2))))
(Prim '+ (list (Int 4) (Int 5))))))
(Program '()
(Let 'a (Int 42)
(Let 'b (Var 'a)
(Var 'b))))
(Program '() (Let 'tmp (Prim '- (list (Int 1))) (Var 'tmp)))
(Program '() (Prim '-
(list (Let 'x (Int 1) (Var 'x)))))
(Program '() (Let 'x (Let 'x (Int 1) (Var 'x)) (Prim '+ (list (Int 2) (Var 'x)))))
(Program '()
(Let 'y (Let 'x (Int 20)
(Prim '+ (list (Var 'x)
(Let 'x (Int 22) (Var 'x)))))
(Var 'y)))
(Program '() ; - pos 13
(Prim '+ (list (Prim 'read '())
(Prim 'read '()))))
(Program '()
(Prim '+ (list (Let 'x (Int 1)
(Let 'x (Int 2)
(Int 2)))
(Let 'x (Int 2)
(Var 'x)))))))
(define inputs
(let ([empty-inputs (build-list (length programs) (lambda (_) '()))])
(list-set empty-inputs 13 '(2 3))))
(define (pass p)
(remove-complex-opera* (uniquify p)))
(begin
(define-values (a b c) (rco-arg (Prim '- (list (Int 20))) -1))
(test-eq a (Var 'tmp.0)))
(for ([program programs]
[input-list inputs])
(test-eq (with-input-from-num-list input-list
(lambda () (interp-RVar program)))
(with-input-from-num-list input-list
(lambda () (interp-RVar (pass program))))))