##// END OF EJS Templates
py3: use '%d' for integers instead of '%s'...
Pulkit Goyal -
r39824:69defbb8 default
parent child Browse files
Show More
@@ -1,151 +1,151 b''
1 from __future__ import absolute_import, print_function
1 from __future__ import absolute_import, print_function
2 import collections
2 import collections
3 import struct
3 import struct
4 import unittest
4 import unittest
5
5
6 from mercurial import (
6 from mercurial import (
7 mdiff,
7 mdiff,
8 )
8 )
9
9
10 class diffreplace(
10 class diffreplace(
11 collections.namedtuple('diffreplace', 'start end from_ to')):
11 collections.namedtuple('diffreplace', 'start end from_ to')):
12 def __repr__(self):
12 def __repr__(self):
13 return 'diffreplace(%r, %r, %r, %r)' % self
13 return 'diffreplace(%r, %r, %r, %r)' % self
14
14
15 class BdiffTests(unittest.TestCase):
15 class BdiffTests(unittest.TestCase):
16
16
17 def assert_bdiff_applies(self, a, b):
17 def assert_bdiff_applies(self, a, b):
18 d = mdiff.textdiff(a, b)
18 d = mdiff.textdiff(a, b)
19 c = a
19 c = a
20 if d:
20 if d:
21 c = mdiff.patches(a, [d])
21 c = mdiff.patches(a, [d])
22 self.assertEqual(
22 self.assertEqual(
23 c, b, ("bad diff+patch result from\n %r to\n "
23 c, b, ("bad diff+patch result from\n %r to\n "
24 "%r: \nbdiff: %r\npatched: %r" % (a, b, d, c[:200])))
24 "%r: \nbdiff: %r\npatched: %r" % (a, b, d, c[:200])))
25
25
26 def assert_bdiff(self, a, b):
26 def assert_bdiff(self, a, b):
27 self.assert_bdiff_applies(a, b)
27 self.assert_bdiff_applies(a, b)
28 self.assert_bdiff_applies(b, a)
28 self.assert_bdiff_applies(b, a)
29
29
30 def test_bdiff_basic(self):
30 def test_bdiff_basic(self):
31 cases = [
31 cases = [
32 (b"a\nc\n\n\n\n", b"a\nb\n\n\n"),
32 (b"a\nc\n\n\n\n", b"a\nb\n\n\n"),
33 (b"a\nb\nc\n", b"a\nc\n"),
33 (b"a\nb\nc\n", b"a\nc\n"),
34 (b"", b""),
34 (b"", b""),
35 (b"a\nb\nc", b"a\nb\nc"),
35 (b"a\nb\nc", b"a\nb\nc"),
36 (b"a\nb\nc\nd\n", b"a\nd\n"),
36 (b"a\nb\nc\nd\n", b"a\nd\n"),
37 (b"a\nb\nc\nd\n", b"a\nc\ne\n"),
37 (b"a\nb\nc\nd\n", b"a\nc\ne\n"),
38 (b"a\nb\nc\n", b"a\nc\n"),
38 (b"a\nb\nc\n", b"a\nc\n"),
39 (b"a\n", b"c\na\nb\n"),
39 (b"a\n", b"c\na\nb\n"),
40 (b"a\n", b""),
40 (b"a\n", b""),
41 (b"a\n", b"b\nc\n"),
41 (b"a\n", b"b\nc\n"),
42 (b"a\n", b"c\na\n"),
42 (b"a\n", b"c\na\n"),
43 (b"", b"adjfkjdjksdhfksj"),
43 (b"", b"adjfkjdjksdhfksj"),
44 (b"", b"ab"),
44 (b"", b"ab"),
45 (b"", b"abc"),
45 (b"", b"abc"),
46 (b"a", b"a"),
46 (b"a", b"a"),
47 (b"ab", b"ab"),
47 (b"ab", b"ab"),
48 (b"abc", b"abc"),
48 (b"abc", b"abc"),
49 (b"a\n", b"a\n"),
49 (b"a\n", b"a\n"),
50 (b"a\nb", b"a\nb"),
50 (b"a\nb", b"a\nb"),
51 ]
51 ]
52 for a, b in cases:
52 for a, b in cases:
53 self.assert_bdiff(a, b)
53 self.assert_bdiff(a, b)
54
54
55 def showdiff(self, a, b):
55 def showdiff(self, a, b):
56 bin = mdiff.textdiff(a, b)
56 bin = mdiff.textdiff(a, b)
57 pos = 0
57 pos = 0
58 q = 0
58 q = 0
59 actions = []
59 actions = []
60 while pos < len(bin):
60 while pos < len(bin):
61 p1, p2, l = struct.unpack(">lll", bin[pos:pos + 12])
61 p1, p2, l = struct.unpack(">lll", bin[pos:pos + 12])
62 pos += 12
62 pos += 12
63 if p1:
63 if p1:
64 actions.append(a[q:p1])
64 actions.append(a[q:p1])
65 actions.append(diffreplace(p1, p2, a[p1:p2], bin[pos:pos + l]))
65 actions.append(diffreplace(p1, p2, a[p1:p2], bin[pos:pos + l]))
66 pos += l
66 pos += l
67 q = p2
67 q = p2
68 if q < len(a):
68 if q < len(a):
69 actions.append(a[q:])
69 actions.append(a[q:])
70 return actions
70 return actions
71
71
72 def test_issue1295(self):
72 def test_issue1295(self):
73 cases = [
73 cases = [
74 (b"x\n\nx\n\nx\n\nx\n\nz\n", b"x\n\nx\n\ny\n\nx\n\nx\n\nz\n",
74 (b"x\n\nx\n\nx\n\nx\n\nz\n", b"x\n\nx\n\ny\n\nx\n\nx\n\nz\n",
75 [b'x\n\nx\n\n',
75 [b'x\n\nx\n\n',
76 diffreplace(6, 6, b'', b'y\n\n'),
76 diffreplace(6, 6, b'', b'y\n\n'),
77 b'x\n\nx\n\nz\n']),
77 b'x\n\nx\n\nz\n']),
78 (b"x\n\nx\n\nx\n\nx\n\nz\n", b"x\n\nx\n\ny\n\nx\n\ny\n\nx\n\nz\n",
78 (b"x\n\nx\n\nx\n\nx\n\nz\n", b"x\n\nx\n\ny\n\nx\n\ny\n\nx\n\nz\n",
79 [b'x\n\nx\n\n',
79 [b'x\n\nx\n\n',
80 diffreplace(6, 6, b'', b'y\n\n'),
80 diffreplace(6, 6, b'', b'y\n\n'),
81 b'x\n\n',
81 b'x\n\n',
82 diffreplace(9, 9, b'', b'y\n\n'),
82 diffreplace(9, 9, b'', b'y\n\n'),
83 b'x\n\nz\n']),
83 b'x\n\nz\n']),
84 ]
84 ]
85 for old, new, want in cases:
85 for old, new, want in cases:
86 self.assertEqual(self.showdiff(old, new), want)
86 self.assertEqual(self.showdiff(old, new), want)
87
87
88 def test_issue1295_varies_on_pure(self):
88 def test_issue1295_varies_on_pure(self):
89 # we should pick up abbbc. rather than bc.de as the longest match
89 # we should pick up abbbc. rather than bc.de as the longest match
90 got = self.showdiff(b"a\nb\nb\nb\nc\n.\nd\ne\n.\nf\n",
90 got = self.showdiff(b"a\nb\nb\nb\nc\n.\nd\ne\n.\nf\n",
91 b"a\nb\nb\na\nb\nb\nb\nc\n.\nb\nc\n.\nd\ne\nf\n")
91 b"a\nb\nb\na\nb\nb\nb\nc\n.\nb\nc\n.\nd\ne\nf\n")
92 want_c = [b'a\nb\nb\n',
92 want_c = [b'a\nb\nb\n',
93 diffreplace(6, 6, b'', b'a\nb\nb\nb\nc\n.\n'),
93 diffreplace(6, 6, b'', b'a\nb\nb\nb\nc\n.\n'),
94 b'b\nc\n.\nd\ne\n',
94 b'b\nc\n.\nd\ne\n',
95 diffreplace(16, 18, b'.\n', b''),
95 diffreplace(16, 18, b'.\n', b''),
96 b'f\n']
96 b'f\n']
97 want_pure = [diffreplace(0, 0, b'', b'a\nb\nb\n'),
97 want_pure = [diffreplace(0, 0, b'', b'a\nb\nb\n'),
98 b'a\nb\nb\nb\nc\n.\n',
98 b'a\nb\nb\nb\nc\n.\n',
99 diffreplace(12, 12, b'', b'b\nc\n.\n'),
99 diffreplace(12, 12, b'', b'b\nc\n.\n'),
100 b'd\ne\n',
100 b'd\ne\n',
101 diffreplace(16, 18, b'.\n', b''), b'f\n']
101 diffreplace(16, 18, b'.\n', b''), b'f\n']
102 self.assert_(got in (want_c, want_pure),
102 self.assert_(got in (want_c, want_pure),
103 'got: %r, wanted either %r or %r' % (
103 'got: %r, wanted either %r or %r' % (
104 got, want_c, want_pure))
104 got, want_c, want_pure))
105
105
106 def test_fixws(self):
106 def test_fixws(self):
107 cases = [
107 cases = [
108 (b" \ta\r b\t\n", b"ab\n", 1),
108 (b" \ta\r b\t\n", b"ab\n", 1),
109 (b" \ta\r b\t\n", b" a b\n", 0),
109 (b" \ta\r b\t\n", b" a b\n", 0),
110 (b"", b"", 1),
110 (b"", b"", 1),
111 (b"", b"", 0),
111 (b"", b"", 0),
112 ]
112 ]
113 for a, b, allws in cases:
113 for a, b, allws in cases:
114 c = mdiff.fixws(a, allws)
114 c = mdiff.fixws(a, allws)
115 self.assertEqual(
115 self.assertEqual(
116 c, b, 'fixws(%r) want %r got %r (allws=%r)' % (a, b, c, allws))
116 c, b, 'fixws(%r) want %r got %r (allws=%r)' % (a, b, c, allws))
117
117
118 def test_nice_diff_for_trivial_change(self):
118 def test_nice_diff_for_trivial_change(self):
119 self.assertEqual(self.showdiff(
119 self.assertEqual(self.showdiff(
120 b''.join(b'<%s\n-\n' % i for i in range(5)),
120 b''.join(b'<%d\n-\n' % i for i in range(5)),
121 b''.join(b'>%s\n-\n' % i for i in range(5))),
121 b''.join(b'>%d\n-\n' % i for i in range(5))),
122 [diffreplace(0, 3, b'<0\n', b'>0\n'),
122 [diffreplace(0, 3, b'<0\n', b'>0\n'),
123 b'-\n',
123 b'-\n',
124 diffreplace(5, 8, b'<1\n', b'>1\n'),
124 diffreplace(5, 8, b'<1\n', b'>1\n'),
125 b'-\n',
125 b'-\n',
126 diffreplace(10, 13, b'<2\n', b'>2\n'),
126 diffreplace(10, 13, b'<2\n', b'>2\n'),
127 b'-\n',
127 b'-\n',
128 diffreplace(15, 18, b'<3\n', b'>3\n'),
128 diffreplace(15, 18, b'<3\n', b'>3\n'),
129 b'-\n',
129 b'-\n',
130 diffreplace(20, 23, b'<4\n', b'>4\n'),
130 diffreplace(20, 23, b'<4\n', b'>4\n'),
131 b'-\n'])
131 b'-\n'])
132
132
133 def test_prefer_appending(self):
133 def test_prefer_appending(self):
134 # 1 line to 3 lines
134 # 1 line to 3 lines
135 self.assertEqual(self.showdiff(b'a\n', b'a\n' * 3),
135 self.assertEqual(self.showdiff(b'a\n', b'a\n' * 3),
136 [b'a\n', diffreplace(2, 2, b'', b'a\na\n')])
136 [b'a\n', diffreplace(2, 2, b'', b'a\na\n')])
137 # 1 line to 5 lines
137 # 1 line to 5 lines
138 self.assertEqual(self.showdiff(b'a\n', b'a\n' * 5),
138 self.assertEqual(self.showdiff(b'a\n', b'a\n' * 5),
139 [b'a\n', diffreplace(2, 2, b'', b'a\na\na\na\n')])
139 [b'a\n', diffreplace(2, 2, b'', b'a\na\na\na\n')])
140
140
141 def test_prefer_removing_trailing(self):
141 def test_prefer_removing_trailing(self):
142 # 3 lines to 1 line
142 # 3 lines to 1 line
143 self.assertEqual(self.showdiff(b'a\n' * 3, b'a\n'),
143 self.assertEqual(self.showdiff(b'a\n' * 3, b'a\n'),
144 [b'a\n', diffreplace(2, 6, b'a\na\n', b'')])
144 [b'a\n', diffreplace(2, 6, b'a\na\n', b'')])
145 # 5 lines to 1 line
145 # 5 lines to 1 line
146 self.assertEqual(self.showdiff(b'a\n' * 5, b'a\n'),
146 self.assertEqual(self.showdiff(b'a\n' * 5, b'a\n'),
147 [b'a\n', diffreplace(2, 10, b'a\na\na\na\n', b'')])
147 [b'a\n', diffreplace(2, 10, b'a\na\na\na\n', b'')])
148
148
149 if __name__ == '__main__':
149 if __name__ == '__main__':
150 import silenttestrunner
150 import silenttestrunner
151 silenttestrunner.main(__name__)
151 silenttestrunner.main(__name__)
General Comments 0
You need to be logged in to leave comments. Login now