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_add_third(self): c1, c2, c3 = Dummy(True), Dummy(True), Dummy(False) n = ConditionNode([c1, c2]) n.add(c3, AND) self.assertEqual(n.children, [c1, c2, c3]) self.assertEqual(n.connector, AND) # but when you change the connector... c4 = Dummy(False) n.add(c4, OR) self.assertEqual(len(n), 2) self.assertEqual(n.connector, OR) self.assertIs(n.children[1], c4) self.assertEqual(n.children[0].children, [c1, c2, c3]) self.assertEqual(n.children[0].connector, AND)
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)
def test_add_node_no_children(self): c1 = Dummy(True) n1 = ConditionNode([c1]) n2 = ConditionNode([], OR) n1.add(n2, AND) self.assertEqual(n1.children, [c1, n2]) self.assertEqual(n1.connector, AND) n3 = ConditionNode([c1]) n3.add(n2, OR) self.assertEqual(n3.children, [c1]) self.assertEqual(n3.connector, OR)
def test_add_node_one_child(self): c1, c2 = Dummy(True), Dummy(True) n1 = ConditionNode([c2]) n2 = ConditionNode([c1], OR) n1.add(n2, AND) self.assertEqual(n1.children, [c2, c1]) self.assertEqual(n1.connector, AND) n3 = ConditionNode([c2]) n3.add(n2, OR) self.assertEqual(n3.children, [c2, c1]) self.assertEqual(n3.connector, OR)
def test_add_node_many_children(self): c1, c2, c3 = Dummy(True), Dummy(True), Dummy(False) n1 = ConditionNode([c3]) n2 = ConditionNode([c1, c2], OR) n1.add(n2, AND) self.assertEqual(n1.children, [c3, n2]) self.assertEqual(n1.connector, AND) n3 = ConditionNode([c3]) n3.add(n2, OR) self.assertEqual(n3.children, [c3, c1, c2]) self.assertEqual(n3.connector, OR)
def test_add_first(self): # Not a function I wrote, but I need to make sure they don't change how it works. n = ConditionNode() child = Dummy(True) n.add(child, OR) self.assertEqual(n.children, [child]) self.assertEqual(n.connector, OR) # same thing again should do nothing... n.add(child, OR) self.assertEqual(n.children, [child]) self.assertEqual(n.connector, OR) # even with different connector n.add(child, AND) self.assertEqual(n.children, [child]) self.assertEqual(n.connector, AND)
def test_collapse(self): c1, c2 = Dummy(True), Dummy(True) n2, n3 = ConditionNode(), ConditionNode(connector=OR) n4, n5 = ConditionNode([c1]), ConditionNode([c2], OR) n6, n7 = ConditionNode([c1, c1]), ConditionNode([c2, c2], OR) n1 = ConditionNode([n2, n3, n4, n5, n6, n7], OR) n1.collapse() self.assertEqual(n1.connector, OR) self.assertEqual(n1.children, [n6, c1, c2, c2, c2]) # Now test the recursion of the last part n8 = ConditionNode([c1, c2, c1], OR) n9 = ConditionNode([ConditionNode([ConditionNode([n8])], OR)]) self.assertEqual(n9.connector, AND) n9.collapse() self.assertEqual(n9.connector, OR) self.assertEqual(n9.children, [c1, c2, c1])
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)