def test_invert(self): c1, c2 = Dummy(True), Dummy(False) n1 = ConditionNode([c1, c2]) n2 = ~n1 # Get rid of the extra node added by negation. n2.collapse() self.assertIsNot(n1, n2) self.assertIsNot(n1.children[0], n2.children[0]) self.assertIsNot(n1.children[1], n2.children[1]) self.assertNotEqual(n1.connector, n2.connector) self.assertEqual(n1.evaluate(), not n2.evaluate())
def test_evaluate(self): n1 = ConditionNode() self.assertIs(n1.evaluate(), True) n1.connector = OR self.assertIs(n1.evaluate(), False) n2 = ConditionNode([Dummy(True)]) self.assertIs(n2.evaluate(), True) n2.connector = OR self.assertIs(n2.evaluate(), True) n3 = ConditionNode([Dummy(False)]) self.assertIs(n3.evaluate(), False) n3.connector = OR self.assertIs(n3.evaluate(), False) n4 = ConditionNode([Dummy(True), Dummy(False)]) self.assertIs(n4.evaluate(), False) n4.connector = OR self.assertIs(n4.evaluate(), True) n5 = ConditionNode([Dummy(False), Dummy(True)]) self.assertIs(n5.evaluate(), False) n5.connector = OR self.assertIs(n5.evaluate(), True)
def test_negate(self): c1, c2 = Dummy(True), Dummy(False) n = ConditionNode([c1, c2]) result = n.evaluate() n.negate() self.assertEqual(len(n), 1) self.assertEqual(n.connector, AND) self.assertEqual(n.children[0].children, [c1, c2]) self.assertEqual(n.children[0].connector, OR) # We went from (c1 AND c2) to (!c1 or !c2) self.assertEqual(n.evaluate(), not result) self.assertIs(c1.v, False) self.assertIs(c2.v, True) n.negate() self.assertIs(c1.v, True) self.assertIs(c2.v, False) self.assertEqual(len(n), 1) self.assertEqual(n.connector, AND) self.assertEqual(len(n.children[0]), 1) # collapsing at this point should give us back the original node structure n.collapse() self.assertEqual(n.evaluate(), result) self.assertEqual(n.children, [c1, c2]) self.assertEqual(n.connector, AND)