12 import lit
.Test
as Test
13 from lit
.TestRunner
import ParserKind
, IntegratedTestKeywordParser
, \
14 parseIntegratedTestScript
17 class TestIntegratedTestKeywordParser(unittest
.TestCase
):
21 def load_keyword_parser_lit_tests():
23 Create and load the LIT test suite and test objects used by
24 TestIntegratedTestKeywordParser
26 # Create the global config object.
27 lit_config
= lit
.LitConfig
.LitConfig(progname
='lit',
31 valgrindLeakCheck
=False,
36 platform
.system() == 'Windows'),
38 TestIntegratedTestKeywordParser
.litConfig
= lit_config
39 # Perform test discovery.
40 test_path
= os
.path
.dirname(os
.path
.dirname(__file__
))
41 inputs
= [os
.path
.join(test_path
, 'Inputs/testrunner-custom-parsers/')]
42 assert os
.path
.isdir(inputs
[0])
43 run
= lit
.run
.Run(lit_config
,
44 lit
.discovery
.find_tests_for_inputs(lit_config
, inputs
))
45 assert len(run
.tests
) == 1 and "there should only be one test"
46 TestIntegratedTestKeywordParser
.inputTestCase
= run
.tests
[0]
50 def custom_parse(line_number
, line
, output
):
53 output
+= [part
for part
in line
.split(' ') if part
.strip()]
57 IntegratedTestKeywordParser("MY_TAG.", ParserKind
.TAG
),
58 IntegratedTestKeywordParser("MY_DNE_TAG.", ParserKind
.TAG
),
59 IntegratedTestKeywordParser("MY_LIST:", ParserKind
.LIST
),
60 IntegratedTestKeywordParser("MY_BOOL:", ParserKind
.BOOLEAN_EXPR
),
61 IntegratedTestKeywordParser("MY_RUN:", ParserKind
.COMMAND
),
62 IntegratedTestKeywordParser("MY_CUSTOM:", ParserKind
.CUSTOM
,
68 def get_parser(parser_list
, keyword
):
70 if p
.keyword
== keyword
:
72 assert False and "parser not found"
75 def parse_test(parser_list
):
76 script
= parseIntegratedTestScript(
77 TestIntegratedTestKeywordParser
.inputTestCase
,
78 additional_parsers
=parser_list
, require_script
=False)
79 assert not isinstance(script
, lit
.Test
.Result
)
80 assert isinstance(script
, list)
81 assert len(script
) == 0
84 parsers
= self
.make_parsers()
85 self
.parse_test(parsers
)
86 tag_parser
= self
.get_parser(parsers
, 'MY_TAG.')
87 dne_tag_parser
= self
.get_parser(parsers
, 'MY_DNE_TAG.')
88 self
.assertTrue(tag_parser
.getValue())
89 self
.assertFalse(dne_tag_parser
.getValue())
92 parsers
= self
.make_parsers()
93 self
.parse_test(parsers
)
94 list_parser
= self
.get_parser(parsers
, 'MY_LIST:')
95 self
.assertEqual(list_parser
.getValue(),
96 ['one', 'two', 'three', 'four'])
98 def test_commands(self
):
99 parsers
= self
.make_parsers()
100 self
.parse_test(parsers
)
101 cmd_parser
= self
.get_parser(parsers
, 'MY_RUN:')
102 value
= cmd_parser
.getValue()
103 self
.assertEqual(len(value
), 2) # there are only two run lines
104 self
.assertEqual(value
[0].strip(), "%dbg(MY_RUN: at line 4) baz")
105 self
.assertEqual(value
[1].strip(), "%dbg(MY_RUN: at line 7) foo bar")
107 def test_boolean(self
):
108 parsers
= self
.make_parsers()
109 self
.parse_test(parsers
)
110 bool_parser
= self
.get_parser(parsers
, 'MY_BOOL:')
111 value
= bool_parser
.getValue()
112 self
.assertEqual(len(value
), 2) # there are only two run lines
113 self
.assertEqual(value
[0].strip(), "a && (b)")
114 self
.assertEqual(value
[1].strip(), "d")
116 def test_boolean_unterminated(self
):
117 parsers
= self
.make_parsers() + \
118 [IntegratedTestKeywordParser("MY_BOOL_UNTERMINATED:", ParserKind
.BOOLEAN_EXPR
)]
120 self
.parse_test(parsers
)
121 self
.fail('expected exception')
122 except ValueError as e
:
123 self
.assertIn("Test has unterminated MY_BOOL_UNTERMINATED: lines", str(e
))
126 def test_custom(self
):
127 parsers
= self
.make_parsers()
128 self
.parse_test(parsers
)
129 custom_parser
= self
.get_parser(parsers
, 'MY_CUSTOM:')
130 value
= custom_parser
.getValue()
131 self
.assertEqual(value
, ['a', 'b', 'c'])
133 def test_bad_keywords(self
):
134 def custom_parse(line_number
, line
, output
):
138 IntegratedTestKeywordParser("TAG_NO_SUFFIX", ParserKind
.TAG
),
139 self
.fail("TAG_NO_SUFFIX failed to raise an exception")
140 except ValueError as e
:
142 except BaseException
as e
:
143 self
.fail("TAG_NO_SUFFIX raised the wrong exception: %r" % e
)
146 IntegratedTestKeywordParser("TAG_WITH_COLON:", ParserKind
.TAG
),
147 self
.fail("TAG_WITH_COLON: failed to raise an exception")
148 except ValueError as e
:
150 except BaseException
as e
:
151 self
.fail("TAG_WITH_COLON: raised the wrong exception: %r" % e
)
154 IntegratedTestKeywordParser("LIST_WITH_DOT.", ParserKind
.LIST
),
155 self
.fail("LIST_WITH_DOT. failed to raise an exception")
156 except ValueError as e
:
158 except BaseException
as e
:
159 self
.fail("LIST_WITH_DOT. raised the wrong exception: %r" % e
)
162 IntegratedTestKeywordParser("CUSTOM_NO_SUFFIX",
163 ParserKind
.CUSTOM
, custom_parse
),
164 self
.fail("CUSTOM_NO_SUFFIX failed to raise an exception")
165 except ValueError as e
:
167 except BaseException
as e
:
168 self
.fail("CUSTOM_NO_SUFFIX raised the wrong exception: %r" % e
)
170 # Both '.' and ':' are allowed for CUSTOM keywords.
172 IntegratedTestKeywordParser("CUSTOM_WITH_DOT.",
173 ParserKind
.CUSTOM
, custom_parse
),
174 except BaseException
as e
:
175 self
.fail("CUSTOM_WITH_DOT. raised an exception: %r" % e
)
177 IntegratedTestKeywordParser("CUSTOM_WITH_COLON:",
178 ParserKind
.CUSTOM
, custom_parse
),
179 except BaseException
as e
:
180 self
.fail("CUSTOM_WITH_COLON: raised an exception: %r" % e
)
183 IntegratedTestKeywordParser("CUSTOM_NO_PARSER:",
185 self
.fail("CUSTOM_NO_PARSER: failed to raise an exception")
186 except ValueError as e
:
188 except BaseException
as e
:
189 self
.fail("CUSTOM_NO_PARSER: raised the wrong exception: %r" % e
)
191 if __name__
== '__main__':
192 TestIntegratedTestKeywordParser
.load_keyword_parser_lit_tests()
193 unittest
.main(verbosity
=2)