import unittest, pprint
from simpleparse.stt.TextTools import *
from simpleparse.stt import TextTools
mxVersion = tuple(TextTools.__version__.split('.')[:3])

class MXFlagTests(unittest.TestCase):
    """Test Flags for returning/calling different functions on success"""
    def doBasicTest(self, table, testvalue, expected, startPosition=0 ):
        result = tag( testvalue, table , startPosition)
        assert result == expected, '''\n\texpected:%s\n\tgot:%s\n'''%( expected, result )
    ### Return-type handling tests...
    def testCallTag1( self ):
        """Test CallTag"""
        def function (parentList, text, l,r,children):
            parentList.append( (text[l:r], children) )
        self.doBasicTest(
            (
                ( function, AllIn + CallTag, "ab", 0 ),
            ),
            "abbaabccd",
            ( 1,[
                ("abbaab",None),
            ],6),
        )
    def testCallTag2( self ):
        """Test CallTag with a class instance"""
        class A:
            def __call__(self, parentList, text, l,r,children):
                parentList.append( (text[l:r], children) )
        self.doBasicTest(
            (
                ( A(), AllIn + CallTag, "ab", 0 ),
            ),
            "abbaabccd",
            ( 1,[
                ("abbaab",None),
            ],6),
        )
    def testAppendMatch1( self ):
        """Test AppendMatch"""
        def function (parentList, text, l,r,children):
            parentList.append( (text[l:r], children) )
        self.doBasicTest(
            (
                ( function, AllIn + AppendMatch, "ab", 0 ),
            ),
            "abbaabccd",
            ( 1,[
                "abbaab",
            ],6),
        )
    def testAppendToTagobj1( self ):
        """Test AppendToTagobj"""
        class X:
            successful = ""
            def append(self, value):
                self.successful = value
        tag = X()
        self.doBasicTest(
            (
                ( tag, AllIn + AppendToTagobj, "ab", 0 ),
            ),
            "abbaabccd",
            ( 1,[
            ],6),
        )
        assert tag.successful == (None,0,6,None), "TagObject's append was called with %s"%(repr(tag.successful),)
    def testAppendToTagobj2( self ):
        """Test AppendToTagobj with a simple list"""
        
        tag = []
        self.doBasicTest(
            (
                ( tag, AllIn + AppendToTagobj, "ab", 0 ),
            ),
            "abbaabccd",
            ( 1,[
            ],6),
        )
        assert tag[0] == (None,0,6,None), "TagObject's append was called with %s"%(repr(tag.successful),)
        
    def testAppendTagobj1( self ):
        """Test AppendTagobj"""
        self.doBasicTest(
            (
                ( "Hi there world!", AllIn + AppendTagobj, "ab", 0 ),
            ),
            "abbaabccd",
            ( 1,[
                "Hi there world!",
            ],6),
        )
    if mxVersion >= ('2','1'):
        def testLookAhead1(  self ):
            """Test LookAhead"""
            self.doBasicTest(
                (
                    ( "whatever", AllIn + LookAhead, "ab", 0 ),
                ),
                "abbaabccd",
                ( 1,[
                    ("whatever",0,6,None),
                ],0),
            )
        def testLookAhead2(  self ):
            """Test LookAhead"""
            self.doBasicTest(
                (
                    ( "whatever", AllIn + LookAhead, "ab", 0 ),
                    ( "whatever2", AllIn, "ab", 0 ),
                ),
                "abbaabccd",
                ( 1,[
                    ("whatever",0,6,None),
                    ("whatever2",0,6,None),
                ],6),
            )



def getSuite():
    return unittest.makeSuite(MXFlagTests,'test')

if __name__ == "__main__":
    unittest.main(defaultTest="getSuite")
