[antlr-interest] antlr python unit testing

Kaleb Pederson kibab at icehouse.net
Thu May 3 17:02:55 PDT 2007


Hi Laurie,

In python, stdin is just a file descriptor that you can change.  So, if you 
wanted to manipulate it to read from a file, or some other object that had 
the same interface as a file descriptor, you could do so.

For example:

import sys
sys.stdin = open('myfile','r');

Then, if you needed to get the regular stdin back, sys.stdin = sys.__stdin__

So, take advantage of the StringIO class:

import StringIO
import sys

sys.stdin = StringIO.StringIO("My text to be parsed")

Now you can run your unit tests using whatever text you want.

Hope that helps.

--Kaleb

On Thursday 03 May 2007, Laurie Harper wrote:
> I'm using ANTLR for Python and have my lexer and parser partially
> working. I would like to start writing unit tests to identify exactly
> what is and isn't right in what I have so far. (Call it test-first
> debugging ;-)
>
> This is a total newbie question but, how do I pass input into my lexer
> or parser from a Python script, rather than having it come from stdin?
> Ideally, I'd like to create a lexer instance and a parser instance and
> then write unit tests that exercise specific rules with varying input,
> al la:
>
>      import unittest
>      class LexerTests(unittest.TestCase):
>          def setUp(self):
>              self.L = lexer()
>              self.P = parser(self.L)
>
>          def test_lexer(self):
>              input = "specimen input"
>
>              # *****
>              self.L.INJECT_INPUT_CHARACTERS(input)
>              # *****
>
>              self.failUnlessEqual(some_result, self.L.nextToken())
>
>          def test_parser(self):
>              input = "specimen input"
>
>              # *****
>              self.L.INJECT_INPUT_CHARACTERS(input)
>              # *****
>
>              self.failUnlessEqual(some_result, self.P.someRule()
>
> How do I achieve the INJECT_INPUT_CHARACTERS(input) part?
>
> L.




More information about the antlr-interest mailing list