diff options
Diffstat (limited to 'tests/.svn/text-base/run_tests.py.svn-base')
-rw-r--r-- | tests/.svn/text-base/run_tests.py.svn-base | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/tests/.svn/text-base/run_tests.py.svn-base b/tests/.svn/text-base/run_tests.py.svn-base new file mode 100644 index 0000000..0a99af9 --- /dev/null +++ b/tests/.svn/text-base/run_tests.py.svn-base @@ -0,0 +1,221 @@ +""" +TestSuite + +Files/directories that comprise one test all have the same name, but a different extensions: +*.patch +*.from +*.to + +*.doctest - self contained doctest patch + +TODO: recheck input/output sources + +""" + +import os +import sys +import re +import shutil +import unittest +import copy +from os import listdir +from os.path import abspath, dirname, exists, join, isdir +from tempfile import mkdtemp + +verbose = False +if "-v" in sys.argv or "--verbose" in sys.argv: + verbose = True + + +#: full path for directory with tests +tests_dir = dirname(abspath(__file__)) + + +# import patch.py from parent directory +save_path = sys.path +sys.path.insert(0, dirname(tests_dir)) +import patch +sys.path = save_path + + +# ---------------------------------------------------------------------------- +class TestPatchFiles(unittest.TestCase): + """ + unittest hack - test* methods are generated by add_test_methods() function + below dynamicallt using information about *.patch files from tests directory + + """ + def _assert_files_equal(self, file1, file2): + f1 = f2 = None + try: + f1 = open(file1, "rb") + f2 = open(file2, "rb") + for line in f1: + self.assertEqual(line, f2.readline()) + + finally: + if f2: + f2.close() + if f1: + f1.close() + + def _assert_dirs_equal(self, dir1, dir2, ignore=[]): + """ compare dir1 with reference dir2 + .svn dirs are ignored + + """ + # recursion here + e2list = listdir(dir2) + for e1 in listdir(dir1): + if e1 == ".svn": + continue + e1path = join(dir1, e1) + e2path = join(dir2, e1) + self.assert_(exists(e1path)) + self.assert_(exists(e2path), "%s does not exist" % e2path) + self.assert_(isdir(e1path) == isdir(e2path)) + if not isdir(e1path): + self._assert_files_equal(e1path, e2path) + else: + self._assert_dirs_equal(e1path, e2path) + e2list.remove(e1) + for e2 in e2list: + if e2 == ".svn" or e2 in ignore: + continue + self.fail("extra file or directory: %s" % e2) + + + def _run_test(self, testname): + """ + boilerplate for running *.patch file tests + """ + + # 1. create temp test directory + # 2. copy files + # 3. execute file-based patch + # 4. compare results + # 5. cleanup on success + + tmpdir = mkdtemp(prefix="%s."%testname) + + patch_file = join(tmpdir, "%s.patch" % testname) + shutil.copy(join(tests_dir, "%s.patch" % testname), patch_file) + + from_src = join(tests_dir, "%s.from" % testname) + from_tgt = join(tmpdir, "%s.from" % testname) + + if not isdir(from_src): + shutil.copy(from_src, from_tgt) + else: + for e in listdir(from_src): + if e == ".svn": + continue + epath = join(from_src, e) + if not isdir(epath): + shutil.copy(epath, join(tmpdir, e)) + else: + shutil.copytree(epath, join(tmpdir, e)) + + + # 3. + # test utility as a whole + patch_tool = join(dirname(tests_dir), "patch.py") + save_cwd = os.getcwdu() + os.chdir(tmpdir) + if verbose: + ret = os.system('%s %s "%s"' % (sys.executable, patch_tool, patch_file)) + else: + ret = os.system('%s %s -q "%s"' % (sys.executable, patch_tool, patch_file)) + assert ret == 0, "Error %d running test %s" % (ret, testname) + os.chdir(save_cwd) + + + # 4. + # compare results + if not isdir(from_src): + self._assert_files_equal(join(tests_dir, "%s.to" % testname), from_tgt) + else: + # need recursive compare + self._assert_dirs_equal(join(tests_dir, "%s.to" % testname), tmpdir, "%s.patch" % testname) + + + + shutil.rmtree(tmpdir) + return 0 + + +def add_test_methods(cls): + """ + hack to generate test* methods in target class - one + for each *.patch file in tests directory + """ + + # list testcases - every test starts with number + # and add them as test* methods + testptn = re.compile(r"^(?P<name>\d{2,}.+)\.(?P<ext>[^\.]+)") + testset = sorted( set([testptn.match(e).group('name') for e in listdir(tests_dir) if testptn.match(e)]) ) + + for filename in testset: + methname = filename.replace(" ", "_") + def create_closure(): + name = filename + return lambda self: self._run_test(name) + setattr(cls, "test%s" % methname, create_closure()) + if verbose: + print "added test method %s to %s" % (methname, cls) +add_test_methods(TestPatchFiles) + +# ---------------------------------------------------------------------------- + +class TestCheckPatched(unittest.TestCase): + def setUp(self): + self.save_cwd = os.getcwdu() + os.chdir(tests_dir) + + def tearDown(self): + os.chdir(self.save_cwd) + + def test_patched_multiline(self): + pto = patch.fromfile(join(tests_dir, "01uni_multi.patch")) + os.chdir(join(tests_dir, "01uni_multi.to")) + self.assert_(pto.can_patch("updatedlg.cpp")) + + def test_can_patch_single_source(self): + pto2 = patch.fromfile(join(tests_dir, "02uni_newline.patch")) + self.assert_(pto2.can_patch("02uni_newline.from")) + + def test_can_patch_fails_on_target_file(self): + pto3 = patch.fromfile(join(tests_dir, "03trail_fname.patch")) + self.assertEqual(None, pto3.can_patch("03trail_fname.to")) + self.assertEqual(None, pto3.can_patch("not_in_source.also")) + + def test_multiline_false_on_other_file(self): + pto = patch.fromfile(join(tests_dir, "01uni_multi.patch")) + os.chdir(join(tests_dir, "01uni_multi.from")) + self.assertFalse(pto.can_patch("updatedlg.cpp")) + + def test_single_false_on_other_file(self): + pto3 = patch.fromfile(join(tests_dir, "03trail_fname.patch")) + self.assertFalse(pto3.can_patch("03trail_fname.from")) + + def test_can_patch_fails_even_if_file_in_targets_can_be_patched(self): + pto2 = patch.fromfile(join(tests_dir, "04can_patch.patch")) + self.assert_(not pto2.can_patch("04can_patch.to")) + +# ---------------------------------------------------------------------------- + +class TestPatchParse(unittest.TestCase): + def test_fromstring(self): + try: + f = open(join(tests_dir, "01uni_multi.patch"), "rb") + readstr = f.read() + finally: + f.close() + pto = patch.fromstring(readstr) + self.assertEqual(len(pto.source), 5) + +# ---------------------------------------------------------------------------- + + +if __name__ == '__main__': + unittest.main() |