symbian-qemu-0.9.1-12/python-2.6.1/Lib/test/test_difflib.py
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 import difflib
       
     2 from test.test_support import run_unittest, findfile
       
     3 import unittest
       
     4 import doctest
       
     5 import sys
       
     6 
       
     7 class TestSFbugs(unittest.TestCase):
       
     8 
       
     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)
       
    15 
       
    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)
       
    22 
       
    23 patch914575_from1 = """
       
    24    1. Beautiful is beTTer than ugly.
       
    25    2. Explicit is better than implicit.
       
    26    3. Simple is better than complex.
       
    27    4. Complex is better than complicated.
       
    28 """
       
    29 
       
    30 patch914575_to1 = """
       
    31    1. Beautiful is better than ugly.
       
    32    3.   Simple is better than complex.
       
    33    4. Complicated is better than complex.
       
    34    5. Flat is better than nested.
       
    35 """
       
    36 
       
    37 patch914575_from2 = """
       
    38 \t\tLine 1: preceeded by from:[tt] to:[ssss]
       
    39   \t\tLine 2: preceeded by from:[sstt] to:[sssst]
       
    40   \t \tLine 3: preceeded by from:[sstst] to:[ssssss]
       
    41 Line 4:  \thas from:[sst] to:[sss] after :
       
    42 Line 5: has from:[t] to:[ss] at end\t
       
    43 """
       
    44 
       
    45 patch914575_to2 = """
       
    46     Line 1: preceeded by from:[tt] to:[ssss]
       
    47     \tLine 2: preceeded by from:[sstt] to:[sssst]
       
    48       Line 3: preceeded by from:[sstst] to:[ssssss]
       
    49 Line 4:   has from:[sst] to:[sss] after :
       
    50 Line 5: has from:[t] to:[ss] at end
       
    51 """
       
    52 
       
    53 patch914575_from3 = """line 0
       
    54 1234567890123456789012345689012345
       
    55 line 1
       
    56 line 2
       
    57 line 3
       
    58 line 4   changed
       
    59 line 5   changed
       
    60 line 6   changed
       
    61 line 7
       
    62 line 8  subtracted
       
    63 line 9
       
    64 1234567890123456789012345689012345
       
    65 short line
       
    66 just fits in!!
       
    67 just fits in two lines yup!!
       
    68 the end"""
       
    69 
       
    70 patch914575_to3 = """line 0
       
    71 1234567890123456789012345689012345
       
    72 line 1
       
    73 line 2    added
       
    74 line 3
       
    75 line 4   chanGEd
       
    76 line 5a  chanGed
       
    77 line 6a  changEd
       
    78 line 7
       
    79 line 8
       
    80 line 9
       
    81 1234567890
       
    82 another long line that needs to be wrapped
       
    83 just fitS in!!
       
    84 just fits in two lineS yup!!
       
    85 the end"""
       
    86 
       
    87 class TestSFpatches(unittest.TestCase):
       
    88 
       
    89     def test_html_diff(self):
       
    90         # Check SF patch 914575 for generating HTML differences
       
    91         f1a = ((patch914575_from1 + '123\n'*10)*3)
       
    92         t1a = (patch914575_to1 + '123\n'*10)*3
       
    93         f1b = '456\n'*10 + f1a
       
    94         t1b = '456\n'*10 + t1a
       
    95         f1a = f1a.splitlines()
       
    96         t1a = t1a.splitlines()
       
    97         f1b = f1b.splitlines()
       
    98         t1b = t1b.splitlines()
       
    99         f2 = patch914575_from2.splitlines()
       
   100         t2 = patch914575_to2.splitlines()
       
   101         f3 = patch914575_from3
       
   102         t3 = patch914575_to3
       
   103         i = difflib.HtmlDiff()
       
   104         j = difflib.HtmlDiff(tabsize=2)
       
   105         k = difflib.HtmlDiff(wrapcolumn=14)
       
   106 
       
   107         full = i.make_file(f1a,t1a,'from','to',context=False,numlines=5)
       
   108         tables = '\n'.join(
       
   109             [
       
   110              '<h2>Context (first diff within numlines=5(default))</h2>',
       
   111              i.make_table(f1a,t1a,'from','to',context=True),
       
   112              '<h2>Context (first diff after numlines=5(default))</h2>',
       
   113              i.make_table(f1b,t1b,'from','to',context=True),
       
   114              '<h2>Context (numlines=6)</h2>',
       
   115              i.make_table(f1a,t1a,'from','to',context=True,numlines=6),
       
   116              '<h2>Context (numlines=0)</h2>',
       
   117              i.make_table(f1a,t1a,'from','to',context=True,numlines=0),
       
   118              '<h2>Same Context</h2>',
       
   119              i.make_table(f1a,f1a,'from','to',context=True),
       
   120              '<h2>Same Full</h2>',
       
   121              i.make_table(f1a,f1a,'from','to',context=False),
       
   122              '<h2>Empty Context</h2>',
       
   123              i.make_table([],[],'from','to',context=True),
       
   124              '<h2>Empty Full</h2>',
       
   125              i.make_table([],[],'from','to',context=False),
       
   126              '<h2>tabsize=2</h2>',
       
   127              j.make_table(f2,t2),
       
   128              '<h2>tabsize=default</h2>',
       
   129              i.make_table(f2,t2),
       
   130              '<h2>Context (wrapcolumn=14,numlines=0)</h2>',
       
   131              k.make_table(f3.splitlines(),t3.splitlines(),context=True,numlines=0),
       
   132              '<h2>wrapcolumn=14,splitlines()</h2>',
       
   133              k.make_table(f3.splitlines(),t3.splitlines()),
       
   134              '<h2>wrapcolumn=14,splitlines(True)</h2>',
       
   135              k.make_table(f3.splitlines(True),t3.splitlines(True)),
       
   136              ])
       
   137         actual = full.replace('</body>','\n%s\n</body>' % tables)
       
   138         # temporarily uncomment next three lines to baseline this test
       
   139         #f = open('test_difflib_expect.html','w')
       
   140         #f.write(actual)
       
   141         #f.close()
       
   142         expect = open(findfile('test_difflib_expect.html')).read()
       
   143 
       
   144 
       
   145         self.assertEqual(actual,expect)
       
   146 
       
   147     def test_recursion_limit(self):
       
   148         # Check if the problem described in patch #1413711 exists.
       
   149         limit = sys.getrecursionlimit()
       
   150         old = [(i%2 and "K:%d" or "V:A:%d") % i for i in range(limit*2)]
       
   151         new = [(i%2 and "K:%d" or "V:B:%d") % i for i in range(limit*2)]
       
   152         difflib.SequenceMatcher(None, old, new).get_opcodes()
       
   153 
       
   154 
       
   155 def test_main():
       
   156     difflib.HtmlDiff._default_prefix = 0
       
   157     Doctests = doctest.DocTestSuite(difflib)
       
   158     run_unittest(TestSFpatches, TestSFbugs, Doctests)
       
   159 
       
   160 if __name__ == '__main__':
       
   161     test_main()