2 from test
.test_support
import run_unittest
, findfile
7 class TestSFbugs(unittest
.TestCase
):
9 def test_ratio_for_null_seqn(self
):
10 # Check clearing of SF bug 763023
11 s
= difflib
.SequenceMatcher(None, [], [])
12 self
.assertEqual(s
.ratio(), 1)
13 self
.assertEqual(s
.quick_ratio(), 1)
14 self
.assertEqual(s
.real_quick_ratio(), 1)
16 def test_comparing_empty_lists(self
):
17 # Check fix for bug #979794
18 group_gen
= difflib
.SequenceMatcher(None, [], []).get_grouped_opcodes()
19 self
.assertRaises(StopIteration, group_gen
.next
)
20 diff_gen
= difflib
.unified_diff([], [])
21 self
.assertRaises(StopIteration, diff_gen
.next
)
23 def test_added_tab_hint(self
):
24 # Check fix for bug #1488943
25 diff
= list(difflib
.Differ().compare(["\tI am a buggy"],["\t\tI am a bug"]))
26 self
.assertEqual("- \tI am a buggy", diff
[0])
27 self
.assertEqual("? --\n", diff
[1])
28 self
.assertEqual("+ \t\tI am a bug", diff
[2])
29 self
.assertEqual("? +\n", diff
[3])
31 patch914575_from1
= """
32 1. Beautiful is beTTer than ugly.
33 2. Explicit is better than implicit.
34 3. Simple is better than complex.
35 4. Complex is better than complicated.
39 1. Beautiful is better than ugly.
40 3. Simple is better than complex.
41 4. Complicated is better than complex.
42 5. Flat is better than nested.
45 patch914575_from2
= """
46 \t\tLine 1: preceeded by from:[tt] to:[ssss]
47 \t\tLine 2: preceeded by from:[sstt] to:[sssst]
48 \t \tLine 3: preceeded by from:[sstst] to:[ssssss]
49 Line 4: \thas from:[sst] to:[sss] after :
50 Line 5: has from:[t] to:[ss] at end\t
54 Line 1: preceeded by from:[tt] to:[ssss]
55 \tLine 2: preceeded by from:[sstt] to:[sssst]
56 Line 3: preceeded by from:[sstst] to:[ssssss]
57 Line 4: has from:[sst] to:[sss] after :
58 Line 5: has from:[t] to:[ss] at end
61 patch914575_from3
= """line 0
62 1234567890123456789012345689012345
72 1234567890123456789012345689012345
75 just fits in two lines yup!!
78 patch914575_to3
= """line 0
79 1234567890123456789012345689012345
90 another long line that needs to be wrapped
92 just fits in two lineS yup!!
95 class TestSFpatches(unittest
.TestCase
):
97 def test_html_diff(self
):
98 # Check SF patch 914575 for generating HTML differences
99 f1a
= ((patch914575_from1
+ '123\n'*10)*3)
100 t1a
= (patch914575_to1
+ '123\n'*10)*3
101 f1b
= '456\n'*10 + f1a
102 t1b
= '456\n'*10 + t1a
103 f1a
= f1a
.splitlines()
104 t1a
= t1a
.splitlines()
105 f1b
= f1b
.splitlines()
106 t1b
= t1b
.splitlines()
107 f2
= patch914575_from2
.splitlines()
108 t2
= patch914575_to2
.splitlines()
109 f3
= patch914575_from3
111 i
= difflib
.HtmlDiff()
112 j
= difflib
.HtmlDiff(tabsize
=2)
113 k
= difflib
.HtmlDiff(wrapcolumn
=14)
115 full
= i
.make_file(f1a
,t1a
,'from','to',context
=False,numlines
=5)
118 '<h2>Context (first diff within numlines=5(default))</h2>',
119 i
.make_table(f1a
,t1a
,'from','to',context
=True),
120 '<h2>Context (first diff after numlines=5(default))</h2>',
121 i
.make_table(f1b
,t1b
,'from','to',context
=True),
122 '<h2>Context (numlines=6)</h2>',
123 i
.make_table(f1a
,t1a
,'from','to',context
=True,numlines
=6),
124 '<h2>Context (numlines=0)</h2>',
125 i
.make_table(f1a
,t1a
,'from','to',context
=True,numlines
=0),
126 '<h2>Same Context</h2>',
127 i
.make_table(f1a
,f1a
,'from','to',context
=True),
128 '<h2>Same Full</h2>',
129 i
.make_table(f1a
,f1a
,'from','to',context
=False),
130 '<h2>Empty Context</h2>',
131 i
.make_table([],[],'from','to',context
=True),
132 '<h2>Empty Full</h2>',
133 i
.make_table([],[],'from','to',context
=False),
134 '<h2>tabsize=2</h2>',
136 '<h2>tabsize=default</h2>',
138 '<h2>Context (wrapcolumn=14,numlines=0)</h2>',
139 k
.make_table(f3
.splitlines(),t3
.splitlines(),context
=True,numlines
=0),
140 '<h2>wrapcolumn=14,splitlines()</h2>',
141 k
.make_table(f3
.splitlines(),t3
.splitlines()),
142 '<h2>wrapcolumn=14,splitlines(True)</h2>',
143 k
.make_table(f3
.splitlines(True),t3
.splitlines(True)),
145 actual
= full
.replace('</body>','\n%s\n</body>' % tables
)
147 # temporarily uncomment next two lines to baseline this test
148 #with open('test_difflib_expect.html','w') as fp:
151 with
open(findfile('test_difflib_expect.html')) as fp
:
152 self
.assertEqual(actual
, fp
.read())
154 def test_recursion_limit(self
):
155 # Check if the problem described in patch #1413711 exists.
156 limit
= sys
.getrecursionlimit()
157 old
= [(i
%2 and "K:%d" or "V:A:%d") % i
for i
in range(limit
*2)]
158 new
= [(i
%2 and "K:%d" or "V:B:%d") % i
for i
in range(limit
*2)]
159 difflib
.SequenceMatcher(None, old
, new
).get_opcodes()
162 class TestOutputFormat(unittest
.TestCase
):
163 def test_tab_delimiter(self
):
164 args
= ['one', 'two', 'Original', 'Current',
165 '2005-01-26 23:30:50', '2010-04-02 10:20:52']
166 ud
= difflib
.unified_diff(*args
, lineterm
='')
167 self
.assertEqual(list(ud
)[0:2], [
168 "--- Original\t2005-01-26 23:30:50",
169 "+++ Current\t2010-04-02 10:20:52"])
170 cd
= difflib
.context_diff(*args
, lineterm
='')
171 self
.assertEqual(list(cd
)[0:2], [
172 "*** Original\t2005-01-26 23:30:50",
173 "--- Current\t2010-04-02 10:20:52"])
175 def test_no_trailing_tab_on_empty_filedate(self
):
176 args
= ['one', 'two', 'Original', 'Current']
177 ud
= difflib
.unified_diff(*args
, lineterm
='')
178 self
.assertEqual(list(ud
)[0:2], ["--- Original", "+++ Current"])
180 cd
= difflib
.context_diff(*args
, lineterm
='')
181 self
.assertEqual(list(cd
)[0:2], ["*** Original", "--- Current"])
185 difflib
.HtmlDiff
._default
_prefix
= 0
186 Doctests
= doctest
.DocTestSuite(difflib
)
187 run_unittest(TestSFpatches
, TestSFbugs
, TestOutputFormat
, Doctests
)
189 if __name__
== '__main__':