{-# OPTIONS_GHC -fno-warn-type-defaults #-} module SimpleTests where import Intermediate import Immediate import TestHarness import Data.Char default (RegValue, Double) integers :: [(Program, String)] integers = map exprToProg $ map (\x -> ((E (I x)), show x)) [0::RegValue, 1, -1, 10, -10, 2736, -2736, empty_list, -empty_list, 2^29 - 1, -(2^29 - 1), 2^30-1, -(2^30-1), (2^61-1), -(2^61)] immediateConstants :: [(Program, String)] immediateConstants = map exprToProg $ [ (E (B False), "#f") , (E (B True), "#t") , (E (N Nil), "()") ] ++ map (\x -> (E (C x), [x])) [' '..'~'] add1 :: [(Program, String)] add1 = map exprToProg $ (map (\x -> (P (Add1 (E (I x))), show $ x + 1)) [0, -1, 1, -100, 1000, 536870910, -536870912, 2^61-2, -(2^61)]) ++ [(P (Add1 (P (Add1 (E (I 0))))), "2") , (P (Add1 (P (Add1 (P (Add1 (P (Add1 (P (Add1 (P (Add1 (E (I 12))))))))))))), "18")] sub1 :: [(Program, String)] sub1 = map exprToProg $ (map (\x -> (P (Sub1 (E (I x))), show $ x - 1)) [0, -1, 1, -100, 1000, 536870910, -536870912, 2^61-2, -(2^61-1)]) ++ [(P (Sub1 (P (Sub1 (E (I 2))))), "0") , (P (Sub1 (P (Sub1 (P (Sub1 (P (Sub1 (P (Sub1 (P (Sub1 (E (I 18))))))))))))), "12")] nottest :: [(Program, String)] nottest = map exprToProg $ [ (P (Not (E (B True))), "#f") , (P (Not (E (B False))), "#t") , (P (Not (E (I 0))), "#f") , (P (Not (E (I 1))), "#f") , (P (Not (E (C 'a'))), "#f") , (P (Not (E (I (-1)))), "#f") ] intnot :: [(Program, String)] intnot = map exprToProg $ [ (P (LogNot (E (I 0))), "-1") , (P (LogNot (E (I (-1)))), "0") , (P (LogNot (E (I 1))), "-2") , (P (LogNot (E (I (2^61-1)))), show $ -(2^61)) , (P (LogNot (E (I (-(2^61))))), show $ 2^61-1) , (P (LogNot (P (LogNot (E (I 237463))))), "237463") ] charConvert :: [(Program, String)] charConvert = map exprToProg $ (map (\x -> (P (CharToInt (E (C x))), show (ord x))) [' '..'~']) ++ (map (\x -> (P (IntToChar (E (I x))), [chr(fromIntegral x)])) [32..126]) nullp :: [(Program, String)] nullp = map exprToProg $ [ (P (Nullp (E (N Nil))), "#t") , (P (Nullp (E (B True))), "#f") , (P (Nullp (E (B False))), "#f") , (P (Nullp (P (Nullp (E (N Nil))))), "#f") , (P (Nullp (E (C 'a'))), "#f") , (P (Nullp (E (I 0))), "#f") , (P (Nullp (E (I empty_list))), "#f") , (P (Nullp (E (I (-10)))), "#f")] zerop :: [(Program, String)] zerop = map exprToProg $ [ (P (Zerop (E (I 0))), "#t") , (P (Zerop (E (I 1))), "#f") , (P (Zerop (E (I (-1)))), "#f")] intp :: [(Program, String)] intp = map exprToProg $ [ (P (Intp (E (I 0))), "#t") , (P (Intp (E (I 1))), "#t") , (P (Intp (E (I (-1)))), "#t") , (P (Intp (E (I 37287))), "#t") , (P (Intp (E (I (-23837)))), "#t") , (P (Intp (E (I (2^61-1)))), "#t") , (P (Intp (E (I (-(2^61))))), "#t") , (P (Intp (E (B True))), "#f") , (P (Intp (E (B False))), "#f") , (P (Intp (E (N Nil))), "#f") , (P (Intp (E (I empty_list))), "#t") ] ++ (map (\x -> (P (Intp (E (C x))), "#f")) [' '..'~']) ++ (map (\x -> (P (Intp (P (CharToInt (E (C x))))), "#t")) [' '..'~']) ++ (map (\x -> (P (Intp (P (IntToChar (E (I x))))), "#f")) [32..(126::RegValue)]) boolp :: [(Program, String)] boolp = map exprToProg $ [ (P (Boolp (E (B True))), "#t") , (P (Boolp (E (B False))), "#t") , (P (Boolp (E (I 0))), "#f") , (P (Boolp (E (I 1))), "#f") , (P (Boolp (E (I (-1)))), "#f") , (P (Boolp (E (N Nil))), "#f") , (P (Boolp (E (C 'a'))), "#f") , (P (Boolp (P (Boolp (E (B True))))), "#t") , (P (Boolp (P (Boolp (E (C 'a'))))), "#t") ] charp :: [(Program, String)] charp = map exprToProg $ [ (P (Charp (E (C 'a'))), "#t") , (P (Charp (E (C 'Z'))), "#t") , (P (Charp (E (I 0))), "#f") , (P (Charp (E (I 1))), "#f") , (P (Charp (E (I (-1)))), "#f") , (P (Charp (E (N Nil))), "#f") , (P (Charp (E (B True))), "#f") , (P (Charp (E (B False))), "#f") , (P (Charp (P (Boolp (E (B True))))), "#f") , (P (Charp (P (Charp (E (C 'a'))))), "#f") ] iftest :: [(Program, String)] iftest = map exprToProg $ [ (If (E (B True)) (E (I 12)) (E (I 13)), "12") , (If (E (B False)) (E (I 12)) (E (I 13)), "13") , (If (E (I 0)) (E (I 12)) (E (I 13)), "12") , (If (E (N Nil)) (E (I 12)) (E (I 13)), "12") , (If (E (N Nil)) (E (I 43)) (E (N Nil)), "43") , (If (E (B True)) (If (E (I 12)) (E (I 13)) (E (I 4))) (E (I 17)), "13") , (If (E (B False)) (E (I 12)) (If (E (B False)) (E (I 13)) (E (I 4))), "4") , (If (E (C 'X')) (If (E (I 1)) (E (I 2)) (E (I 3))) (If (E (I 4)) (E (I 5)) (E (I 6))), "2") , (If (P (Not (P (Boolp (E (B True)))))) (E (I 15)) (P (Boolp (E (B False)))), "#t") , (If (If (P (Charp (E (C 'a')))) (P (Boolp (E (C 'b')))) (P (Intp (E (C 'c'))))) (E (I 119)) (E (I (-23))), "-23") , (If (If (If (P (Not (E (I 1)))) (P (Not (E (I 2)))) (P (Not (E (I 3))))) (E (I 4)) (E (I 5))) (E (I 6)) (E (I 7)), "6") , (If (P (Not (If (If (P (Not (E (I 1)))) (P (Not (E (I 2)))) (P (Not (E (I 3))))) (E (I 4)) (E (I 5))))) (E (I 6)) (E (I 7)), "7") , (P (Not (If (P (Not (If (If (P (Not (E (I 1)))) (P (Not (E (I 2)))) (P (Not (E (I 3))))) (E (I 4)) (E (I 5))))) (E (I 6)) (E (I 6)))), "#f") , (If (P (Charp (E (I 12)))) (E (I 13)) (E (I 14)), "14") , (If (P (Charp (E (C 'a')))) (E (I 13)) (E (I 14)), "13") , (P (Add1 (If (P (Sub1 (E (I 1)))) (P (Sub1 (E (I 13)))) (E (I 14)))), "13") , (If (P (Eqp (E (I 12)) (E (I 13)))) (E (I 12)) (E (I 13)), "13") , (If (P (Eqp (E (I 12)) (E (I 12)))) (E (I 13)) (E (I 14)), "13") , (If (P (LessThan (E (I 12)) (E (I 13)))) (E (I 12)) (E (I 13)), "12") , (If (P (LessThan (E (I 12)) (E (I 12)))) (E (I 13)) (E (I 14)), "14") , (If (P (LessThan (E (I 13)) (E (I 12)))) (E (I 13)) (E (I 14)), "14") , (If (P (LessThanEq (E (I 12)) (E (I 13)))) (E (I 12)) (E (I 13)), "12") , (If (P (LessThanEq (E (I 12)) (E (I 12)))) (E (I 12)) (E (I 13)), "12") , (If (P (LessThanEq (E (I 13)) (E (I 12)))) (E (I 13)) (E (I 14)), "14") , (If (P (GreaterThan (E (I 12)) (E (I 13)))) (E (I 12)) (E (I 13)), "13") , (If (P (GreaterThan (E (I 12)) (E (I 12)))) (E (I 12)) (E (I 13)), "13") , (If (P (GreaterThan (E (I 13)) (E (I 12)))) (E (I 13)) (E (I 14)), "13") , (If (P (GreaterThanEq (E (I 12)) (E (I 13)))) (E (I 12)) (E (I 13)), "13") , (If (P (GreaterThanEq (E (I 12)) (E (I 12)))) (E (I 12)) (E (I 13)), "12") , (If (P (GreaterThanEq (E (I 13)) (E (I 12)))) (E (I 13)) (E (I 14)), "13") ] addtest :: [(Program, String)] addtest = map exprToProg $ [ (P (Add (E (I 1)) (E (I 2))), "3") , (P (Add (E (I 1)) (E (I (-2)))), "-1") , (P (Add (E (I (-1))) (E (I 2))), "1") , (P (Add (E (I (-1))) (E (I (-2)))), "-3") , (P (Add (E (I (2^61-1))) (E (I (-1)))), show $ 2^61-2) , (P (Add (E (I (2^61-2))) (E (I 1))), show $ 2^61-1) , (P (Add (E (I (-(2^61)))) (E (I 1))), show $ -(2^61-1)) , (P (Add (E (I (-(2^61-1)))) (E (I (-1)))), show $ -(2^61)) , (P (Add (E (I ((2^61-1)))) (E (I (-(2^61))))), "-1") , (P (Add (E (I 1)) (P (Add (E (I 2)) (E (I 3))))), "6") , (P (Add (E (I 1)) (P (Add (E (I 2)) (E (I (-3)))))), "0") , (P (Add (E (I 1)) (P (Add (E (I (-2))) (E (I 3))))), "2") , (P (Add (E (I 1)) (P (Add (E (I (-2))) (E (I (-3)))))), "-4") , (P (Add (E (I (-1))) (P (Add (E (I 2)) (E (I 3))))), "4") , (P (Add (E (I (-1))) (P (Add (E (I 2)) (E (I (-3)))))), "-2") , (P (Add (E (I (-1))) (P (Add (E (I (-2))) (E (I 3))))), "0") , (P (Add (E (I (-1))) (P (Add (E (I (-2))) (E (I (-3)))))), "-6") , (P (Add (P (Add (E (I 1)) (E (I 2)))) (E (I 3))), "6") , (P (Add (P (Add (E (I 1)) (E (I 2)))) (E (I (-3)))), "0") , (P (Add (P (Add (E (I 1)) (E (I (-2))))) (E (I 3))), "2") , (P (Add (P (Add (E (I 1)) (E (I (-2))))) (E (I (-3)))), "-4") , (P (Add (P (Add (E (I (-1))) (E (I 2)))) (E (I 3))), "4") , (P (Add (P (Add (E (I (-1))) (E (I 2)))) (E (I (-3)))), "-2") , (P (Add (P (Add (E (I (-1))) (E (I (-2))))) (E (I 3))), "0") , (P (Add (P (Add (E (I (-1))) (E (I (-2))))) (E (I (-3)))), "-6") , (P (Add (P (Add (P (Add (P (Add (P (Add (P (Add (P (Add (P (Add (E (I 1)) (E (I 2)))) (E (I 3)))) (E (I 4)))) (E (I 5)))) (E (I 6)))) (E (I 7)))) (E (I 8)))) (E (I 9))), "45") , (P (Add (E (I 1)) (P (Add (E (I 2)) (P (Add (E (I 3)) (P (Add (E (I 4)) (P (Add (E (I 5)) (P (Add (E (I 6)) (P (Add (E (I 7)) (P (Add (E (I 8)) (E (I 9))))))))))))))))), "45") ] subtest :: [(Program, String)] subtest = map exprToProg $ [ (P (Sub (E (I 1)) (E (I 2))), "-1") , (P (Sub (E (I 1)) (E (I (-2)))), "3") , (P (Sub (E (I (-1))) (E (I 2))), "-3") , (P (Sub (E (I (-1))) (E (I (-2)))), "1") , (P (Sub (E (I (2^61-2))) (E (I (-1)))), show $ 2^61-1) , (P (Sub (E (I (2^61-1))) (E (I 1))), show $ 2^61-2) , (P (Sub (E (I (-(2^61-1)))) (E (I 1))), show $ -(2^61)) , (P (Sub (E (I (-(2^61)))) (E (I (-1)))), show $ -(2^61-1)) , (P (Sub (E (I 1)) (E (I (2^61-1)))), show $ -(2^61-2)) , (P (Sub (E (I (-1))) (E (I (2^61-1)))), show $ -(2^61)) , (P (Sub (E (I 1)) (E (I (-(2^61-2))))), show $ 2^61-1) , (P (Sub (E (I (-1))) (E (I (-(2^61))))), show $ (2^61-1)) , (P (Sub (E (I (2^61-1))) (E (I (2^61-1)))), "0") , (P (Sub (E (I (-(2^61-1)))) (E (I (-(2^61))))), "1") , (P (Sub (E (I 1)) (P (Sub (E (I 2)) (E (I 3))))), "2") , (P (Sub (E (I 1)) (P (Sub (E (I 2)) (E (I (-3)))))), "-4") , (P (Sub (E (I 1)) (P (Sub (E (I (-2))) (E (I 3))))), "6") , (P (Sub (E (I 1)) (P (Sub (E (I (-2))) (E (I (-3)))))), "0") , (P (Sub (E (I (-1))) (P (Sub (E (I 2)) (E (I 3))))), "0") , (P (Sub (E (I (-1))) (P (Sub (E (I 2)) (E (I (-3)))))), "-6") , (P (Sub (E (I (-1))) (P (Sub (E (I (-2))) (E (I 3))))), "4") , (P (Sub (E (I (-1))) (P (Sub (E (I (-2))) (E (I (-3)))))), "-2") , (P (Sub (E (I 0)) (P (Sub (E (I (-2))) (E (I (-3)))))), "-1") , (P (Sub (P (Sub (E (I 1)) (E (I 2)))) (E (I 3))), "-4") , (P (Sub (P (Sub (E (I 1)) (E (I 2)))) (E (I (-3)))), "2") , (P (Sub (P (Sub (E (I 1)) (E (I (-2))))) (E (I 3))), "0") , (P (Sub (P (Sub (E (I 1)) (E (I (-2))))) (E (I (-3)))), "6") , (P (Sub (P (Sub (E (I (-1))) (E (I 2)))) (E (I 3))), "-6") , (P (Sub (P (Sub (E (I (-1))) (E (I 2)))) (E (I (-3)))), "0") , (P (Sub (P (Sub (E (I (-1))) (E (I (-2))))) (E (I 3))), "-2") , (P (Sub (P (Sub (E (I (-1))) (E (I (-2))))) (E (I (-3)))), "4") , (P (Sub (P (Sub (P (Sub (P (Sub (P (Sub (P (Sub (P (Sub (P (Sub (E (I 1)) (E (I 2)))) (E (I 3)))) (E (I 4)))) (E (I 5)))) (E (I 6)))) (E (I 7)))) (E (I 8)))) (E (I 9))), "-43") , (P (Sub (E (I 1)) (P (Sub (E (I 2)) (P (Sub (E (I 3)) (P (Sub (E (I 4)) (P (Sub (E (I 5)) (P (Sub (E (I 6)) (P (Sub (E (I 7)) (P (Sub (E (I 8)) (E (I 9))))))))))))))))), "5") ] multest :: [(Program, String)] multest = map exprToProg $ [ (P (Mul (E (I 2)) (E (I 3))), "6") , (P (Mul (E (I 2)) (E (I (-3)))), "-6") , (P (Mul (E (I (-2))) (E (I 3))), "-6") , (P (Mul (E (I (-2))) (E (I (-3)))), "6") , (P (Mul (E (I (2^61-1))) (E (I 1))), show $ 2^61-1) , (P (Mul (E (I (2^61-1))) (E (I (-1)))), show $ -(2^61-1)) , (P (Mul (E (I (-(2^61)))) (E (I 1))), show $ -(2^61)) , (P (Mul (E (I (-(2^61-1)))) (E (I (-1)))), show $ (2^61-1)) , (P (Mul (E (I 2)) (P (Mul (E (I 3)) (E (I 4))))), "24") , (P (Mul (P (Mul (E (I 2)) (E (I 3)))) (E (I 4))), "24") , (P (Mul (P (Mul (P (Mul (P (Mul (P (Mul (E (I 2)) (E (I 3)))) (E (I 4)))) (E (I 5)))) (E (I 6)))) (E (I 7))), "5040") , (P (Mul (E (I 2)) (P (Mul (E (I 3)) (P (Mul (E (I 4)) (P (Mul (E (I 5)) (P (Mul (E (I 6)) (E (I 7))))))))))), "5040") ] andortest :: [(Program, String)] andortest = map exprToProg $ [ (P (LogOr (E (I 3)) (E (I 16))), "19") , (P (LogOr (E (I 3)) (E (I 5))), "7") , (P (LogOr (E (I 3)) (E (I 7))), "7") , (P (LogNot (P (LogOr (P (LogNot (E (I 7)))) (E (I 1))))), "6") , (P (LogNot (P (LogOr (E (I 1)) (P (LogNot (E (I 7))))))), "6") , (P (LogAnd (E (I 3)) (E (I 7))), "3") , (P (LogAnd (E (I 3)) (E (I 5))), "1") , (P (LogAnd (E (I 2346)) (P (LogNot (E (I 2346))))), "0") , (P (LogAnd (P (LogNot (E (I 2346)))) (E (I 2346))), "0") , (P (LogAnd (E (I 2376)) (E (I 2376))), "2376") ] eqptest :: [(Program, String)] eqptest = map exprToProg $ [ (P (Eqp (E (I 12)) (E (I 13))), "#f") , (P (Eqp (E (I 12)) (E (I 12))), "#t") , (P (Eqp (E (I 16)) (P (Add (E (I 13)) (E (I 3))))), "#t") , (P (Eqp (E (I 16)) (P (Add (E (I 13)) (E (I 13))))), "#f") , (P (Eqp (P (Add (E (I 13)) (E (I 3)))) (E (I 16))), "#t") , (P (Eqp (P (Add (E (I 13)) (E (I 13)))) (E (I 16))), "#f") ] lessthantest :: [(Program, String)] lessthantest = map exprToProg $ [ (P (LessThan (E (I 12)) (E (I 13))), "#t") , (P (LessThan (E (I 12)) (E (I 12))), "#f") , (P (LessThan (E (I 13)) (E (I 12))), "#f") , (P (LessThan (E (I 16)) (P (Add (E (I 13)) (E (I 1))))), "#f") , (P (LessThan (E (I 16)) (P (Add (E (I 13)) (E (I 3))))), "#f") , (P (LessThan (E (I 16)) (P (Add (E (I 13)) (E (I 13))))), "#t") , (P (LessThan (P (Add (E (I 13)) (E (I 1)))) (E (I 16))), "#t") , (P (LessThan (P (Add (E (I 13)) (E (I 3)))) (E (I 16))), "#f") , (P (LessThan (P (Add (E (I 13)) (E (I 13)))) (E (I 16))), "#f") ] greaterthantest :: [(Program, String)] greaterthantest = map exprToProg $ [ (P (GreaterThan (E (I 12)) (E (I 13))), "#f") , (P (GreaterThan (E (I 12)) (E (I 12))), "#f") , (P (GreaterThan (E (I 13)) (E (I 12))), "#t") , (P (GreaterThan (E (I 16)) (P (Add (E (I 13)) (E (I 1))))), "#t") , (P (GreaterThan (E (I 16)) (P (Add (E (I 13)) (E (I 3))))), "#f") , (P (GreaterThan (E (I 16)) (P (Add (E (I 13)) (E (I 13))))), "#f") , (P (GreaterThan (P (Add (E (I 13)) (E (I 1)))) (E (I 16))), "#f") , (P (GreaterThan (P (Add (E (I 13)) (E (I 3)))) (E (I 16))), "#f") , (P (GreaterThan (P (Add (E (I 13)) (E (I 13)))) (E (I 16))), "#t") ] lessthaneqtest :: [(Program, String)] lessthaneqtest = map exprToProg $ [ (P (LessThanEq (E (I 12)) (E (I 13))), "#t") , (P (LessThanEq (E (I 12)) (E (I 12))), "#t") , (P (LessThanEq (E (I 13)) (E (I 12))), "#f") , (P (LessThanEq (E (I 16)) (P (Add (E (I 13)) (E (I 1))))), "#f") , (P (LessThanEq (E (I 16)) (P (Add (E (I 13)) (E (I 3))))), "#t") , (P (LessThanEq (E (I 16)) (P (Add (E (I 13)) (E (I 13))))), "#t") , (P (LessThanEq (P (Add (E (I 13)) (E (I 1)))) (E (I 16))), "#t") , (P (LessThanEq (P (Add (E (I 13)) (E (I 3)))) (E (I 16))), "#t") , (P (LessThanEq (P (Add (E (I 13)) (E (I 13)))) (E (I 16))), "#f") ] greaterthaneqtest :: [(Program, String)] greaterthaneqtest = map exprToProg $ [ (P (GreaterThanEq (E (I 12)) (E (I 13))), "#f") , (P (GreaterThanEq (E (I 12)) (E (I 12))), "#t") , (P (GreaterThanEq (E (I 13)) (E (I 12))), "#t") , (P (GreaterThanEq (E (I 16)) (P (Add (E (I 13)) (E (I 1))))), "#t") , (P (GreaterThanEq (E (I 16)) (P (Add (E (I 13)) (E (I 3))))), "#t") , (P (GreaterThanEq (E (I 16)) (P (Add (E (I 13)) (E (I 13))))), "#f") , (P (GreaterThanEq (P (Add (E (I 13)) (E (I 1)))) (E (I 16))), "#f") , (P (GreaterThanEq (P (Add (E (I 13)) (E (I 3)))) (E (I 16))), "#t") , (P (GreaterThanEq (P (Add (E (I 13)) (E (I 13)))) (E (I 16))), "#t") ] divtest :: [(Program, String)] divtest = map exprToProg $ [ (P (Div (E (I 2)) (E (I 3))), "0") , (P (Div (E (I 2)) (E (I (-3)))), "0") , (P (Div (E (I (-(2^61)))) (E (I 1))), show $ -(2^61)) , (P (Div (E (I (-(2^61-1)))) (E (I (-1)))), show $ (2^61-1)) , (P (Div (E (I 8)) (P (Div (E (I 32)) (E (I 16))))), "4") , (P (Div (P (Div (E (I 32)) (E (I 4)))) (E (I 2))), "4") , (P (Div (P (Div (P (Div (P (Div (P (Div (E (I 5040)) (E (I 2)))) (E (I 3)))) (E (I 4)))) (E (I 5)))) (E (I 6))), "7") ] lettest :: [(Program, String)] lettest = map exprToProg $ [ (Let [("x", (E (I 5)))] (Var "x"), "5") , (Let [("x", (P (Add (E (I 1)) (E (I 2)))))] (Var "x"), "3") , (Let [("x", (P (Add (E (I 1)) (E (I 2)))))] (Let [("y", (P (Add (E (I 3)) (E (I 4)))))] (P (Add (Var "x") (Var "y")))), "10") , (Let [("x", (P (Add (E (I 1)) (E (I 2)))))] (Let [("y", (P (Add (E (I 3)) (E (I 4)))))] (P (Sub (Var "y") (Var "x")))), "4") , (Let [ ("x", (P (Add (E (I 1)) (E (I 2))))) , ("y", (P (Add (E (I 3)) (E (I 4))))) ] (P (Sub (Var "y") (Var "x"))), "4") , (Let [ ("x", Let [ ("y", (P (Add (E (I 1)) (E (I 2)))))] (P (Mul (Var "y") (Var "y")))) ] (P (Add (Var "x") (Var "x"))), "18") , (Let [ ("x", (P (Add (E (I 1)) (E (I 2))))) ] (Let [ ("x", (P (Add (E (I 3)) (E (I 4))))) ] (Var "x")), "7") , (Let [("t", (Let [("t", (Let [("t", (Let [("t", (P (Add (E (I 1)) (E (I 2)))))] (Var "t")))] (Var "t")))] (Var "t")))] (Var "t"), "3") , (Let [("x", (E (I 12)))] (Let [("x", (P (Add (Var "x") (Var "x"))))] (Let [("x", (P (Add (Var "x") (Var "x"))))] (Let [("x", (P (Add (Var "x") (Var "x"))))] (P (Add (Var "x") (Var "x")))))), "192") ] proctest :: [(Program, String)] proctest = [ (Letrec [] (E (I 12)), "12") , (Letrec [] (Let [("x", (E (I 5)))] (P (Add (Var "x") (Var "x")))), "10") , (Letrec [("f", (Lambda [] (E (I 5))))] (E (I 7)), "7") , (Letrec [("f", (Lambda [] (E (I 5))))] (Let [("x", (E (I 12)))] (Var "x")), "12") , (Letrec [("f", (Lambda [] (E (I 5))))] (App "f" []), "5") , (Letrec [("f", (Lambda [] (E (I 5))))] (Let [("x", (App "f" []))] (Var "x")), "5") , (Letrec [("f", (Lambda [] (E (I 5))))] (P (Add (App "f" []) (E (I 6)))), "11") , (Letrec [("f", (Lambda [] (E (I 5))))] (P (Sub (E (I 20)) (App "f" []))), "15") , (Letrec [("f", (Lambda [] (E (I 5))))] (P (Add (App "f" []) (App "f" []))), "10") , (Letrec [("f", (Lambda [] (P (Add (E (I 5)) (E (I 7)))))) ,("g", (Lambda [] (E (I 13))))] (P (Add (App "f" []) (App "g" []))), "25") , (Letrec [("f", (Lambda ["x"] (P (Add (Var "x") (E (I 12))))))] (App "f" [(E (I 13))]), "25") , (Letrec [("f", (Lambda ["x"] (P (Add (Var "x") (E (I 12))))))] (App "f" [(App "f" [(E (I 10))])]), "34") , (Letrec [("f", (Lambda ["x"] (P (Add (Var "x") (E (I 12))))))] (App "f" [(App "f" [(App "f" [(E (I 0))])])]), "36") , (Letrec [("f", (Lambda ["x", "y"] (P (Add (Var "x") (Var "y"))))) ,("g", (Lambda ["x"] (P (Add (Var "x") (E (I 12))))))] (App "f" [(E (I 16)) ,(App "f" [(App "g" [(E (I 0))]) ,(P (Add (E (I 1)) (App "g" [(E (I 0))])))])]) , "41") , (Letrec [("f", (Lambda ["x"] (If (P (Zerop (Var "x"))) (E (I 1)) (P (Mul (Var "x") (App "f" [P (Sub1 (Var "x"))]))))))] (App "f" [E (I 5)]), "120") , (Letrec [("e", (Lambda ["x"] (If (P (Zerop (Var "x"))) (E (B True)) (App "o" [(P (Sub1 (Var "x")))])))) ,("o", (Lambda ["x"] (If (P (Zerop (Var "x"))) (E (B False)) (App "e" [(P (Sub1 (Var "x")))]))))] (App "e" [E (I (25))]), "#f") ] -- can't yet handle this one, need tail call nestedproc :: [(Program, String)] nestedproc = [ (Letrec [("sum", Lambda ["n","ac"] (If (P (Zerop (Var "n"))) (Var "ac") (App "sum" [(P (Sub1 (Var "n"))), (P (Add (Var "n") (Var "ac")))])))] (App "sum" [(E (I 1000000)), (E (I 0))]), "500000500000") , (Letrec [("e", (Lambda ["x"] (If (P (Zerop (Var "x"))) (E (B True)) (App "o" [(P (Sub1 (Var "x")))])))) ,("o", (Lambda ["x"] (If (P (Zerop (Var "x"))) (E (B False)) (App "e" [(P (Sub1 (Var "x")))]))))] (App "e" [E (I 5000000)]), "#f") ] allTests :: [(Program, String)] allTests = integers ++ immediateConstants ++ add1 ++ sub1 ++ charConvert ++ intp ++ zerop ++ nullp ++ boolp ++ charp ++ nottest ++ intnot ++ addtest ++ subtest ++ multest ++ andortest ++ divtest ++ eqptest ++ lessthantest ++ greaterthantest ++ lessthaneqtest ++ greaterthaneqtest ++ iftest ++ lettest ++ proctest