def test_weakest_list_order(self): """Test weakest list order""" solver = Solver() a = Variable(1, 30) b = Variable(2, 10) c = Variable(3, 10) c_eq = EquationConstraint(lambda a, b, c: a + b + c, a=a, b=b, c=c) solver.add_constraint(c_eq) weakest = [el for el in c_eq._weakest] a.value = 4 self.assertEqual(c_eq._weakest, weakest) # does not change if non-weak variable changed b.value = 5 self.assertEqual(c_eq.weakest(), c) b.value = 6 self.assertEqual(c_eq.weakest(), c) # b changed above, now change a - all weakest variables changed # return the oldest changed variable then c.value = 6 self.assertEqual(c_eq.weakest(), b) b.value = 6 self.assertEqual(c_eq.weakest(), c)
def test_weakest_list_order(self): """Test weakest list order""" solver = Solver() a = Variable(1, 30) b = Variable(2, 10) c = Variable(3, 10) c_eq = EquationConstraint(lambda a, b, c: a + b + c, a=a, b=b, c=c) solver.add_constraint(c_eq) weakest = [el for el in c_eq._weakest] a.value = 4 self.assertEqual( c_eq._weakest, weakest) # does not change if non-weak variable changed b.value = 5 self.assertEqual(c_eq.weakest(), c) b.value = 6 self.assertEqual(c_eq.weakest(), c) # b changed above, now change a - all weakest variables changed # return the oldest changed variable then c.value = 6 self.assertEqual(c_eq.weakest(), b) b.value = 6 self.assertEqual(c_eq.weakest(), c)
def test_min_size(self): """Test minimal size constraint""" solver = Solver() v1 = Variable(0) v2 = Variable(10) v3 = Variable(10) c1 = EqualsConstraint(a=v2, b=v3) c2 = LessThanConstraint(smaller=v1, bigger=v3, delta=10) solver.add_constraint(c1) solver.add_constraint(c2) # check everyting is ok on start solver.solve() self.assertEquals(0, v1) self.assertEquals(10, v2) self.assertEquals(10, v3) # change v1 to 2, after solve it should be 0 again due to LT # constraint v1.value = 2 solver.solve() self.assertEquals(0, v1) self.assertEquals(10, v2) self.assertEquals(10, v3) # change v3 to 20, after solve v2 will follow thanks to EQ # constraint v3.value = 20 solver.solve() self.assertEquals(0, v1) self.assertEquals(20, v2) self.assertEquals(20, v3) # change v3 to 0, after solve it shoul be 10 due to LT.delta = 10, # v2 should also be 10 due to EQ constraint v3.value = 0 solver.solve() self.assertEquals(0, v1) self.assertEquals(10, v2) self.assertEquals(10, v3)
def test_min_size(self): """Test minimal size constraint""" solver = Solver() v1 = Variable(0) v2 = Variable(10) v3 = Variable(10) c1 = EqualsConstraint(a=v2, b=v3) c2 = LessThanConstraint(smaller=v1, bigger=v3, delta=10) solver.add_constraint(c1) solver.add_constraint(c2) # check everyting is ok on start solver.solve() self.assertEquals(0, v1) self.assertEquals(10, v2) self.assertEquals(10, v3) # change v1 to 2, after solve it should be 0 again due to LT # constraint v1.value = 2 solver.solve() self.assertEquals(0, v1) self.assertEquals(10, v2) self.assertEquals(10, v3) # change v3 to 20, after solve v2 will follow thanks to EQ # constraint v3.value = 20 solver.solve() self.assertEquals(0, v1) self.assertEquals(20, v2) self.assertEquals(20, v3) # change v3 to 0, after solve it shoul be 10 due to LT.delta = 10, # v2 should also be 10 due to EQ constraint v3.value = 0 solver.solve() self.assertEquals(0, v1) self.assertEquals(10, v2) self.assertEquals(10, v3)
def test_min_size(solv): """Test minimal size constraint. """ v1 = Variable(0) v2 = Variable(10) v3 = Variable(10) c1 = EqualsConstraint(a=v2, b=v3) c2 = LessThanConstraint(smaller=v1, bigger=v3, delta=10) solv.solver.add_constraint(c1) solv.solver.add_constraint(c2) # Check everything is ok on start solv.solver.solve() assert 0 == v1 assert 10 == v2 assert 10 == v3 # Change v1 to 2, after solve it should be 0 again due to LT constraint v1.value = 2 solv.solver.solve() assert 0 == v1 assert 10 == v2 assert 10 == v3 # Change v3 to 20, after solve v2 will follow thanks to EQ constraint v3.value = 20 solv.solver.solve() assert 0 == v1 assert 20 == v2 assert 20 == v3 # Change v3 to 0, after solve it should be 10 due to LT.delta = 10, v2 # should also be 10 due to EQ constraint v3.value = 0 solv.solver.solve() assert 0 == v1 assert 10 == v2 assert 10 == v3
def test_min_size(solv): """Test minimal size constraint. """ v1 = Variable(0) v2 = Variable(10) v3 = Variable(10) c1 = EqualsConstraint(a=v2, b=v3) c2 = LessThanConstraint(smaller=v1, bigger=v3, delta=10) solv.solver.add_constraint(c1) solv.solver.add_constraint(c2) # Check everything is ok on start solv.solver.solve() assert 0 == v1 assert 10 == v2 assert 10 == v3 # Change v1 to 2, after solve it should be 0 again due to LT constraint v1.value = 2 solv.solver.solve() assert 0 == v1 assert 10 == v2 assert 10 == v3 # Change v3 to 20, after solve v2 will follow thanks to EQ constraint v3.value = 20 solv.solver.solve() assert 0 == v1 assert 20 == v2 assert 20 == v3 # Change v3 to 0, after solve it should be 10 due to LT.delta = 10, v2 # should also be 10 due to EQ constraint v3.value = 0 solv.solver.solve() assert 0 == v1 assert 10 == v2 assert 10 == v3
def test_weakest_list_order(): solver = Solver() a = Variable(1, 30) b = Variable(2, 10) c = Variable(3, 10) c_eq = EquationConstraint(lambda a, b, c: a + b + c, a=a, b=b, c=c) solver.add_constraint(c_eq) a.value = 4 b.value = 5 assert c_eq.weakest() == c b.value = 6 assert c_eq.weakest() == c # b changed above, now change a - all weakest variables changed return the # oldest changed variable c.value = 6 assert c_eq.weakest() == b b.value = 6 assert c_eq.weakest() == c
def test_notify_for_nested_constraint(): events = [] solver = Solver() a = Variable() b = Variable() nested = EqualsConstraint(a, b) multi = MultiConstraint(nested) solver.add_constraint(multi) solver.solve() def handler(constraint): events.append(constraint) solver.add_handler(handler) a.value = 10 solver.solve() assert multi in events assert nested not in events
def test_pos_constraint(): """Test position constraint.""" x1, y1 = Variable(10), Variable(11) x2, y2 = Variable(12), Variable(13) pc = PositionConstraint(origin=(x1, y1), point=(x2, y2)) pc.solve_for() # origin shall remain the same assert 10 == x1 assert 11 == y1 # point shall be moved to origin assert 10 == x2 assert 11 == y2 # change just x of origin x1.value = 15 pc.solve_for() assert 15 == x2 # change just y of origin y1.value = 14 pc.solve_for() assert 14 == y2
def test_pos_constraint(self): """Test position constraint""" x1, y1 = Variable(10), Variable(11) x2, y2 = Variable(12), Variable(13) pc = PositionConstraint(origin=(x1, y1), point=(x2, y2)) pc.solve_for() # origin shall remain the same self.assertEquals(10, x1) self.assertEquals(11, y1) # point shall be moved to origin self.assertEquals(10, x2) self.assertEquals(11, y2) # change just x of origin x1.value = 15 pc.solve_for() self.assertEquals(15, x2) # change just y of origin y1.value = 14 pc.solve_for() self.assertEquals(14, y2)
def test_pos_constraint(): """Test position constraint""" x1, y1 = Variable(10), Variable(11) x2, y2 = Variable(12), Variable(13) pc = PositionConstraint(origin=(x1, y1), point=(x2, y2)) pc.solve_for() # origin shall remain the same assert 10 == x1 assert 11 == y1 # point shall be moved to origin assert 10 == x2 assert 11 == y2 # change just x of origin x1.value = 15 pc.solve_for() assert 15 == x2 # change just y of origin y1.value = 14 pc.solve_for() assert 14 == y2