% $Id: BoundVarIdsTest.oz,v 1.9 2011/04/15 15:53:36 leavens Exp leavens $ % AUTHOR: Gary T. Leavens \insert 'BoundVarIds.oz' \insert 'TestingNoStop.oz' %% from the course library \insert 'CommaSeparate.oz' %% From homework 3 declare % A helping procedure to eliminate repitition in the testing below proc {BVTest Message AST IdList} {System.showInfo "BV(" # Message # ") = {" # {CommaSeparate IdList} # "}"} {Assert {Equal {BoundVarIds AST} {AsSet IdList}}} end {StartTesting 'BoundVarIds'} {BVTest "skip" skipStmt nil} {BVTest "local A in skip end" localStmt("A" skipStmt) nil} {BVTest "A = B" assignStmt("A" varIdExp("B")) nil} {BVTest "A = 3" assignStmt("A" numExp(3)) nil} {BVTest "A = 3 B = C" seqStmt([assignStmt("A" numExp(3)) assignStmt("B" varIdExp("C"))]) nil} {BVTest "A = 3 B = C E = A" seqStmt([assignStmt("A" numExp(3)) assignStmt("B" varIdExp("C")) assignStmt("E" varIdExp("A"))]) nil} {BVTest "if B then skip else skip end" ifStmt(varIdExp("B") skipStmt skipStmt) nil} {BVTest "if true then R = true else S = false end" ifStmt(boolExp(true) assignStmt("R" boolExp(true)) assignStmt("S" boolExp(false))) nil } {BVTest "if 3 then skip else skip end" ifStmt(numExp(3) skipStmt skipStmt) nil} {BVTest "if 3 then A = B else skip end" ifStmt(numExp(3) assignStmt("A" varIdExp("B")) skipStmt) nil} {BVTest "if X then A = B else skip end" ifStmt(varIdExp("X") assignStmt("A" varIdExp("B")) skipStmt) nil} {BVTest "if X then A = B else D = Z end" ifStmt(varIdExp("X") assignStmt("A" varIdExp("B")) assignStmt("D" varIdExp("Z"))) nil} {BVTest "local A in A = B end" localStmt("A" assignStmt("A" varIdExp("B"))) ["A"]} {BVTest "local A in A = 3 end" localStmt("A" assignStmt("A" numExp(3))) ["A"]} {BVTest "local A in A = A end" localStmt("A" assignStmt("A" varIdExp("A"))) ["A"]} {BVTest "local A in B = C end" localStmt("A" assignStmt("B" varIdExp("C"))) nil} {BVTest "case C of ok then skip else skip end" caseStmt(varIdExp("C") atomPat(ok) skipStmt skipStmt) nil} {BVTest "case C of X then skip else skip end" caseStmt(varIdExp("C") varIdPat("X") skipStmt skipStmt) nil} {BVTest "case C of X then B = X else skip end" caseStmt(varIdExp("C") varIdPat("X") assignStmt("B" varIdExp("X")) skipStmt) ["X"]} {BVTest "case C of X then B = X else D = 7 end" caseStmt(varIdExp("C") varIdPat("X") assignStmt("B" varIdExp("X")) assignStmt("D" numExp(7))) ["X"]} {BVTest "case C of nowXisFree then B = X else D = 7 end" caseStmt(varIdExp("C") atomPat(nowXisFree) assignStmt("B" varIdExp("X")) assignStmt("D" numExp(7))) nil} {BVTest "case C of Q then B = X else Z = Q end" caseStmt(varIdExp("C") varIdPat("Q") assignStmt("B" varIdExp("X")) assignStmt("Z" varIdExp("Q"))) nil} {BVTest "case C of foo() then B = X else D = 7 end" caseStmt(varIdExp("C") recordPat(foo nil) assignStmt("B" varIdExp("X")) assignStmt("D" numExp(7))) nil} {BVTest "case C of foo(X Y) then B = X else D = Y end" caseStmt(varIdExp("C") recordPat(foo [posFld(varIdExp("X")) posFld(varIdExp("Y"))]) assignStmt("B" varIdExp("X")) assignStmt("D" varIdExp("Y"))) ["X"]} {BVTest "case C of foo(f1:X f2:Y) then B = X else D = Y end" caseStmt(varIdExp("C") recordPat(foo [colonFld(f1 varIdExp("X")) colonFld(f2 varIdExp("Y"))]) assignStmt("B" varIdExp("X")) assignStmt("D" varIdExp("Y"))) ["X"]} {BVTest "case C of foo(f1:bar(f2:X f3:Y f4:Z))" # " then B = X if Z then D = Y else skip end" # " else skip end" caseStmt(varIdExp("C") recordPat(foo [colonFld(f1 recordExp(atomExp(bar) [colonFld(f2 varIdExp("X")) colonFld(f3 varIdExp("Y")) colonFld(f4 varIdExp("Z"))]))]) seqStmt([assignStmt("B" varIdExp("X")) ifStmt(varIdExp("Z") assignStmt("D" varIdExp("Y")) skipStmt)]) skipStmt) ["X" "Y" "Z"]} {BVTest "case C of foo(f1:bar(f2:X f3:Y f4:Q))" # " then B = X if Z then D = Y else skip end" # " else skip end" caseStmt(varIdExp("C") recordPat(foo [colonFld(f1 recordExp(atomExp(bar) [colonFld(f2 varIdExp("X")) colonFld(f3 varIdExp("Y")) colonFld(f4 varIdExp("Q"))]))]) seqStmt([assignStmt("B" varIdExp("X")) ifStmt(varIdExp("Z") assignStmt("D" varIdExp("Y")) skipStmt)]) skipStmt) ["X" "Y"]} {BVTest "{P}" applyStmt(varIdExp("P") nil) nil} {BVTest "{Browse 3}" applyStmt(varIdExp("Browse") [numExp(3)]) nil} {BVTest "{Map Ls F}" applyStmt(varIdExp("Map") [varIdExp("Ls") varIdExp("F")]) nil} {BVTest "{Map 3|nil F}" applyStmt(varIdExp("Map") [recordExp(atomExp('|') [posFld(numExp(3)) posFld(atomExp(nil))]) varIdExp("F")]) nil} {BVTest "{Map 3|nil proc {$ X R} {Browse X} R = X end}" applyStmt(varIdExp("Map") [recordExp(atomExp('|') [posFld(numExp(3)) posFld(atomExp(nil))]) procExp([varIdPat("X") varIdPat("R")] seqStmt([applyStmt(varIdExp("Browse") [varIdExp("X")]) assignStmt("R" varIdExp("X"))]))]) ["X" "R"]} {BVTest "{Map 3|nil proc {$ X R} {Browse X} R = Y end}" applyStmt(varIdExp("Map") [recordExp(atomExp('|') [posFld(numExp(3)) posFld(atomExp(nil))]) procExp([varIdPat("X") varIdPat("R")] seqStmt([applyStmt(varIdExp("Browse") [varIdExp("X")]) assignStmt("R" varIdExp("Y"))]))]) ["X" "R"]} {BVTest "Three = proc {$ R} R = 3 end" assignStmt("Three" procExp([varIdPat("R")] assignStmt("R" numExp(3)))) ["R"]} {BVTest "fun {Three} 3 end" namedFunStmt("Three" nil numExp(3)) nil} {BVTest "fun {Add X Y} {Plus X Y} end" namedFunStmt("Add" [varIdPat("X") varIdPat("Y")] applyExp(varIdExp("Plus") [varIdExp("X") varIdExp("Y")])) ["X" "Y"]} {BVTest "fun {Add X Y} {Plus X X Z} end" namedFunStmt("Add" [varIdPat("X") varIdPat("Y")] applyExp(varIdExp("Plus") [varIdExp("X") varIdExp("X") varIdExp("Z")])) ["X"]} {BVTest "fun {F X} proc {$ F R} R = {F A} end end" namedFunStmt("F" [varIdPat("X")] procExp([varIdPat("F") varIdPat("R")] assignStmt("R" applyExp(varIdExp("F") [varIdExp("A")])))) ["F" "R"]} {BVTest "InTest = proc {$ Tree R} node(X Y) = Tree in R = {Plus X Y} end" assignStmt("InTest" procExp([varIdPat("Tree") varIdPat("R")] inStmt(recordPat(node [posFld(varIdExp("X")) posFld(varIdExp("Y"))]) varIdExp("Tree") assignStmt("R" applyExp(varIdExp("Plus") [varIdExp("X") varIdExp("Y")]))))) ["Tree" "R" "X" "Y"]} {BVTest "fun {First X#Y} X end" namedFunStmt("First" [recordPat('#' [posFld(varIdExp("X")) posFld(varIdExp("Y"))])] varIdExp("X")) ["X"]} {BVTest "fun {RevPair X#Y} Y#X end" namedFunStmt("RevPair" [recordPat('#' [posFld(varIdExp("X")) posFld(varIdExp("Y"))])] recordExp(atomExp('#') [posFld(varIdExp("Y")) posFld(varIdExp("X"))])) ["X" "Y"]} {BVTest "fun {RevPair P} case P of X#Y then Y#X else error end end" namedFunStmt("RevPair" [varIdPat("P")] caseExp(varIdExp("P") recordPat('#' [posFld(varIdExp("X")) posFld(varIdExp("Y"))]) recordExp(atomExp('#') [posFld(varIdExp("Y")) posFld(varIdExp("X"))]) atomExp(error))) ["P" "X" "Y"]} {BVTest "fun {FirstOnly P} case P of Q then X else Q end end" namedFunStmt("FirstOnly" [varIdPat("P")] caseExp(varIdExp("P") varIdPat("Q") varIdExp("X") varIdExp("Q"))) ["P"]} {BVTest "fun {T N} if {Odd N} then {Div {Plus {Mult 3 N} 1} 2}" # " else {Div N 2} end end" namedFunStmt("T" [varIdPat("N")] ifExp(applyExp(varIdExp("Odd") [varIdExp("N")]) applyExp(varIdExp("Div") [applyExp(varIdExp("Plus") [applyExp(varIdExp("Mult") [numExp(3) varIdExp("N")]) numExp(1)]) numExp(2)]) applyExp(varIdExp("Div") [varIdExp("N") numExp(2)]))) ["N"]} local ParsedFigExample = % (Figure 2 of homework 3a) namedFunStmt("AddToEach" [recordPat('#' [posFld(varIdExp("A")) posFld(varIdExp("B"))]) varIdPat("Ls")] caseExp(varIdExp("Ls") recordPat('|' [posFld(recordExp(atomExp('#') [posFld(varIdExp("X")) posFld(varIdExp("Y"))])) posFld(varIdExp("T"))]) recordExp(atomExp('|') [posFld(recordExp(atomExp('#') [posFld(applyExp(varIdExp("Plus") [varIdExp("A") varIdExp("X")])) posFld(applyExp(varIdExp("Plus") [varIdExp("B") varIdExp("Y")]))])) posFld(applyExp(varIdExp("AddToEach") [recordExp(atomExp('#') [posFld(varIdExp("A")) posFld(varIdExp("B"))]) varIdExp("T")]))]) atomExp(nil))) in {BVTest "fun {AddToEach A#B Ls}" # " case Ls of X#Y|T then {Plus A X}#{Plus B Y}|{AddToEach A#B T}" # " else nil end" # " end" ParsedFigExample ["A" "B" "Ls" "X" "Y" "T"]} end {BVTest "thread X = proc {$ Z} Z = 3 end end" threadStmt(assignStmt("X" procExp([varIdPat("Z")] assignStmt("Z" numExp(3))))) ["Z"]} {BVTest "X = thread proc {$ Z} Z = 3 end end" assignStmt("X" threadExp(procExp([varIdPat("Z")] assignStmt("Z" numExp(3))))) ["Z"]} {StartTesting done}