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)