% $Id: UnparseTest.oz,v 1.14 2012/01/17 11:50:53 leavens Exp leavens $ % AUTHOR: Gary T. Leavens \insert 'Unparse.oz' \insert 'TestingNoStop.oz' %% from the course library declare % A helping procedure to eliminate repitition in the testing below proc {UPTest Expected AST} {TestString {UnparseToString program([seqQuery(AST)])} '==' {VirtualString.toString Expected}} end proc {UPProgTest Expected AST} {TestString {UnparseToString AST} '==' {VirtualString.toString Expected}} end {StartTesting 'UnparseTest $Revision: 1.14 $'} {UPTest "skip" skipStmt } {UPTest "local A in skip end" localStmt(varId('A') skipStmt) } {UPTest "A = B" unifyStmt(varId('A') varId('B')) } {UPTest "A = 3" unifyStmt(varId('A') intLit(3)) } {UPTest "A = 3 B = C" seqStmt([unifyStmt(varId('A') intLit(3)) unifyStmt(varId('B') varId('C'))]) } {UPTest "A = 3 B = C E = A" seqStmt([unifyStmt(varId('A') intLit(3)) unifyStmt(varId('B') varId('C')) unifyStmt(varId('E') varId('A'))]) } {UPTest "if B then skip else skip end" ifStmt(varId('B') skipStmt skipStmt) } {UPTest "if true then R = true else R = false end" ifStmt(boolExp(true) unifyStmt(varId('R') boolExp(true)) unifyStmt(varId('R') boolExp(false))) } {UPTest "if 3 then skip else skip end" ifStmt(intLit(3) skipStmt skipStmt) } {UPTest "if 3 then A = B else skip end" ifStmt(intLit(3) unifyStmt(varId('A') varId('B')) skipStmt) } {UPTest "if X then A = B else skip end" ifStmt(varId('X') unifyStmt(varId('A') varId('B')) skipStmt) } {UPTest "if X then A = B else D = Z end" ifStmt(varId('X') unifyStmt(varId('A') varId('B')) unifyStmt(varId('D') varId('Z'))) } {UPTest "local A in A = B end" localStmt(varId('A') unifyStmt(varId('A') varId('B'))) } {UPTest "local A in A = 3 end" localStmt(varId('A') unifyStmt(varId('A') intLit(3))) } {UPTest "local A in A = A end" localStmt(varId('A') unifyStmt(varId('A') varId('A'))) } {UPTest "local A in B = C end" localStmt(varId('A') unifyStmt(varId('B') varId('C'))) } {UPTest "case C of ok then skip else skip end" caseStmt(varId('C') atomPat(ok) skipStmt skipStmt) } {UPTest "case C of X then skip else skip end" caseStmt(varId('C') varIdPat('X') skipStmt skipStmt) } {UPTest "case C of X then B = X else skip end" caseStmt(varId('C') varIdPat('X') unifyStmt(varId('B') varId('X')) skipStmt) } {UPTest "case C of X then B = X else D = 7 end" caseStmt(varId('C') varIdPat('X') unifyStmt(varId('B') varId('X')) unifyStmt(varId('D') intLit(7))) } {UPTest "case C of nowXisFree then B = X else D = 7 end" caseStmt(varId('C') atomPat(nowXisFree) unifyStmt(varId('B') varId('X')) unifyStmt(varId('D') intLit(7))) } {UPTest "case C of Q then B = X else Z = Q end" caseStmt(varId('C') varIdPat('Q') unifyStmt(varId('B') varId('X')) unifyStmt(varId('Z') varId('Q'))) } {UPTest "case C of foo() then B = X else D = 7 end" caseStmt(varId('C') recordPat(atomExp(foo) nil) unifyStmt(varId('B') varId('X')) unifyStmt(varId('D') intLit(7))) } {UPTest "case C of foo(1:X 2:Y) then B = X else D = Y end" caseStmt(varId('C') recordPat(atomExp(foo) [posFld(varIdPat('X')) posFld(varIdPat('Y'))]) unifyStmt(varId('B') varId('X')) unifyStmt(varId('D') varId('Y'))) } {UPTest "case C of foo(f1:X f2:Y) then B = X else D = Y end" caseStmt(varId('C') recordPat(atomExp(foo) [colonFld(atomExp(f1) varIdPat('X')) colonFld(atomExp(f2) varIdPat('Y'))]) unifyStmt(varId('B') varId('X')) unifyStmt(varId('D') varId('Y'))) } {UPTest "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(varId('C') recordPat(atomExp(foo) [colonFld(atomExp(f1) recordPat(atomExp(bar) [colonFld(atomExp(f2) varIdPat('X')) colonFld(atomExp(f3) varIdPat('Y')) colonFld(atomExp(f4) varIdPat('Z'))]))]) seqStmt([unifyStmt(varId('B') varId('X')) ifStmt(varId('Z') unifyStmt(varId('D') varId('Y')) skipStmt)]) skipStmt) } {UPTest "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(varId('C') recordPat(atomExp(foo) [colonFld(atomExp(f1) recordPat(atomExp(bar) [colonFld(atomExp(f2) varIdPat('X')) colonFld(atomExp(f3) varIdPat('Y')) colonFld(atomExp(f4) varIdPat('Q'))]))]) seqStmt([unifyStmt(varId('B') varId('X')) ifStmt(varId('Z') unifyStmt(varId('D') varId('Y')) skipStmt)]) skipStmt) } {UPTest "{P}" applyStmt(varId('P') nil) } {UPTest "{Browse 3}" applyStmt(varId('Browse') [intLit(3)]) } {UPTest "{Map Ls F}" applyStmt(varId('Map') [varId('Ls') varId('F')]) } {UPTest "{Map '|'(1:3 2:nil) F}" applyStmt(varId('Map') [recordExp(atomExp('|') [posFld(intLit(3)) posFld(atomExp(nil))]) varId('F')]) } {UPTest "{Map '|'(1:3 2:nil) proc {$ X R} {Browse X} R = X end}" applyStmt(varId('Map') [recordExp(atomExp('|') [posFld(intLit(3)) posFld(atomExp(nil))]) procExp([varIdPat('X') varIdPat("R")] seqStmt([applyStmt(varId('Browse') [varId('X')]) unifyStmt(varId('R') varId('X'))]))]) } {UPTest "{Map '|'(1:3 2:nil) proc {$ X R} {Browse X} R = Y end}" applyStmt(varId('Map') [recordExp(atomExp('|') [posFld(intLit(3)) posFld(atomExp(nil))]) procExp([varIdPat('X') varIdPat("R")] seqStmt([applyStmt(varId('Browse') [varId('X')]) unifyStmt(varId('R') varId('Y'))]))]) } {UPTest "Three = proc {$ R} R = 3 end" unifyStmt(varId('Three') procExp([varIdPat('R')] unifyStmt(varId('R') intLit(3)))) } {UPTest "fun {Three} 3 end" namedFunStmt('Three' nil intLit(3)) } {UPTest "fun {Add X Y} {Plus X Y} end" namedFunStmt('Add' [varIdPat('X') varIdPat("Y")] applyExp(varId('Plus') [varId('X') varId('Y')])) } {UPTest "fun {Add X Y} {Plus X X Z} end" namedFunStmt('Add' [varIdPat('X') varIdPat("Y")] applyExp(varId('Plus') [varId('X') varId('X') varId('Z')])) } {UPTest "fun {F X} proc {$ F R} R = {F A} end end" namedFunStmt('F' [varIdPat('X')] procExp([varIdPat("F") varIdPat("R")] unifyStmt(varId('R') applyExp(varId('F') [varId('A')])))) } {UPTest "InTest = proc {$ Tree R} node(1:X 2:Y) = Tree in R = {Plus X Y} end" unifyStmt(varId('InTest') procExp([varIdPat('Tree') varIdPat('R')] inStmt(recordPat(atomExp(node) [posFld(varIdPat('X')) posFld(varIdPat('Y'))]) varId('Tree') unifyStmt(varId('R') applyExp(varId('Plus') [varId('X') varId('Y')]))))) } {UPTest "fun {First '#'(1:X 2:Y)} X end" namedFunStmt('First' [recordPat(atomExp('#') [posFld(varIdPat('X')) posFld(varIdPat('Y'))])] varId('X')) } {UPTest "fun {RevPair '#'(1:X 2:Y)} '#'(1:Y 2:X) end" namedFunStmt('RevPair' [recordPat(atomExp('#') [posFld(varIdPat('X')) posFld(varIdPat('Y'))])] recordExp(atomExp('#') [posFld(varId('Y')) posFld(varId('X'))])) } {UPTest "fun {RevPair P} case P of '#'(1:X 2:Y) then '#'(1:Y 2:X) else error end end" namedFunStmt('RevPair' [varIdPat("P")] caseExp(varId('P') recordPat(atomExp('#') [posFld(varIdPat('X')) posFld(varIdPat('Y'))]) recordExp(atomExp('#') [posFld(varId('Y')) posFld(varId('X'))]) atomExp(error))) } {UPTest "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(varId('Odd') [varId('N')]) applyExp(varId('Div') [applyExp(varId('Plus') [applyExp(varId('Mult') [intLit(3) varId('N')]) intLit(1)]) intLit(2)]) applyExp(varId('Div') [varId('N') intLit(2)]))) } {UPTest "local X in X = thread 3 end end" localStmt(varId('X') unifyStmt(varId('X') threadExp(intLit(3))))} {UPTest "thread X = 3 end" threadStmt(unifyStmt(varId('X') intLit(3)))} declare ParsedFigExample = % (Figure 2 of homework 3a) namedFunStmt('AddToEach' [recordPat(atomExp('#') [posFld(varIdPat('A')) posFld(varIdPat('B'))]) varIdPat("Ls")] caseExp(varId('Ls') recordPat(atomExp('|') [posFld(recordPat(atomExp('#') [posFld(varIdPat('X')) posFld(varIdPat('Y'))])) posFld(varIdPat('T'))]) recordExp(atomExp('|') [posFld(recordExp(atomExp('#') [posFld(applyExp(varId('Plus') [varId('A') varId('X')])) posFld(applyExp(varId('Plus') [varId('B') varId('Y')]))])) posFld(applyExp(varId('AddToEach') [recordExp(atomExp('#') [posFld(varId('A')) posFld(varId('B'))]) varId('T')]))]) atomExp(nil))) {UPTest "fun {AddToEach '#'(1:A 2:B) Ls}" # " case Ls of '|'(1:'#'(1:X 2:Y) 2:T) then " # "'|'(1:'#'(1:{Plus A X} 2:{Plus B Y}) 2:{AddToEach '#'(1:A 2:B) T})" # " else nil end" # " end" ParsedFigExample } {UPProgTest "declare skip" program([declareQuery(seqStmt([skipStmt]))])} {UPProgTest "declare X = 1" program( [declareQuery(seqStmt([unifyStmt(varId('X') intLit(1))]))])} {UPProgTest "declare X = 1 Y = X" program( [declareQuery(seqStmt([unifyStmt(varId('X') intLit(1)) unifyStmt(varId('Y') varId('X'))]))])} {UPProgTest "declare X = 1 in Y = X" program( [declareInQuery(seqStmt([unifyStmt(varId('X') intLit(1))]) seqStmt([unifyStmt(varId('Y') varId('X'))]))])} {DoneTesting}