1# RUN: %{python} %s 2# 3# END. 4 5 6import unittest 7import platform 8import os.path 9import tempfile 10 11import lit 12from lit.TestRunner import ParserKind, IntegratedTestKeywordParser, \ 13 parseIntegratedTestScript 14 15 16class TestIntegratedTestKeywordParser(unittest.TestCase): 17 inputTestCase = None 18 19 @staticmethod 20 def load_keyword_parser_lit_tests(): 21 """ 22 Create and load the LIT test suite and test objects used by 23 TestIntegratedTestKeywordParser 24 """ 25 # Create the global config object. 26 lit_config = lit.LitConfig.LitConfig(progname='lit', 27 path=[], 28 quiet=False, 29 useValgrind=False, 30 valgrindLeakCheck=False, 31 valgrindArgs=[], 32 noExecute=False, 33 debug=False, 34 isWindows=( 35 platform.system() == 'Windows'), 36 params={}) 37 TestIntegratedTestKeywordParser.litConfig = lit_config 38 # Perform test discovery. 39 test_path = os.path.dirname(os.path.dirname(__file__)) 40 inputs = [os.path.join(test_path, 'Inputs/testrunner-custom-parsers/')] 41 assert os.path.isdir(inputs[0]) 42 run = lit.run.Run(lit_config, 43 lit.discovery.find_tests_for_inputs(lit_config, inputs)) 44 assert len(run.tests) == 1 and "there should only be one test" 45 TestIntegratedTestKeywordParser.inputTestCase = run.tests[0] 46 47 @staticmethod 48 def make_parsers(): 49 def custom_parse(line_number, line, output): 50 if output is None: 51 output = [] 52 output += [part for part in line.split(' ') if part.strip()] 53 return output 54 55 return [ 56 IntegratedTestKeywordParser("MY_TAG.", ParserKind.TAG), 57 IntegratedTestKeywordParser("MY_DNE_TAG.", ParserKind.TAG), 58 IntegratedTestKeywordParser("MY_LIST:", ParserKind.LIST), 59 IntegratedTestKeywordParser("MY_RUN:", ParserKind.COMMAND), 60 IntegratedTestKeywordParser("MY_CUSTOM:", ParserKind.CUSTOM, 61 custom_parse) 62 ] 63 64 @staticmethod 65 def get_parser(parser_list, keyword): 66 for p in parser_list: 67 if p.keyword == keyword: 68 return p 69 assert False and "parser not found" 70 71 @staticmethod 72 def parse_test(parser_list): 73 script = parseIntegratedTestScript( 74 TestIntegratedTestKeywordParser.inputTestCase, 75 additional_parsers=parser_list, require_script=False) 76 assert not isinstance(script, lit.Test.Result) 77 assert isinstance(script, list) 78 assert len(script) == 0 79 80 def test_tags(self): 81 parsers = self.make_parsers() 82 self.parse_test(parsers) 83 tag_parser = self.get_parser(parsers, 'MY_TAG.') 84 dne_tag_parser = self.get_parser(parsers, 'MY_DNE_TAG.') 85 self.assertTrue(tag_parser.getValue()) 86 self.assertFalse(dne_tag_parser.getValue()) 87 88 def test_lists(self): 89 parsers = self.make_parsers() 90 self.parse_test(parsers) 91 list_parser = self.get_parser(parsers, 'MY_LIST:') 92 self.assertItemsEqual(list_parser.getValue(), 93 ['one', 'two', 'three', 'four']) 94 95 def test_commands(self): 96 parsers = self.make_parsers() 97 self.parse_test(parsers) 98 cmd_parser = self.get_parser(parsers, 'MY_RUN:') 99 value = cmd_parser.getValue() 100 self.assertEqual(len(value), 2) # there are only two run lines 101 self.assertEqual(value[0].strip(), 'baz') 102 self.assertEqual(value[1].strip(), 'foo bar') 103 104 def test_custom(self): 105 parsers = self.make_parsers() 106 self.parse_test(parsers) 107 custom_parser = self.get_parser(parsers, 'MY_CUSTOM:') 108 value = custom_parser.getValue() 109 self.assertItemsEqual(value, ['a', 'b', 'c']) 110 111 112if __name__ == '__main__': 113 TestIntegratedTestKeywordParser.load_keyword_parser_lit_tests() 114 unittest.main(verbosity=2) 115