Index: Lib/test/test_keyword.py =================================================================== --- Lib/test/test_keyword.py (revision 0) +++ Lib/test/test_keyword.py (revision 0) @@ -0,0 +1,204 @@ +import keyword +import unittest +from test import support +import io +import os +import sys +import shutil + +KEYWORD_FILE = '../../Lib/keyword.py' +GRAMMAR_FILE = '../../Python/graminit.c' +TEST_PY_FILE = 'keyword_test.py' +GRAMMAR_TEST_FILE = 'graminit_test.c' + +PY_FILE_WITHOUT_KEYWORDS = 'minimal_keyword.py' +EMPTY_FILE = 'empty.txt' +NONEXISTANT_FILE = 'not_here.txt' +STDERR_FILE = 'err.txt' + +class TestKeyword_iskeyword(unittest.TestCase): + def test_true_is_a_keyword(self): + self.assertTrue(keyword.iskeyword('True')) + + def test_pass_in_uppercase_is_not_a_keyword(self): + self.assertFalse(keyword.iskeyword('TRUE')) + + def test_none_value_in_not_a_keyword(self): + self.assertFalse(keyword.iskeyword(None)) + + def test_changing_the_kwlist_does_not_affect_iskeyword(self): + keyword.kwlist = ['its', 'all', 'eggs', 'beans', 'and', 'a', 'fried', 'slice'] + self.assertFalse(keyword.iskeyword('eggs')) + +class TestKeyword_KeywordGenerator_NormalArgs(unittest.TestCase): + def setUp(self): + remove_keywords_from_py_file(KEYWORD_FILE, TEST_PY_FILE) + + self.lines_before = get_lines(TEST_PY_FILE) + self.lines_expected = get_lines(KEYWORD_FILE) + + self.res = os.system("'../../python.exe' {0} {1} {2} >/dev/null 2>/dev/null".format( + KEYWORD_FILE, + GRAMMAR_FILE, + TEST_PY_FILE)) + + self.lines_after = get_lines(TEST_PY_FILE) + + def tearDown(self): + try: + os.remove(TEST_PY_FILE) + except: pass + + def test_keywords_script_excecuted_successfully(self): + self.assertEqual(0, self.res) + + def test_output_file_has_keyword_content(self): + self.assertGreater(len(self.lines_after), 0) + + def test_output_keywords_should_be_the_same_as_input(self): + self.assertEqual(self.lines_expected, self.lines_after) + + def test_output_file_should_have_at_least_25_keywords(self): + self.assertGreater(len(self.lines_after), len(self.lines_before) + 25) + +class TestKeyword_KeywordGenerator_Grammar(unittest.TestCase): + def setUp(self): + remove_keywords_from_py_file(KEYWORD_FILE, TEST_PY_FILE) + make_test_grammar_file() + + self.res = os.system("'../../python.exe' {0} {1} {2} >/dev/null 2>/dev/null".format( + KEYWORD_FILE, + GRAMMAR_TEST_FILE, + TEST_PY_FILE)) + + def tearDown(self): + try: + os.remove(TEST_PY_FILE) + os.remove(GRAMMAR_TEST_FILE) + except: pass + + def test_all_valid_keywords_were_found(self): + self.assertEqual(get_grammar_test_keywords(), get_keywords_in_py_file()) + + def test_keywords_are_sorted(self): + sorted_keywords = get_keywords_in_py_file() + sorted_keywords.sort() + self.assertEqual(sorted_keywords, get_keywords_in_py_file()) + +class TestKeyword_KeywordGenerator_BadInputs(unittest.TestCase): + def setUp(self): + shutil.copyfile(KEYWORD_FILE, TEST_PY_FILE) + remove_keywords_from_py_file(KEYWORD_FILE, PY_FILE_WITHOUT_KEYWORDS) + + with open(EMPTY_FILE, 'w') as fp: + fp.write('') + + def tearDown(self): + try: + os.remove(TEST_PY_FILE) + os.remove(EMPTY_FILE) + os.remove(STDERR_FILE) + except: pass + + def test_a_grammar_file_has_no_data_takes_out_all_the_keywords(self): + res = os.system("'../../python.exe' {0} {1} {2} >/dev/null 2>/dev/null".format( + KEYWORD_FILE, + EMPTY_FILE, + TEST_PY_FILE)) + + lines_expected = get_lines(PY_FILE_WITHOUT_KEYWORDS) + lines_after = get_lines(TEST_PY_FILE) + + self.assertEqual(0, res) + self.assertEqual(lines_expected, lines_after) + + def test_a_keywords_py_file_with_no_data_is_handled_with_an_exceiption(self): + res = os.system("'../../python.exe' {0} {1} {2} >/dev/null 2>{3}".format( + KEYWORD_FILE, + GRAMMAR_FILE, + EMPTY_FILE, + STDERR_FILE)) + + self.assertNotEqual(0, res) + self.assertRegexpMatches(self.read_stderr_text(), r'target does not contain format markers') + + def test_a_non_existant_grammar_file_causes_an_unhandled_exception(self): + res = os.system("'../../python.exe' {0} {1} {2} >/dev/null 2>/dev/null".format( + KEYWORD_FILE, + NONEXISTANT_FILE, + KEYWORD_FILE)) + + self.assertNotEqual(0, res) + + def test_a_non_existant_keywords_file_causes_an_unhandled_exception(self): + res = os.system("'../../python.exe' {0} {1} {2} >/dev/null 2>/dev/null".format( + KEYWORD_FILE, + GRAMMAR_FILE, + NONEXISTANT_FILE)) + + self.assertNotEqual(0, res) + + def read_stderr_text(self): + with open(STDERR_FILE, 'r') as fp: + return fp.read() + +def get_lines(filename): + with open(filename, 'r') as fp: + return fp.readlines() + +def remove_keywords_from_py_file(source_file, dest_file): + lines = get_lines(source_file) + + start = lines.index("#--start keywords--\n") + 1 + end = lines.index("#--end keywords--\n") + + with open(dest_file, 'w') as fp: + fp.writelines(lines[:start] + lines[end:]) + +def get_keywords_in_py_file(): + lines = get_lines(TEST_PY_FILE) + start = lines.index("#--start keywords--\n") + 1 + end = lines.index("#--end keywords--\n") + return lines[start:end] + +def make_test_grammar_file(): + grammar = \ +""" {2, 1}, + {11, "encoding_decl", 0, 2, states_79, + "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + {1, "jello"}, + {326, 0}, + {1, "turnip"}, + {1, "This one is tab indented" + {278, 0}, + {1, "crazy but legal" +"also legal" {1, " + {1, "continue"}, + {1, "lemon"}, + {1, "tomato"}, +{1, "wigii"}, + {1, 'no good'} + {283, 0}, + {1, "too many spaces"}""" + + with open(GRAMMAR_TEST_FILE, 'w') as fp: + fp.writelines(grammar) + +def get_grammar_test_keywords(): + return [ + " 'This one is tab indented',\n", + " 'also legal',\n", + " 'continue',\n", + " 'crazy but legal',\n", + " 'jello',\n", + " 'lemon',\n", + " 'tomato',\n", + " 'turnip',\n", + " 'wigii',\n" + ] + +def test_main(): + support.run_unittest(__name__) + +if __name__ == "__main__": + test_main()