class ConceptualExpressionRules(unittest.TestCase):
    def setUp(self):
        n = basic_learner.FiniteSymbolTable()
        n.add("john", "john")
        n.add("catches", {"CAUSE", "GO", "TO"})
        n.add("the", set())
        n.add("ball", "ball")

        p = basic_learner.FiniteSymbolTable()
        p.add("john", "john")
        p.add("catches", {"CAUSE", "GO", "TO"})
        p.add("the", set())
        p.add("ball", "ball")

        self.learner = basic_learner.NPSymbolLearner(necessary=n, possible=p)
        self.hypothesis = Hypothesis(["CAUSE", "john", ["GO", "ball", ["TO", "john"]]])

    def testEmptyTerms(self):
        utm_pair = training.pairs.UtteranceMeaningPair("the", {self.hypothesis})
        self.learner._rule5(utm_pair)
        self.assertEqual(self.learner.expressions["the"], {BottomExpression()})

    def testVariableTerms(self):
        utm_pair = training.pairs.UtteranceMeaningPair("john", {self.hypothesis})
        self.assertTrue(self.learner.expressions["john"])
        self.learner._rule5(utm_pair)
        self.assertIn("john", self.learner.expressions["john"])
        self.assertNotIn("ball", self.learner.expressions["john"])

        utm_pair2 = training.pairs.UtteranceMeaningPair("ball", {self.hypothesis})
        self.learner._rule5(utm_pair2)
        self.assertIn("ball", self.learner.expressions["ball"])
        self.assertNotIn("john", self.learner.expressions["ball"])

    def testConstantTerms(self):
        subexpressions = self.hypothesis.subexpressions_for_constants({"GO", "TO"})

        for expression in subexpressions:
           self.assertIn("GO", expression)
           self.assertIn("TO", expression)
           self.assertNotIn("CAUSE", expression)

    def testRule5(self):
        self.assertIn("john", self.learner.expressions["catches"] ) # arbitrary membership; universal
        utm_pair = training.pairs.UtteranceMeaningPair("catches", {self.hypothesis})

        self.learner._rule5(utm_pair)

        for expression in self.learner.expressions["catches"]:
            self.assertIn("GO", expression)
            self.assertIn("TO", expression)
            self.assertIn("CAUSE", expression)

    def testGeneralConstantTerms(self):
        general = self.hypothesis.bound_expression.general_form()
        self.assertEqual(general,
                         training.hypothesis.Hypothesis(["CAUSE", "x", "x"]).bound_expression)
        print general
    def setUp(self):
        n = basic_learner.FiniteSymbolTable()
        n.add("john", "john")
        n.add("catches", {"CAUSE", "GO", "TO"})
        n.add("the", set())
        n.add("ball", "ball")

        p = basic_learner.FiniteSymbolTable()
        p.add("john", "john")
        p.add("catches", {"CAUSE", "GO", "TO"})
        p.add("the", set())
        p.add("ball", "ball")

        self.learner = basic_learner.NPSymbolLearner(necessary=n, possible=p)
        self.hypothesis = Hypothesis(["CAUSE", "john", ["GO", "ball", ["TO", "john"]]])