def test_stackmanipulation(self): a = ConstDom("r1 = 5 ; r2 = 7") push = ConstDom("", "push r1 ; r2") f = ConstDom("r1 = 0 ; r2 = 0") pop = ConstDom("", "pop r2 ; r1") self.assertEqual(str(push), "{ } [push r1 ; r2 ; ]") self.assertEqual(str(pop), "{ } [pop r2 ; r1 ; ]") incall = a.extend(push) self.assertEqual(str(incall), "{ r1 = 5 ; r2 = 7 ; } [push (5) ; (7) ; ]") incall2 = a.extend(push).extend(f) self.assertEqual(str(incall2), "{ r1 = 0 ; r2 = 0 ; } [push (5) ; (7) ; ]") totalexc = a.extend(push).extend(f).extend(pop) self.assertEqual(str(totalexc), "{ r1 = (5) ; r2 = (7) ; }")
def test_basicstack(self): a = ConstDom("r1 = 5 ; r2 = 7", "top") self.assertEqual(str(a), "{ r1 = 5 ; r2 = 7 ; } top") a = ConstDom("r1 = 5 ; r2 = 7", "") b = ConstDom("r1 = r1 + r2", "") push = ConstDom("", "push r1 ; r2") self.assertEqual(str(a.extend(b.extend(push))), "{ r1 = (5) + (7) ; r2 = 7 ; } [push ((5) + (7)) ; (7) ; ]") self.assertEqual(str(a.extend(b).extend(push)), "{ r1 = (5) + (7) ; r2 = 7 ; } [push ((5) + (7)) ; (7) ; ]") push1 = ConstDom("", "push r1") push2 = ConstDom("", "push r2") self.assertEqual(str(push1.extend(push2)), "{ } [push r1 ; r2 ; ]") pop1 = ConstDom("", "pop r1") pop2 = ConstDom("", "pop r2 ; r3") self.assertEqual(str(pop1.extend(pop2)), "{ } [pop r1 ; r2 ; r3 ; ]")
def test_1element(self): a = ConstDom("") o = a.one() #self.assertEqual(str(o), # "{ ONE }") a = ConstDom("r1 = 3") #test that one is neutral for extend b = a.extend(o) self.assertEqual(str(b), str(a)) b = o.extend(a) self.assertEqual(str(b), str(a))
def test_basicstack(self): a = ConstDom("r1 = 5 ; r2 = 7", "top") self.assertEqual(str(a), "{ r1 = 5 ; r2 = 7 ; } top") a = ConstDom("r1 = 5 ; r2 = 7", "") b = ConstDom("r1 = r1 + r2", "") push = ConstDom("", "push r1 ; r2") self.assertEqual( str(a.extend(b.extend(push))), "{ r1 = (5) + (7) ; r2 = 7 ; } [push ((5) + (7)) ; (7) ; ]") self.assertEqual( str(a.extend(b).extend(push)), "{ r1 = (5) + (7) ; r2 = 7 ; } [push ((5) + (7)) ; (7) ; ]") push1 = ConstDom("", "push r1") push2 = ConstDom("", "push r2") self.assertEqual(str(push1.extend(push2)), "{ } [push r1 ; r2 ; ]") pop1 = ConstDom("", "pop r1") pop2 = ConstDom("", "pop r2 ; r3") self.assertEqual(str(pop1.extend(pop2)), "{ } [pop r1 ; r2 ; r3 ; ]")
def test_0element(self): a = ConstDom("") z = a.zero() self.assertEqual(str(z), "{ ZERO }") a = ConstDom("r1 = 3") #Test that zero is annihilator for extend, i.e. # a x Z = Z = Z x a b = a.extend(z) self.assertEqual(str(b), str(z)) b = z.extend(a) self.assertEqual(str(b), str(z)) #Test that zero is neutral for combine #Test with manual deref b = a.combine(z.__deref__()) self.assertEqual(str(b), str(a)) #Test with auto deref b = a.combine(z) self.assertEqual(str(b), str(a))
def test_extend(self): a = ConstDom("r1 = 5") b = ConstDom("r2 = 7") c = a.extend(b) self.assertEqual(str(c), "{ r1 = 5 ; r2 = 7 ; }") a = ConstDom("r1 = 5") b = ConstDom("r2 = r1 + 2") c = a.extend(b) self.assertEqual(str(c), "{ r1 = 5 ; r2 = (5) + 2 ; }") a = ConstDom("r1 = 5; r2 = 7") b = ConstDom("r3 = r1 + r2") c = a.extend(b) self.assertEqual(str(c), "{ r1 = 5 ; r2 = 7 ; r3 = (5) + (7) ; }") a = ConstDom("r1 = 5; r2 = 7") b = ConstDom("r3 = r1 + r2") c = b.extend(a) self.assertEqual(str(c), "{ r1 = 5 ; r2 = 7 ; r3 = r1 + r2 ; }") a = ConstDom("") b = ConstDom("r2 = r1 + 5") c = a.extend(b) self.assertEqual(str(c), "{ r2 = r1 + 5 ; }") b = ConstDom("r3 = r2 + 5") c = c.extend(b) self.assertEqual(str(c), "{ r2 = r1 + 5 ; r3 = (r1 + 5) + 5 ; }") a = ConstDom("") b = ConstDom("r2 = r2 + 5") c = a.extend(b) self.assertEqual(str(c), "{ r2 = r2 + 5 ; }") #Extend with same value a = ConstDom("r2 = 5") b = ConstDom("r2 = 5") c = a.extend(b) self.assertEqual(str(c), "{ r2 = 5 ; }") #extend with unknown value a = ConstDom("r2 = 5") b = ConstDom("r2 = top") c = a.extend(b) self.assertEqual(str(c), "{ r2 = top ; }") #extend unknown with known value a = ConstDom("r2 = top") b = ConstDom("r2 = 5") c = a.extend(b) self.assertEqual(str(c), "{ r2 = 5 ; }") #test syntactic substitution bugs a = ConstDom("r1 = 1 ; r12 = 4") b = ConstDom("r2 = r1 + r12") c = a.extend(b) self.assertEqual(str(c), "{ r1 = 1 ; r2 = (1) + (4) ; r12 = 4 ; }") a = ConstDom("r0 = 1 ; r1 = 2") b = ConstDom("r1 = r0") c = a.extend(b) self.assertEqual(str(c), "{ r0 = 1 ; r1 = (1) ; }") a = ConstDom("r13 = r13 - 4") b = ConstDom("r13 = r13 - 4") c = a.extend(b) self.assertEqual(str(c), "{ r13 = (r13 - 4) - 4 ; }") a = ConstDom("r0 = 30 ; r13 = (r13 - 4) - 4 ; r14 = top") b = ConstDom("r0 = top ; r13 = (r13 - 4) + 4 ; r14 = top") c = a.extend(b) self.assertEqual(str(c), "{ r0 = top ; r13 = (((r13 - 4) - 4) - 4) + 4 ; r14 = top ; }") a = ConstDom("r13 = r13 - 4 ; r14 = top") b = ConstDom("r0 = top") c = a.extend(b) self.assertEqual(str(c), "{ r0 = top ; r13 = r13 - 4 ; r14 = top ; }") a = ConstDom("r13 = r13 - 4 ; r14 = r13 + 8") b = ConstDom("r0 = top") c = a.extend(b) self.assertEqual(str(c), "{ r0 = top ; r13 = r13 - 4 ; r14 = r13 + 8 ; }") a = ConstDom("r13 = r13 - 4 ; r14 = top") b = ConstDom("r13 = r13 + 4") c = a.extend(b) self.assertEqual(str(c), "{ r13 = (r13 - 4) + 4 ; r14 = top ; }") a = ConstDom("r1 = 0") b = ConstDom("r13 = r13 - 12") c = a.extend(b) self.assertEqual(str(c), "{ r1 = 0 ; r13 = r13 - 12 ; }") a = ConstDom("r0 = 67164") b = ConstDom("r5 = r0") c = a.extend(b) self.assertEqual(str(c), "{ r0 = 67164 ; r5 = (67164) ; }") a = ConstDom("r0 = 67164") b = ConstDom("r5 = (r0) + 40") c = a.extend(b) self.assertEqual(str(c), "{ r0 = 67164 ; r5 = ((67164)) + 40 ; }") a = ConstDom("r13 = r13 - 16") b = ConstDom("r13 = r13 + 16") c = a.extend(b) self.assertEqual(str(c), "{ r13 = (r13 - 16) + 16 ; }") a = ConstDom("r1 = top ; r13 = r13 - 16") b = ConstDom("r13 = r13 + 16") c = a.extend(b) self.assertEqual(str(c), "{ r1 = top ; r13 = (r13 - 16) + 16 ; }") a = ConstDom("r5 = r0") b = ConstDom("r5 = r5 + 40") c = a.extend(b) self.assertEqual(str(c), "{ r5 = (r0) + 40 ; }") #Substitution should only happen in one "level", e.g. #r5 + 40 => r0 + 40 =!=> top + 40 a = ConstDom("r0 = top ; r5 = r0") b = ConstDom("r5 = r5 + 40") c = a.extend(b) self.assertEqual(str(c), "{ r0 = top ; r5 = (r0) + 40 ; }") a = ConstDom("r0 = 4") b = ConstDom("r5 = r0") c = a.extend(b) self.assertEqual(str(c), "{ r0 = 4 ; r5 = (4) ; }")
def test_extend(self): a = ConstDom("r1 = 5") b = ConstDom("r2 = 7") c = a.extend(b) self.assertEqual(str(c), "{ r1 = 5 ; r2 = 7 ; }") a = ConstDom("r1 = 5") b = ConstDom("r2 = r1 + 2") c = a.extend(b) self.assertEqual(str(c), "{ r1 = 5 ; r2 = (5) + 2 ; }") a = ConstDom("r1 = 5; r2 = 7") b = ConstDom("r3 = r1 + r2") c = a.extend(b) self.assertEqual(str(c), "{ r1 = 5 ; r2 = 7 ; r3 = (5) + (7) ; }") a = ConstDom("r1 = 5; r2 = 7") b = ConstDom("r3 = r1 + r2") c = b.extend(a) self.assertEqual(str(c), "{ r1 = 5 ; r2 = 7 ; r3 = r1 + r2 ; }") a = ConstDom("") b = ConstDom("r2 = r1 + 5") c = a.extend(b) self.assertEqual(str(c), "{ r2 = r1 + 5 ; }") b = ConstDom("r3 = r2 + 5") c = c.extend(b) self.assertEqual(str(c), "{ r2 = r1 + 5 ; r3 = (r1 + 5) + 5 ; }") a = ConstDom("") b = ConstDom("r2 = r2 + 5") c = a.extend(b) self.assertEqual(str(c), "{ r2 = r2 + 5 ; }") #Extend with same value a = ConstDom("r2 = 5") b = ConstDom("r2 = 5") c = a.extend(b) self.assertEqual(str(c), "{ r2 = 5 ; }") #extend with unknown value a = ConstDom("r2 = 5") b = ConstDom("r2 = top") c = a.extend(b) self.assertEqual(str(c), "{ r2 = top ; }") #extend unknown with known value a = ConstDom("r2 = top") b = ConstDom("r2 = 5") c = a.extend(b) self.assertEqual(str(c), "{ r2 = 5 ; }") #test syntactic substitution bugs a = ConstDom("r1 = 1 ; r12 = 4") b = ConstDom("r2 = r1 + r12") c = a.extend(b) self.assertEqual(str(c), "{ r1 = 1 ; r2 = (1) + (4) ; r12 = 4 ; }") a = ConstDom("r0 = 1 ; r1 = 2") b = ConstDom("r1 = r0") c = a.extend(b) self.assertEqual(str(c), "{ r0 = 1 ; r1 = (1) ; }") a = ConstDom("r13 = r13 - 4") b = ConstDom("r13 = r13 - 4") c = a.extend(b) self.assertEqual(str(c), "{ r13 = (r13 - 4) - 4 ; }") a = ConstDom("r0 = 30 ; r13 = (r13 - 4) - 4 ; r14 = top") b = ConstDom("r0 = top ; r13 = (r13 - 4) + 4 ; r14 = top") c = a.extend(b) self.assertEqual( str(c), "{ r0 = top ; r13 = (((r13 - 4) - 4) - 4) + 4 ; r14 = top ; }") a = ConstDom("r13 = r13 - 4 ; r14 = top") b = ConstDom("r0 = top") c = a.extend(b) self.assertEqual(str(c), "{ r0 = top ; r13 = r13 - 4 ; r14 = top ; }") a = ConstDom("r13 = r13 - 4 ; r14 = r13 + 8") b = ConstDom("r0 = top") c = a.extend(b) self.assertEqual(str(c), "{ r0 = top ; r13 = r13 - 4 ; r14 = r13 + 8 ; }") a = ConstDom("r13 = r13 - 4 ; r14 = top") b = ConstDom("r13 = r13 + 4") c = a.extend(b) self.assertEqual(str(c), "{ r13 = (r13 - 4) + 4 ; r14 = top ; }") a = ConstDom("r1 = 0") b = ConstDom("r13 = r13 - 12") c = a.extend(b) self.assertEqual(str(c), "{ r1 = 0 ; r13 = r13 - 12 ; }") a = ConstDom("r0 = 67164") b = ConstDom("r5 = r0") c = a.extend(b) self.assertEqual(str(c), "{ r0 = 67164 ; r5 = (67164) ; }") a = ConstDom("r0 = 67164") b = ConstDom("r5 = (r0) + 40") c = a.extend(b) self.assertEqual(str(c), "{ r0 = 67164 ; r5 = ((67164)) + 40 ; }") a = ConstDom("r13 = r13 - 16") b = ConstDom("r13 = r13 + 16") c = a.extend(b) self.assertEqual(str(c), "{ r13 = (r13 - 16) + 16 ; }") a = ConstDom("r1 = top ; r13 = r13 - 16") b = ConstDom("r13 = r13 + 16") c = a.extend(b) self.assertEqual(str(c), "{ r1 = top ; r13 = (r13 - 16) + 16 ; }") a = ConstDom("r5 = r0") b = ConstDom("r5 = r5 + 40") c = a.extend(b) self.assertEqual(str(c), "{ r5 = (r0) + 40 ; }") #Substitution should only happen in one "level", e.g. #r5 + 40 => r0 + 40 =!=> top + 40 a = ConstDom("r0 = top ; r5 = r0") b = ConstDom("r5 = r5 + 40") c = a.extend(b) self.assertEqual(str(c), "{ r0 = top ; r5 = (r0) + 40 ; }") a = ConstDom("r0 = 4") b = ConstDom("r5 = r0") c = a.extend(b) self.assertEqual(str(c), "{ r0 = 4 ; r5 = (4) ; }")