def test_paper_example(self): solver = SimplexSolver() left = Variable('left') middle = Variable('middle') right = Variable('right') solver.add_constraint(middle == (left + right) / 2) solver.add_constraint(right == left + 10) solver.add_constraint(right <= 100) solver.add_constraint(left >= 0) # Check that all the required constraints are true: self.assertAlmostEqual((left.value + right.value) / 2, middle.value) self.assertAlmostEqual(right.value, left.value + 10) self.assertGreaterEqual(left.value, 0) self.assertLessEqual(right.value, 100) # Set the middle value to a stay middle.value = 45.0 solver.add_stay(middle) # Check that all the required constraints are true: self.assertAlmostEqual((left.value + right.value) / 2, middle.value) self.assertAlmostEqual(right.value, left.value + 10) self.assertGreaterEqual(left.value, 0) self.assertLessEqual(right.value, 100) # But more than that - since we gave a position for middle, we know # where all the points should be. self.assertAlmostEqual(left.value, 40) self.assertAlmostEqual(middle.value, 45) self.assertAlmostEqual(right.value, 50)
def test_buttons(self): "A test of a horizontal layout of two buttons on a screen." class Button(object): def __init__(self, identifier): self.left = Variable('left' + identifier, 0) self.width = Variable('width' + identifier, 0) def __repr__(self): return u'(%s:%s)' % (self.left.value, self.width.value) solver = SimplexSolver() b1 = Button('b1') b2 = Button('b2') left_limit = Variable('left', 0) right_limit = Variable('width', 0) left_limit.value = 0 solver.add_stay(left_limit, REQUIRED) stay = solver.add_stay(right_limit, WEAK) # The two buttons are the same width solver.add_constraint(b1.width == b2.width) # b1 starts 50 from the left margin. solver.add_constraint(b1.left == left_limit + 50) # b2 ends 50 from the right margin solver.add_constraint(left_limit + right_limit == b2.left + b2.width + 50) # b2 starts at least 100 from the end of b1 solver.add_constraint(b2.left >= (b1.left + b1.width + 100)) # b1 has a minimum width of 87 solver.add_constraint(b1.width >= 87) # b1's preferred width is 87 solver.add_constraint(b1.width == 87, STRONG) # b2's minimum width is 113 solver.add_constraint(b2.width >= 113) # b2's preferred width is 113 solver.add_constraint(b2.width == 113, STRONG) # Without imposign a stay on the right, right_limit will be the minimum width for the layout self.assertAlmostEqual(b1.left.value, 50.0) self.assertAlmostEqual(b1.width.value, 113.0) self.assertAlmostEqual(b2.left.value, 263.0) self.assertAlmostEqual(b2.width.value, 113.0) self.assertAlmostEqual(right_limit.value, 426.0) # The window is 500 pixels wide. right_limit.value = 500 stay = solver.add_stay(right_limit, REQUIRED) self.assertAlmostEqual(b1.left.value, 50.0) self.assertAlmostEqual(b1.width.value, 113.0) self.assertAlmostEqual(b2.left.value, 337.0) self.assertAlmostEqual(b2.width.value, 113.0) self.assertAlmostEqual(right_limit.value, 500.0) solver.remove_constraint(stay) # Expand to 700 pixels right_limit.value = 700 stay = solver.add_stay(right_limit, REQUIRED) self.assertAlmostEqual(b1.left.value, 50.0) self.assertAlmostEqual(b1.width.value, 113.0) self.assertAlmostEqual(b2.left.value, 537.0) self.assertAlmostEqual(b2.width.value, 113.0) self.assertAlmostEqual(right_limit.value, 700.0) solver.remove_constraint(stay) # Contract to 600 right_limit.value = 600 stay = solver.add_stay(right_limit, REQUIRED) self.assertAlmostEqual(b1.left.value, 50.0) self.assertAlmostEqual(b1.width.value, 113.0) self.assertAlmostEqual(b2.left.value, 437.0) self.assertAlmostEqual(b2.width.value, 113.0) self.assertAlmostEqual(right_limit.value, 600.0) solver.remove_constraint(stay)