1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# bootstrapping setuptools
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport ez_setup
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverez_setup.use_setuptools()
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport os
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport sys
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport textwrap
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom distutils.errors import *
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom distutils.command.clean import clean as _clean
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom distutils.cmd import Command
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom setuptools import setup
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom distutils import log
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom distutils.core import setup
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass clean(_clean):
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Also cleanup local temp files."""
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def run(self):
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        _clean.run(self)
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import fnmatch
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # kill temporary files
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        patterns = [
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # generic tempfiles
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            '*~', '*.bak', '*.pyc',
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # tempfiles generated by ANTLR runs
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            't[0-9]*Lexer.py', 't[0-9]*Parser.py',
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            '*.tokens', '*__.g',
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ]
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for path in ('antlr3', 'unittests', 'tests'):
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            path = os.path.join(os.path.dirname(__file__), path)
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if os.path.isdir(path):
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                for root, dirs, files in os.walk(path, topdown=True):
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    graveyard = []
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    for pat in patterns:
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        graveyard.extend(fnmatch.filter(files, pat))
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    for name in graveyard:
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        filePath = os.path.join(root, name)
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        try:
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                            log.info("removing '%s'", filePath)
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                            os.unlink(filePath)
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        except OSError, exc:
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                            log.warn(
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                "Failed to delete '%s': %s",
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                filePath, exc
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                )
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestError(DistutilsError):
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pass
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grml.. the class name appears in the --help output:
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ...
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# Options for 'CmdUnitTest' command
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ...
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# so I have to use a rather ugly name...
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass unittest(Command):
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Run unit tests for package"""
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    description = "run unit tests for package"
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    user_options = [
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ('xml-output=', None,
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         "Directory for JUnit compatible XML files."),
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ]
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    boolean_options = []
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def initialize_options(self):
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.xml_output = None
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def finalize_options(self):
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def run(self):
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        testDir = os.path.join(os.path.dirname(__file__), 'unittests')
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if not os.path.isdir(testDir):
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            raise DistutilsFileError(
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "There is not 'unittests' directory. Did you fetch the "
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "development version?",
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import glob
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import imp
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import unittest
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import traceback
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import StringIO
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        suite = unittest.TestSuite()
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        loadFailures = []
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # collect tests from all unittests/test*.py files
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        testFiles = []
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for testPath in glob.glob(os.path.join(testDir, 'test*.py')):
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            testFiles.append(testPath)
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        testFiles.sort()
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for testPath in testFiles:
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            testID = os.path.basename(testPath)[:-3]
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            try:
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                modFile, modPathname, modDescription \
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                         = imp.find_module(testID, [testDir])
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                testMod = imp.load_module(
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    testID, modFile, modPathname, modDescription
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    )
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                suite.addTests(
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    unittest.defaultTestLoader.loadTestsFromModule(testMod)
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    )
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            except Exception:
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                buf = StringIO.StringIO()
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                traceback.print_exc(file=buf)
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                loadFailures.append(
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    (os.path.basename(testPath), buf.getvalue())
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    )
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if self.xml_output:
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            import xmlrunner
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            runner = xmlrunner.XMLTestRunner(
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                stream=open(os.path.join(self.xml_output, 'unittest.xml'), 'w'))
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else:
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            runner = unittest.TextTestRunner(verbosity=2)
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = runner.run(suite)
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for testName, error in loadFailures:
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            sys.stderr.write('\n' + '='*70 + '\n')
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            sys.stderr.write(
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "Failed to load test module %s\n" % testName
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            sys.stderr.write(error)
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            sys.stderr.write('\n')
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if not result.wasSuccessful() or loadFailures:
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            raise TestError(
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "Unit test suite failed!",
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass functest(Command):
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Run functional tests for package"""
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    description = "run functional tests for package"
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    user_options = [
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ('testcase=', None,
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         "testcase to run [default: run all]"),
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ('antlr-version=', None,
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         "ANTLR version to use [default: HEAD (in ../../build)]"),
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ('antlr-jar=', None,
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         "Explicit path to an antlr jar (overrides --antlr-version)"),
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ('xml-output=', None,
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         "Directory for JUnit compatible XML files."),
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ]
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    boolean_options = []
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def initialize_options(self):
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.testcase = None
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.antlr_version = 'HEAD'
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.antlr_jar = None
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.xml_output = None
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def finalize_options(self):
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def run(self):
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import glob
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import imp
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import unittest
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import traceback
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import StringIO
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        testDir = os.path.join(os.path.dirname(__file__), 'tests')
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if not os.path.isdir(testDir):
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            raise DistutilsFileError(
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "There is not 'tests' directory. Did you fetch the "
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "development version?",
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # make sure, relative imports from testcases work
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        sys.path.insert(0, testDir)
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        rootDir = os.path.abspath(
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            os.path.join(os.path.dirname(__file__), '..', '..'))
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if self.antlr_jar is not None:
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            classpath = [self.antlr_jar]
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        elif self.antlr_version == 'HEAD':
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            classpath = [
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                os.path.join(rootDir, 'tool', 'target', 'classes'),
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                os.path.join(rootDir, 'runtime', 'Java', 'target', 'classes')
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ]
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else:
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            classpath = [
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                os.path.join(rootDir, 'archive',
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                             'antlr-%s.jar' % self.antlr_version)
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ]
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        classpath.extend([
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            os.path.join(rootDir, 'lib', 'antlr-2.7.7.jar'),
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            os.path.join(rootDir, 'lib', 'stringtemplate-3.2.1.jar'),
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            os.path.join(rootDir, 'lib', 'ST-4.0.2.jar'),
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            os.path.join(rootDir, 'lib', 'junit-4.2.jar')
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ])
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        os.environ['CLASSPATH'] = ':'.join(classpath)
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        os.environ['ANTLRVERSION'] = self.antlr_version
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        suite = unittest.TestSuite()
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        loadFailures = []
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # collect tests from all tests/t*.py files
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        testFiles = []
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        test_glob = 't[0-9][0-9][0-9]*.py'
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for testPath in glob.glob(os.path.join(testDir, test_glob)):
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if testPath.endswith('Lexer.py') or testPath.endswith('Parser.py'):
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                continue
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # if a single testcase has been selected, filter out all other
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # tests
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (self.testcase is not None
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                and not os.path.basename(testPath)[:-3].startswith(self.testcase)):
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                continue
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            testFiles.append(testPath)
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        testFiles.sort()
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for testPath in testFiles:
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            testID = os.path.basename(testPath)[:-3]
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            try:
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                modFile, modPathname, modDescription \
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                         = imp.find_module(testID, [testDir])
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                testMod = imp.load_module(
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    testID, modFile, modPathname, modDescription)
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                suite.addTests(
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    unittest.defaultTestLoader.loadTestsFromModule(testMod))
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            except Exception:
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                buf = StringIO.StringIO()
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                traceback.print_exc(file=buf)
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                loadFailures.append(
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    (os.path.basename(testPath), buf.getvalue()))
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if self.xml_output:
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            import xmlrunner
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            runner = xmlrunner.XMLTestRunner(
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                stream=open(os.path.join(self.xml_output, 'functest.xml'), 'w'))
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else:
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            runner = unittest.TextTestRunner(verbosity=2)
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = runner.run(suite)
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for testName, error in loadFailures:
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            sys.stderr.write('\n' + '='*70 + '\n')
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            sys.stderr.write(
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "Failed to load test module %s\n" % testName
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            sys.stderr.write(error)
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            sys.stderr.write('\n')
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if not result.wasSuccessful() or loadFailures:
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            raise TestError(
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "Functional test suite failed!",
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversetup(name='antlr_python_runtime',
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      version='3.4',
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      packages=['antlr3'],
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      author="Benjamin Niemann",
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      author_email="pink@odahoda.de",
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      url="http://www.antlr.org/",
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      download_url="http://www.antlr.org/download.html",
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      license="BSD",
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      description="Runtime package for ANTLR3",
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      long_description=textwrap.dedent('''\
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      This is the runtime package for ANTLR3, which is required to use parsers
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      generated by ANTLR3.
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      '''),
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      cmdclass={'unittest': unittest,
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                'functest': functest,
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                'clean': clean
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                },
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      )
301