Edgewall Software

Ticket #4336: t4336b.diff

File t4336b.diff, 5.6 KB (added by Tim Hatch <trac@…>, 2 years ago)

Tests for _group_lines, and fix for the same

  • trac/mimeview/api.py

     
    644644 
    645645        for kind, data, pos in stream: 
    646646            if kind is TEXT: 
    647                 lines = data.splitlines(True) 
    648                 for e in stack: 
    649                     yield e 
    650                 yield kind, lines.pop(0).rstrip('\n'), pos 
    651                 for e in _reverse(): 
    652                     yield e 
    653                 if '\n' in data: 
    654                     yield TEXT, '\n', pos 
     647                lines = data.split('\n') 
     648                if lines: 
     649                    # First element 
     650                    for e in stack: 
     651                        yield e 
     652                    yield kind, lines.pop(0), pos 
     653                    for e in _reverse(): 
     654                        yield e 
     655                    # Subsequent ones, prefix with \n 
    655656                    for line in lines: 
    656                         for event in stack: 
    657                             yield event 
    658                         yield kind, line.rstrip('\n'), pos 
    659                         if line.endswith('\n'): 
    660                             for e in _reverse(): 
    661                                 yield e 
    662                             yield TEXT, '\n', pos 
     657                        yield TEXT, '\n', pos 
     658                        for e in stack: 
     659                            yield e 
     660                        yield kind, line, pos 
     661                        for e in _reverse(): 
     662                            yield e 
    663663            else: 
    664664                if kind is START or kind is START_NS: 
    665665                    stack.append((kind, data, pos)) 
  • trac/mimeview/tests/api.py

     
    1212# history and logs, available at http://trac.edgewall.org/log/. 
    1313 
    1414import unittest 
     15from StringIO import StringIO 
    1516 
    1617from trac.core import * 
    1718from trac.test import EnvironmentStub 
    18 from trac.mimeview.api import get_mimetype, IContentConverter, Mimeview 
     19from trac.mimeview.api import get_mimetype, IContentConverter, Mimeview, \ 
     20                              _group_lines 
     21from genshi import Stream, Namespace, Attrs 
     22from genshi.core import TEXT, START, END, START_NS, END_NS 
     23from genshi.input import HTMLParser 
    1924 
    20  
    2125class GetMimeTypeTestCase(unittest.TestCase): 
    2226 
    2327    def test_from_suffix_using_MIME_MAP(self): 
     
    9397        self.assertEqual(Converter1(self.env), conversions[1][-1]) 
    9498        self.assertEqual(Converter2(self.env), conversions[2][-1]) 
    9599 
     100class GroupLinesTestCase(unittest.TestCase): 
    96101 
     102    def test_empty_stream(self): 
     103        lines = list(_group_lines([])) 
     104        self.assertEqual(len(lines), 0) 
     105 
     106    def test_text_only_stream(self): 
     107        input = [(TEXT, "test", (None, -1, -1))] 
     108        lines = list(_group_lines(input)) 
     109        self.assertEquals(len(lines), 1) 
     110        self.assertTrue(isinstance(lines[0], Stream)) 
     111        self.assertEquals(lines[0].events, input) 
     112 
     113    def test_simplespan(self): 
     114        input = HTMLParser(StringIO("<span>test</span>")) 
     115        lines = list(_group_lines(input)) 
     116        self.assertEquals(len(lines), 1) 
     117        self.assertTrue(isinstance(lines[0], Stream)) 
     118        for (a, b) in zip(lines[0], input): 
     119            self.assertEqual(a, b) 
     120 
     121    def test_empty_text_stream(self): 
     122        """ 
     123        http://trac.edgewall.org/ticket/4336 
     124        """ 
     125        input = [(TEXT, "", (None, -1, -1))] 
     126        lines = list(_group_lines(input)) 
     127        self.assertEquals(len(lines), 1) 
     128        self.assertTrue(isinstance(lines[0], Stream)) 
     129        self.assertEquals(lines[0].events, input) 
     130 
     131    def test_empty_text_in_span(self): 
     132        """ 
     133        http://trac.edgewall.org/ticket/4336 
     134        """ 
     135        ns = Namespace('http://www.w3.org/1999/xhtml') 
     136        input = [(START, (ns.span, Attrs([])), (None, -1, -1)), 
     137                 (TEXT, "", (None, -1, -1)), 
     138                 (END, ns.span, (None, -1, -1)), 
     139                ] 
     140        lines = list(_group_lines(input)) 
     141        self.assertEqual(len(lines), 1) 
     142        self.assertEqual(lines[0].render('html'), "<span></span>") 
     143                  
     144    def test_newline(self): 
     145        """ 
     146        If the text element does not end with a newline, it's not properly 
     147        closed. 
     148        """ 
     149        input = HTMLParser(StringIO('<span class="c">a\nb</span>')) 
     150        expected = ['<span class="c">a</span>', 
     151                    '<span class="c">b</span>', 
     152                   ] 
     153        lines = list(_group_lines(input)) 
     154        self.assertEquals(len(lines), len(expected)) 
     155        for a, b in zip(lines, expected): 
     156            self.assertEquals(a.render('xml'), b) 
     157 
     158    def test_multinewline(self): 
     159        """ 
     160        ditto. 
     161        """ 
     162        input = HTMLParser(StringIO('<span class="c">\n\n\na</span>')) 
     163        expected = ['<span class="c"></span>', 
     164                    '<span class="c"></span>', 
     165                    '<span class="c"></span>', 
     166                    '<span class="c">a</span>', 
     167                   ] 
     168        lines = list(_group_lines(input)) 
     169        self.assertEquals(len(lines), len(expected)) 
     170        for a, b in zip(lines, expected): 
     171            self.assertEquals(a.render('xml'), b) 
     172 
     173 
    97174def suite(): 
    98175    suite = unittest.TestSuite() 
    99176    suite.addTest(unittest.makeSuite(GetMimeTypeTestCase, 'test')) 
    100177    suite.addTest(unittest.makeSuite(MimeviewTestCase, 'test')) 
     178    suite.addTest(unittest.makeSuite(GroupLinesTestCase, 'test')) 
    101179    return suite 
    102180 
    103181if __name__ == '__main__':