Commit | Line | Data |
---|---|---|
9cf643d1 PP |
1 | # The MIT License (MIT) |
2 | # | |
3 | # Copyright (c) 2016 Philippe Proulx <pproulx@efficios.com> | |
4 | # | |
5 | # Permission is hereby granted, free of charge, to any person obtaining a copy | |
6 | # of this software and associated documentation files (the "Software"), to deal | |
7 | # in the Software without restriction, including without limitation the rights | |
8 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
9 | # copies of the Software, and to permit persons to whom the Software is | |
10 | # furnished to do so, subject to the following conditions: | |
11 | # | |
12 | # The above copyright notice and this permission notice shall be included in | |
13 | # all copies or substantial portions of the Software. | |
14 | # | |
15 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
16 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
17 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
18 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
19 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
20 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
21 | # THE SOFTWARE. | |
22 | ||
23 | from tap import TAPTestRunner | |
24 | import unittest | |
25 | import sys | |
274a82ad | 26 | import argparse |
9cf643d1 PP |
27 | |
28 | ||
29 | if __name__ == '__main__': | |
274a82ad SM |
30 | argparser = argparse.ArgumentParser() |
31 | argparser.add_argument('-f', '--failfast', | |
32 | help='Stop on first fail or error', | |
33 | action='store_true') | |
a818a617 | 34 | |
274a82ad SM |
35 | argparser.add_argument('start_dir', |
36 | help='Base directory where to search for tests', | |
37 | type=str) | |
a818a617 FD |
38 | |
39 | mut_exclu_group = argparser.add_mutually_exclusive_group(required=True) | |
40 | ||
41 | mut_exclu_group.add_argument('-p', '--pattern', | |
42 | help='Glob-style pattern of test files to run ' | |
43 | '(e.g. test_event*.py)', | |
44 | type=str) | |
45 | ||
46 | mut_exclu_group.add_argument('-t', '--test-case', | |
47 | help='Run a specfic test module name, test class ' | |
48 | 'name, or test method name ' | |
49 | '(e.g. test_event.EventTestCase.test_clock_value)', | |
50 | type=str) | |
51 | ||
274a82ad SM |
52 | |
53 | args = argparser.parse_args() | |
54 | ||
9cf643d1 | 55 | loader = unittest.TestLoader() |
b83084f5 | 56 | |
274a82ad SM |
57 | start_dir = args.start_dir |
58 | pattern = args.pattern | |
59 | failfast = args.failfast | |
a818a617 FD |
60 | test_case = args.test_case |
61 | ||
62 | if test_case: | |
63 | sys.path.append(start_dir) | |
64 | tests = loader.loadTestsFromName(test_case) | |
65 | elif pattern: | |
66 | tests = loader.discover(start_dir, pattern) | |
67 | else: | |
68 | # This will never happen because the mutual exclusion group has the | |
69 | # `required` parameter set to True. So one or the other must be set or | |
70 | # else it will fail to parse. | |
71 | sys.exit(1) | |
b83084f5 | 72 | |
644e0364 MJ |
73 | |
74 | if tests.countTestCases() < 1: | |
75 | print("No tests matching '%s' found in '%s'" % (pattern, start_dir)) | |
76 | sys.exit(1) | |
77 | ||
274a82ad | 78 | runner = TAPTestRunner(failfast=failfast) |
9cf643d1 PP |
79 | runner.set_stream(True) |
80 | runner.set_format('{method_name}') | |
81 | sys.exit(0 if runner.run(tests).wasSuccessful() else 1) |