"""


What to do when a test fails under recognition?   Look at the
left-over temp file, load it into XSB using a line from recognizer, like
    xsb -e "['/tmp/@30892.16.P'], [recognize], writeKB, halt."
and see which sub-expressiong in recognizer.P you can get to match.

"""
import unittest

import parse, describe, recognize
import samples

# @@@ should have each sample in samples.rdf be a different test

class testSyntacticLoopback(unittest.TestCase):
    
#    def __init__(self, expr):
#        self.expr = expr
        
    def loopback(self, expr):
        """Parse and describe the expression, then recognize it again"""
        parseTree = parse.parse("inputDocument", expr)
        kb = []
        fsym = describe.describeContentsOfKB(parseTree, lambda t: kb.append(t))
        result = recognize.recognizeContentsOfKB(kb)
        return result

    def runTest(self):
        expr2 = self.loopback(self.expr)
        self.assertNotEqual(expr2, None)
        if self.oneStage:
            self.assertEqual(self.expr, expr2)
        else:
            expr3 = self.loopback(self.expr)
            self.assertEqual(expr2, expr3)
        #print "PASSED!  %s => \n        %s\n        %s\n"%(expr,expr2,expr3),

    def shortDescription(self):
        if self.oneStage:
            return "Syntactic Loopback A->A: "+self.expr
        else:
            return "Syntactic Loopback A->B->B: "+self.expr

def suite():
    suite = unittest.TestSuite()
    for oneStage in (1, 0):
        for expr in samples.rdf:
            t = testSyntacticLoopback()
            t.expr = expr
            t.oneStage = oneStage
            suite.addTest(t)
    for expr in samples.rdf_non_canonical:
        t = testSyntacticLoopback()
        t.expr = expr
        t.oneStage = 0
        suite.addTest(t)
    return suite

if __name__ == "__main__":
    runner = unittest.TextTestRunner()
    runner.run(suite())
    #  @@ I can't get main() to work, so I'm hacking around it
    #unittest.main()
    #tests = []
    #for expr in samples.rdf:
    #    tests.append(testSyntacticLoopback(expr))
    #runner=unittest.TextTestRunner(verbosity=2)
    ##   for test in tests:
    #runner.run(tests[0])
    
    
    
