import unittest, pprint, traceback from simpleparse.objectgenerator import * from simpleparse.stt.TextTools import TextTools from genericvalues import NullResult, AnyInt class ElementTokenTests(unittest.TestCase): def doBasicTest(self, instance, testvalue, expected, startPosition=0 ): table = tuple(instance.toParser()) result = tag( testvalue, table , startPosition) assert result == expected, '''\n\texpected:%s\n\tgot:%s\n'''%( expected, result ) def testString1( self ): self.doBasicTest( Literal( value = 'test' ), 'test', (1, [],4), ) def testString2( self ): self.doBasicTest( Literal( value = 'test', optional =1 ), 'test', (1, [],4), ) def testString3( self ): self.doBasicTest( Literal( value = 'test', optional =1, negative=1 ), 'test', (1, [],0), ) def testString4( self ): self.doBasicTest( Literal( value = 'test', negative=1 ), 'test', (0, [],AnyInt), ) def testString5( self ): self.doBasicTest( Literal( value = 'test', repeating=1), 'testtest', (1, [],8), ) def testString6( self ): self.doBasicTest( Literal( value = 'test', repeating=1, optional = 1), 'testtest', (1, [],8), ) def testString7( self ): self.doBasicTest( Literal( value = 'test', repeating=1, optional = 1, negative = 1), 'testtest', (1, [],0), ) def testString8( self ): """Test repeating negative string""" self.doBasicTest( Literal( value = 'test', repeating=1, negative = 1), 'testtest', (0, [],AnyInt), ) def testString9( self ): self.doBasicTest( Literal( value = '\\',), '\\', (1, [],1), ) def testRange1( self ): self.doBasicTest( Range( value = 'abc'), 'aabbcc', (1, [],1), ) def testRange2( self ): self.doBasicTest( Range( value = 'abc', optional=1), 'aabbcc', (1, [],1), ) def testRange3( self ): self.doBasicTest( Range( value = 'abc', optional=1, repeating=1), 'aabbcc', (1, [],6), ) def testRange4( self ): self.doBasicTest( Range( value = 'abc', optional=1, repeating=1, negative=1), 'aabbcc', (1, [],0), ) def testRange5( self ): self.doBasicTest( Range( value = 'abc', optional=1, negative=1), 'aabbcc', (1, [],0), ) def testRange6( self ): self.doBasicTest( Range( value = 'abc', negative=1), 'aabbcc', (0, [],AnyInt), ) def testRange7( self ): self.doBasicTest( Range( value = 'abc', negative=1, repeating=1), 'aabbcc', (0, [],AnyInt), ) def testRange8( self ): self.doBasicTest( Range( value = 'abc', negative=1, repeating=1), 'defc', (1, [],3), ) def testRange9( self ): self.doBasicTest( Range( value = 'abc', negative=1), 'defc', (1, [],1), ) def testSequential1( self ): self.doBasicTest( SequentialGroup( children = [ Range( value = 'abc',), Literal( value = 'test', ), ], negative=0, ), 'atest', (1, [],5), ) def testSequential2( self ): self.doBasicTest( SequentialGroup( children = [ Range( value = 'abc',), Literal( value = 'test', ), ], negative=1, ), 'atest', (0, [],AnyInt), ) def testSequential3( self ): self.doBasicTest( SequentialGroup( children = [ Range( value = 'abc',), Literal( value = 'test', ), ], negative=1, optional=1, ), 'atest', (1, [],0), ) def testSequential4( self ): self.doBasicTest( SequentialGroup( children = [ Range( value = 'abc',), Literal( value = 'test', ), ], negative=1, optional=1, repeating=1, ), 'sdatest', (1, [],2), ) def testSequential5( self ): self.doBasicTest( SequentialGroup( children = [ Range( value = 'abc',), Literal( value = 'test', ), ], optional=1, repeating=1, ), 'atestbtestctest', (1, [],15), ) def testSequential6( self ): self.doBasicTest( SequentialGroup( children = [ Range( value = 'abc',), Literal( value = 'test', ), ], optional=1, ), 'atestbtestctest', (1, [],5), ) def testSequential7( self ): self.doBasicTest( SequentialGroup( children = [ Range( value = 'abc',), Literal( value = 'test', ), ], optional=1, ), 'satestbtestctest', (1, [],0), ) def testFirstOf1( self ): self.doBasicTest( FirstOfGroup( children = [ Range( value = 'abc',), Literal( value = 'test', ), ], negative=0, ), 'atest', (1, [],1), ) def testFirstOf2( self ): self.doBasicTest( FirstOfGroup( children = [ Range( value = 'abc',), Literal( value = 'test', ), ], negative=0, ), 'testa', (1, [],4), ) def testFirstOf3( self ): self.doBasicTest( FirstOfGroup( children = [ Range( value = 'abc',), Literal( value = 'test', ), ], negative=1, ), 'testa', (0, [],AnyInt), ) def testFirstOf4( self ): self.doBasicTest( FirstOfGroup( children = [ Range( value = 'abc',), Literal( value = 'test', ), ], negative=1, optional=1, ), 'testa', (1, [],0), ) def testFirstOf5( self ): self.doBasicTest( FirstOfGroup( children = [ Range( value = 'abc',), Literal( value = 'test', ), ], repeating=1, ), 'testabtest', (1, [],10), ) def testFirstOf6( self ): self.doBasicTest( FirstOfGroup( children = [ Range( value = 'abc',), Literal( value = 'test', ), ], repeating=1, negative = 1, ), 'hellotheretestabtest', (1, [],10), ) def testCIString1( self ): self.doBasicTest( CILiteral( value = 'test'), 'test', (1, [],4), ) def testCIString2( self ): self.doBasicTest( CILiteral( value = 'test'), 'Test', (1, [],4), ) def testCIString3( self ): self.doBasicTest( CILiteral( value = 'test'), 'TEST', (1, [],4), ) def testCIString4( self ): self.doBasicTest( CILiteral( value = 'test'), 'tes', (0, [],AnyInt), ) def testCIString5( self ): self.doBasicTest( CILiteral( value = 'test', optional=1), 'tes', (1, [], 0), ) ### Simpleparse 2.0.0b4 introduced an explicit check that ## rejects FOGroups with optional children to prevent ## infinite recursions ## def testFirstOf7( self ): ## '''([abc]?/"test"?)* ## ## Demonstrates a recently fixed error, namely a fix to the repeating ## code which explicitly checks for EOF condition during repeating ## loops. Result is that this condition should be handled correctly. ## ## Old Note: ## This test exposes a problem with both the original generator ## and the sub-class here. FOGroups with optional children are ## in danger of never returning as the children always "succeed" ## even if they consume nothing. ## Failure in this case is likely to be an endless loop, so we ## can expect that if this is broken there will be heck to pay ;) ## ''' ## generator = FirstOfGroup( ## children = [ ## Range( value = 'abc', optional=1), ## Literal( value = 'test', optional=1), ## ], ## repeating=1, optional=1, ## ) ## self.doBasicTest( ## generator, ## 'testabtest', ## (1, [],10), ## ) ## generator = FirstOfGroup( ## children = [ ## Range( value = 'abc', optional=1), ## Literal( value = 'test', optional=1), ## SequentialGroup( ## children = [ ## Literal( value = 'm', optional=1), ## Literal( value = 'n', optional=1), ## ], ## ), ## ], ## repeating=1, optional=1, ## ) ## self.doBasicTest( ## generator, ## 'testmnabtest', ## (1, [],12), ## ) def testNegative1( self ): self.doBasicTest( Literal( value = 's', negative=1), 's\\', (0, [],AnyInt), ) def testNegative2( self ): self.doBasicTest( Literal( value = 's', negative=1), 'asa\\', (1, [],1), ) def testNegative3( self ): self.doBasicTest( Literal( value = 's', negative=1, repeating=1), 'aasa\\', (1, [],2), ) def testNegative4( self ): self.doBasicTest( Literal( value = 's', negative=1, repeating=1, optional=1), 'a', (1, [],1), ) def testNegative4a( self ): self.doBasicTest( Literal( value = 's', negative=1, repeating=1, optional=1), 'as', (1, [],1), ) def testNegative4b( self ): self.doBasicTest( Literal( value = 's', negative=1, repeating=1, optional=1), 'sas', (1, [],0), ) def testNegative5( self ): self.doBasicTest( Range( value = 'sat', negative=1), 'aasat\\', (0, [],AnyInt), ) def testNegative6( self ): self.doBasicTest( Range( value = 'sat', negative=1, repeating=1), 'aasat\\', (0, [],AnyInt), ) def testNegative7( self ): self.doBasicTest( Range( value = 'sat', negative=1, repeating=1, optional=1), 'aasat\\', (1, [],0), ) def getSuite(): return unittest.makeSuite(ElementTokenTests,'test') if __name__ == "__main__": unittest.main(defaultTest="getSuite")