📄 svnmerge_test.py
字号:
#!/usr/bin/env python# -*- coding: utf-8 -*-# Copyright (c) 2005, Giovanni Bajo# All rights reserved.## This program is free software; you can redistribute it and/or# modify it under the terms of the GNU General Public License# as published by the Free Software Foundation; either version 2# of the License, or (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USAimport sys, osimport typesimport reimport unittestfrom cStringIO import StringIOimport shutilimport svnmergeimport statimport atexitimport getopt# True/False constants are Python 2.2+try: True, Falseexcept NameError: True, False = 1, 0class TestCase_kwextract(unittest.TestCase): def test_basic(self): self.assertEqual(svnmerge.kwextract("$Rev: 134 rasky $"), "134 rasky") self.assertEqual(svnmerge.kwextract("$Date: 2005-09-25 13:45 CET+1$"), "2005-09-25 13:45 CET+1") def test_failure(self): self.assertEqual(svnmerge.kwextract("$Rev: $"), "<unknown>") self.assertEqual(svnmerge.kwextract("$Date$"), "<unknown>")class TestCase_launch(unittest.TestCase): if os.name == "nt": cmd = "dir" else: cmd = "ls" def test_basic(self): out = svnmerge.launch(self.cmd) self.assert_(out) for o in out: self.assertEqual(o[-1], "\n") def test_failure(self): self.assertRaises(svnmerge.LaunchError, svnmerge.launch, self.cmd*10) def test_failurecode(self): try: svnmerge.launch(self.cmd*10) except svnmerge.LaunchError, (ret, cmd, out): self.assertNotEqual(ret, 0) self.assertNotEqual(ret, None) self.assert_(out) self.assertEqual(cmd, self.cmd*10) else: self.fail("svnmerge.launch did not cause a LaunchError as expected")class TestCase_PrefixLines(unittest.TestCase): def test_basic(self): self.assertEqual("zz\n", svnmerge.prefix_lines("zz", "\n")) self.assertEqual("zzfoo\n", svnmerge.prefix_lines("zz", "foo\n")) self.assertEqual("zzfoo\nzzbar\n", svnmerge.prefix_lines("zz", "foo\nbar\n")) self.assertEqual("zz\nzzfoo\n", svnmerge.prefix_lines("zz", "\nfoo\n")) self.assertEqual("zz\nzzfoo\nzzbar\n", svnmerge.prefix_lines("zz", "\nfoo\nbar\n"))class TestCase_RevisionSet(unittest.TestCase): def test_constr_string(self): rs = svnmerge.RevisionSet("10- 15, 12-48,2 ") self.assert_(17 in rs) self.assert_(2 in rs) self.assert_(9 not in rs) rs = svnmerge.RevisionSet("10: 15, 12:48,2 ") self.assert_(17 in rs) self.assert_(2 in rs) self.assert_(9 not in rs) def test_constr_dict(self): rs = svnmerge.RevisionSet({18:1, 24:1, 25:1, 43:1}) self.assert_(24 in rs) self.assert_(18 in rs) self.assert_(44 not in rs) def test_constr_error(self): self.assertRaises(ValueError, svnmerge.RevisionSet, "10-12-15") self.assertRaises(ValueError, svnmerge.RevisionSet, "10;12-15") self.assertRaises(ValueError, svnmerge.RevisionSet, "10,foo,3-15") self.assertRaises(ValueError, svnmerge.RevisionSet, "10:12:15") self.assertRaises(ValueError, svnmerge.RevisionSet, "10;12:15") self.assertRaises(ValueError, svnmerge.RevisionSet, "10,foo,3:15") def test_normalized(self): rs = svnmerge.RevisionSet("8-15,16-18, 4-6, 9, 18, 1-1, 3-3") self.assertEqual(rs.normalized(), [(1,1), (3,6), (8,18)]) self.assertEqual(str(rs), "1,3-6,8-18") rs = svnmerge.RevisionSet("8:15,16:18, 4:6, 9, 18, 1:1, 3:3") self.assertEqual(rs.normalized(), [(1,1), (3,6), (8,18)]) self.assertEqual(str(rs), "1,3-6,8-18") def test_sorted(self): "Test the sorted() function of the RevisionSet class." rs = svnmerge.RevisionSet("8-15,16-18, 4-6, 9, 18, 1-1, 3-3") self.assertEqual(rs.sorted(), [1, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]) rs = svnmerge.RevisionSet("8:15,16:18, 4:6, 9, 18, 1:1, 3:3") self.assertEqual(rs.sorted(), [1, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]) def test_length(self): rs = svnmerge.RevisionSet("3-8") self.assertEqual(len(rs), 6) rs = svnmerge.RevisionSet("3-8,4-10") self.assertEqual(len(rs), 8) rs = svnmerge.RevisionSet("1,3,5") self.assertEqual(len(rs), 3) rs = svnmerge.RevisionSet("3:8") self.assertEqual(len(rs), 6) rs = svnmerge.RevisionSet("3:8,4:10") self.assertEqual(len(rs), 8) rs = svnmerge.RevisionSet("1,3,5") self.assertEqual(len(rs), 3) def test_iter(self): try: iter except NameError: pass else: rs = svnmerge.RevisionSet("4-13,1-5,34,20-22,18-21") self.assertEqual(list(iter(rs)), range(1,14)+range(18,23)+[34]) rs = svnmerge.RevisionSet("4:13,1:5,34,20:22,18:21") self.assertEqual(list(iter(rs)), range(1,14)+range(18,23)+[34]) def test_union(self): rs = svnmerge.RevisionSet("3-8,4-10") | svnmerge.RevisionSet("7-14,1") self.assertEqual(str(rs), "1,3-14") rs = svnmerge.RevisionSet("3:8,4:10") | svnmerge.RevisionSet("7:14,1") self.assertEqual(str(rs), "1,3-14") def test_subtraction(self): rs = svnmerge.RevisionSet("3-8,4-10") - svnmerge.RevisionSet("7-14,1") self.assertEqual(str(rs), "3-6") rs = svnmerge.RevisionSet("3:8,4:10") - svnmerge.RevisionSet("7:14,1") self.assertEqual(str(rs), "3-6") def test_constr_empty(self): rs = svnmerge.RevisionSet("") self.assertEqual(str(rs), "")class TestCase_MinimalMergeIntervals(unittest.TestCase): def test_basic(self): rs = svnmerge.RevisionSet("4-8,12,18,24") phantom = svnmerge.RevisionSet("8-11,13-16,19-23") revs = svnmerge.minimal_merge_intervals(rs, phantom) self.assertEqual(revs, [(4,12), (18,24)])class TestCase_SvnMerge(unittest.TestCase): def svnmerge(self, cmds, *args, **kwargs): return self.svnmerge2(cmds.split(), *args, **kwargs) def svnmerge2(self, args, error=False, match=None, nonmatch=None): out = StringIO() sys.stdout = sys.stderr = out try: try: # Clear svnmerge's internal cache before running any # commands. svnmerge._cache_svninfo = {} ret = svnmerge.main(args) except SystemExit, e: ret = e.code finally: sys.stdout = sys.__stdout__ sys.stderr = sys.__stderr__ if ret is None: ret = 0 if error: self.assertNotEqual(ret, 0, "svnmerge did not fail, with this output:\n%s" % out.getvalue()) else: self.assertEqual(ret, 0, "svnmerge failed, with this output:\n%s" % out.getvalue()) if match is not None: self.assert_(re.search(match, out.getvalue()), "pattern %r not found in output:\n%s" % (match, out.getvalue())) if nonmatch is not None: self.assert_(not re.search(nonmatch, out.getvalue()), "pattern %r found in output:\n%s" % (nonmatch, out.getvalue())) return out.getvalue() def _parseoutput(self, ret, out, error=False, match=None, nonmatch=None): if error: self.assertNotEqual(ret, 0, "svnmerge did not fail, with this output:\n%s" % out) else: self.assertEqual(ret, 0, "svnmerge failed, with this output:\n%s" % out) if match is not None: self.assert_(re.search(match, out), "pattern %r not found in output:\n%s" % (match, out)) if nonmatch is not None: self.assert_(not re.search(nonmatch, out), "pattern %r found in output:\n%s" % (nonmatch, out)) return out def launch(self, cmd, **kwargs): try: out = svnmerge.launch(cmd, split_lines=False) except svnmerge.LaunchError, (ret, cmd, out): return self._parseoutput(ret, out, **kwargs) return self._parseoutput(0, out, **kwargs)class TestCase_CommandLineOptions(TestCase_SvnMerge): def test_empty(self): self.svnmerge("") def test_help_commands(self): self.svnmerge("help") self.svnmerge("--help") self.svnmerge("-h") for cmd in svnmerge.command_table.keys(): self.svnmerge("help %s" % cmd) self.svnmerge("%s --help" % cmd) self.svnmerge("%s -h" % cmd) def test_wrong_commands(self): self.svnmerge("asijdoiasjd", error=True) self.svnmerge("help asijdoiasjd", error=True) def test_wrong_option(self): self.svnmerge("--asdsad", error=True) self.svnmerge("help --asdsad", error=True) self.svnmerge("init --asdsad", error=True) self.svnmerge("--asdsad init", error=True) def test_version(self): out = self.svnmerge("--version") self.assert_(out.find("Giovanni Bajo") >= 0) out = self.svnmerge("-V") self.assert_(out.find("Giovanni Bajo") >= 0) out = self.svnmerge("init -V") self.assert_(out.find("Giovanni Bajo") >= 0) def testOptionOrder(self): """Make sure you can intermix command name, arguments and options in any order.""" self.svnmerge("--log avail", error=True, match=r"no integration info") # accepted self.svnmerge("-l avail", error=True, match=r"no integration info") # accepted self.svnmerge("-r123 merge", error=True, match=r"no integration info") # accepted self.svnmerge("-s -v -r92481 merge", error=True, match=r"no integration info") # accepted self.svnmerge("--log merge", error=True, match=r"option --log not recognized") self.svnmerge("--diff foobar", error=True, match=r"foobar") # This requires gnu_getopt support to be parsed if hasattr(getopt, "gnu_getopt"): self.svnmerge("-r123 merge . --log", error=True, match=r"option --log not recognized")def temp_path(): try: return os.environ["TEMP"] except KeyError: pass if os.name == "posix": return "/tmp" return "."def rmtree(path): def onerror(func, path, excinfo): if func in [os.remove, os.rmdir]: if os.path.exists(path): os.chmod(path, stat.S_IWRITE) func(path) if os.path.isdir(path): shutil.rmtree(path, onerror=onerror)def get_template_path(): p = os.path.join(temp_path(), "__svnmerge_test_template") return os.path.abspath(p)def get_test_path(): p = os.path.join(temp_path(), "__svnmerge_test") return os.path.abspath(p)def abspath_to_url(path): assert path == os.path.abspath(path) path = path.replace("\\", "/") if path[0] != '/': path = '/' + path return "file://" + pathclass TestCase_TestRepo(TestCase_SvnMerge): def setUp(self): """Creates a working copy of a branch at r13 with the following structure, containing revisions (3-6, 13): test-branch/ test1 test2 test3 ...from a repository with the following structure: Path Created rev
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -