22
22
from bzrlib import (
27
26
from bzrlib.tests.features import backslashdir_feature
30
class TestBasics(tests.TestCase):
33
super(TestBasics, self).setUp()
34
self.tool = mergetools.MergeTool('sometool',
35
'/path/to/tool --opt {base} -x {this} {other} --stuff {result}')
37
def test_get_commandline(self):
39
'/path/to/tool --opt {base} -x {this} {other} --stuff {result}',
40
self.tool.command_line)
42
def test_set_commandline(self):
43
self.tool.command_line = "/path/to/tool blah"
44
self.assertEqual("/path/to/tool blah", self.tool.command_line)
45
self.assertEqual(['/path/to/tool', 'blah'], self.tool._cmd_list)
47
def test_get_name(self):
48
self.assertEqual('sometool', self.tool.name)
51
class TestUnicodeBasics(tests.TestCase):
54
super(TestUnicodeBasics, self).setUp()
55
self.tool = mergetools.MergeTool(
57
u'/path/to/b\u0414r --opt {base} -x {this} {other}'
60
def test_get_commandline(self):
62
u'/path/to/b\u0414r --opt {base} -x {this} {other}'
64
self.tool.command_line)
66
def test_get_name(self):
67
self.assertEqual(u'someb\u0414r', self.tool.name)
70
class TestMergeToolOperations(tests.TestCaseInTempDir):
72
def test_filename_substitution(self):
73
def dummy_invoker(executable, args, cleanup):
74
self._commandline = [executable] + args
76
mt = mergetools.MergeTool('kdiff3',
77
'kdiff3 {base} {this} {other} -o {result}')
78
mt.invoke('test.txt', dummy_invoker)
29
class TestFilenameSubstitution(tests.TestCaseInTempDir):
31
def test_simple_filename(self):
32
cmd_list = ['kdiff3', '{base}', '{this}', '{other}', '-o', '{result}']
33
args, tmpfile = mergetools._subst_filename(cmd_list, 'test.txt')
87
mt.invoke('file with space.txt', dummy_invoker)
90
"file with space.txt.BASE",
91
"file with space.txt.THIS",
92
"file with space.txt.OTHER",
94
"file with space.txt"],
96
mt.invoke('file with "space and quotes".txt', dummy_invoker)
99
"file with \"space and quotes\".txt.BASE",
100
"file with \"space and quotes\".txt.THIS",
101
"file with \"space and quotes\".txt.OTHER",
103
"file with \"space and quotes\".txt"],
106
def test_expand_commandline_tempfile(self):
107
def dummy_invoker(executable, args, cleanup):
108
self.assertEqual('some_tool', executable)
109
self.failUnlessExists(args[0])
111
self._tmp_file = args[0]
43
def test_spaces(self):
44
cmd_list = ['kdiff3', '{base}', '{this}', '{other}', '-o', '{result}']
45
args, tmpfile = mergetools._subst_filename(cmd_list,
46
'file with space.txt')
49
'file with space.txt.BASE',
50
'file with space.txt.THIS',
51
'file with space.txt.OTHER',
53
'file with space.txt'],
56
def test_spaces_and_quotes(self):
57
cmd_list = ['kdiff3', '{base}', '{this}', '{other}', '-o', '{result}']
58
args, tmpfile = mergetools._subst_filename(cmd_list,
59
'file with "space and quotes".txt')
62
'file with "space and quotes".txt.BASE',
63
'file with "space and quotes".txt.THIS',
64
'file with "space and quotes".txt.OTHER',
66
'file with "space and quotes".txt'],
69
def test_tempfile(self):
112
70
self.build_tree(('test.txt', 'test.txt.BASE', 'test.txt.THIS',
113
71
'test.txt.OTHER'))
114
mt = mergetools.MergeTool('some_tool', 'some_tool {this_temp}')
115
mt.invoke('test.txt', dummy_invoker)
116
self.failIfExists(self._tmp_file)
118
def test_is_available_full_tool_path(self):
119
mt = mergetools.MergeTool(None, sys.executable)
120
self.assertTrue(mt.is_available())
122
def test_is_available_tool_on_path(self):
123
mt = mergetools.MergeTool(None, os.path.basename(sys.executable))
124
self.assertTrue(mt.is_available())
126
def test_is_available_nonexistent(self):
127
mt = mergetools.MergeTool(None, "ThisExecutableShouldReallyNotExist")
128
self.assertFalse(mt.is_available())
130
def test_is_available_non_executable(self):
72
cmd_list = ['some_tool', '{this_temp}']
73
args, tmpfile = mergetools._subst_filename(cmd_list, 'test.txt')
74
self.failUnlessExists(tmpfile)
78
class TestCheckAvailability(tests.TestCaseInTempDir):
80
def test_full_path(self):
81
self.assertTrue(mergetools.check_availability(sys.executable))
83
def test_exe_on_path(self):
84
self.assertTrue(mergetools.check_availability(
85
os.path.basename(sys.executable)))
87
def test_nonexistent(self):
88
self.assertFalse(mergetools.check_availability('DOES NOT EXIST'))
90
def test_non_executable(self):
131
91
f, name = tempfile.mkstemp()
133
93
self.log('temp filename: %s', name)
134
mt = mergetools.MergeTool('temp', name)
135
self.assertFalse(mt.is_available())
94
self.assertFalse(mergetools.check_availability(name))
100
class TestInvoke(tests.TestCaseInTempDir):
102
super(tests.TestCaseInTempDir, self).setUp()
105
self.build_tree_contents((
106
('test.txt', 'stuff'),
107
('test.txt.BASE', 'base stuff'),
108
('test.txt.THIS', 'this stuff'),
109
('test.txt.OTHER', 'other stuff'),
112
def test_success(self):
113
def dummy_invoker(exe, args, cleanup):
118
retcode = mergetools.invoke('tool {result}', 'test.txt', dummy_invoker)
119
self.assertEqual(0, retcode)
120
self.assertEqual('tool', self._exe)
121
self.assertEqual(['test.txt'], self._args)
123
def test_failure(self):
124
def dummy_invoker(exe, args, cleanup):
129
retcode = mergetools.invoke('tool {result}', 'test.txt', dummy_invoker)
130
self.assertEqual(1, retcode)
131
self.assertEqual('tool', self._exe)
132
self.assertEqual(['test.txt'], self._args)
134
def test_success_tempfile(self):
135
def dummy_invoker(exe, args, cleanup):
138
self.failUnlessExists(args[0])
139
f = open(args[0], 'wt')
140
f.write('temp stuff')
144
retcode = mergetools.invoke('tool {this_temp}', 'test.txt',
146
self.assertEqual(0, retcode)
147
self.assertEqual('tool', self._exe)
148
self.failIfExists(self._args[0])
149
self.assertFileEqual('temp stuff', 'test.txt')
151
def test_failure_tempfile(self):
152
def dummy_invoker(exe, args, cleanup):
155
self.failUnlessExists(args[0])
157
f = open(args[0], 'wt')
159
f.write('temp stuff')
163
retcode = mergetools.invoke('tool {this_temp}', 'test.txt',
165
self.assertEqual(1, retcode)
166
self.assertEqual('tool', self._exe)
167
self.assertFileEqual('stuff', 'test.txt')