def testManipulate(self): '''Test moving and deleting pages in the memory store''' # Check we can get / store a page page = self.store.get_page(Path('Test:foo')) self.assertTrue(page.get_parsetree()) self.assertTrue('Foo' in ''.join(page.dump('plain'))) self.assertFalse(page.modified) wikitext = tests.get_test_data_page('wiki', 'roundtrip') page.parse('wiki', wikitext) self.assertTrue(page.modified) self.store.store_page(page) self.assertFalse(page.modified) self.assertEqualDiff(''.join(page.dump('wiki')), wikitext) page = self.store.get_page(Path('Test:foo')) self.assertEqualDiff(''.join(page.dump('wiki')), wikitext) # check test setup OK for path in (Path('Test:BAR'), Path('NewPage')): page = self.store.get_page(path) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) # check errors self.assertRaises(LookupError, self.store.move_page, Path('NewPage'), Path('Test:BAR')) self.assertRaises(PageExistsError, self.store.move_page, Path('Test:foo'), Path('TODOList')) for oldpath, newpath in ( (Path('Test:foo'), Path('Test:BAR')), (Path('TODOList'), Path('NewPage:Foo:Bar:Baz')), ): page = self.store.get_page(oldpath) text = page.dump('wiki') self.assertTrue(page.haschildren) #~ print ascii_page_tree(self.store) self.store.move_page(oldpath, newpath) #~ print ascii_page_tree(self.store) # newpath should exist and look like the old one page = self.store.get_page(newpath) self.assertTrue(page.haschildren) self.assertEqual(page.dump('wiki'), text) # oldpath should be deleted page = self.store.get_page(oldpath) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) # let's delete the newpath again self.assertTrue(self.store.delete_page(newpath)) page = self.store.get_page(newpath) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) # delete again should silently fail self.assertFalse(self.store.delete_page(newpath)) # check cleaning up works OK page = self.store.get_page(Path('NewPage')) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) # check case-sensitive move self.store.move_page(Path('utf8'), Path('UTF8')) page = self.store.get_page(Path('utf8')) # self.assertFalse(page.haschildren) - fails on case-insensitive FS self.assertFalse(Path('utf8') in list(self.store.get_pagelist(Path(':')))) self.assertTrue(Path('UTF8') in list(self.store.get_pagelist(Path(':')))) newpage = self.store.get_page(Path('UTF8')) self.assertTrue(newpage.haschildren) self.assertFalse(newpage == page) # check hascontents page = self.store.get_page(Path('NewPage')) tree = ParseTree().fromstring('<zim-tree></zim-tree>') self.assertFalse(tree.hascontent) page.set_parsetree(tree) self.assertFalse(page.hascontent) self.store.store_page(page) page = self.store.get_page(Path('NewPage')) self.assertFalse(page.hascontent)
def runTest(self): '''Test serialization of the page view textbuffer''' wikitext = get_test_data_page('wiki', 'roundtrip') tree = get_tree(wikitext) buffer = TextBuffer() with FilterNoSuchImageWarning(): buffer.set_parsetree(tree) raw1 = buffer.get_parsetree(raw=True) result1 = buffer.get_parsetree() #~ print result1.tostring() #~ self.assertEqualDiff(result1.tostring(), tree.tostring()) # Compare cooked tree after dumping back resulttext = u''.join(wiki.Dumper().dump(result1)) self.assertEqualDiff(resulttext, wikitext) # Compare we are stable when loading raw tree again raw = raw1.tostring() with FilterNoSuchImageWarning(): buffer.set_parsetree(raw1) self.assertEqualDiff(raw1.tostring(), raw) # If this fails, set_parsetree is modifying the tree raw2 = buffer.get_parsetree(raw=True) self.assertEqualDiff(raw2.tostring(), raw) # Actual cooked roundtrip test # Compare we are stable when loading cooked tree again cooked = result1.tostring() with FilterNoSuchImageWarning(): buffer.set_parsetree(result1) self.assertEqualDiff(result1.tostring(), cooked) # If this fails, set_parsetree is modifying the tree result2 = buffer.get_parsetree() self.assertEqualDiff(result2.tostring(), cooked) # Actual cooked roundtrip test # Test 'raw' really preserves "errors" input = '''\ <?xml version='1.0' encoding='utf-8'?> <zim-tree raw="True"> foo<h level="1">bar</h>baz dus <pre>ja</pre> hmm <h level="2">foo </h>bar dus <p indent="5">ja</p> <emphasis>hmm dus ja </emphasis>grrr <li bullet="*" indent="0">Foo</li> <li bullet="*" indent="0">Bar</li> </zim-tree>''' tree = get_tree_from_xml(input) buffer.set_parsetree(tree) self.assertFalse(buffer.get_modified()) rawtree = buffer.get_parsetree(raw=True) self.assertFalse(buffer.get_modified()) self.assertEqualDiff(rawtree.tostring(), input) # Test errors are cleaned up correctly wanted = '''\ <?xml version='1.0' encoding='utf-8'?> <zim-tree> foo <h level="1">bar</h> baz dus <code>ja</code> hmm <h level="2">foo</h> bar dus ja <emphasis>hmm</emphasis> <emphasis>dus ja</emphasis> grrr <li bullet="*" indent="0">Foo</li><li bullet="*" indent="0">Bar</li></zim-tree>''' tree = buffer.get_parsetree() self.assertFalse(buffer.get_modified()) self.assertEqualDiff(tree.tostring(), wanted) # Test pasteing some simple text buffer.set_parsetree(tree) # reset without errors input = '''\ <?xml version='1.0' encoding='utf-8'?> <zim-tree><strong>Bold</strong></zim-tree>''' wanted = '''\ <?xml version='1.0' encoding='utf-8'?> <zim-tree> foo <h level="1">bar</h> baz dus <code>ja</code> hmm <h level="2">foo</h> bar dus ja <emphasis>hmm</emphasis> <emphasis>dus ja</emphasis> grrr <li bullet="*" indent="0">Foo<strong>Bold</strong></li><li bullet="*" indent="0">Bar</li></zim-tree>''' pastetree = get_tree_from_xml(input) iter = buffer.get_iter_at_line(15) iter.forward_chars(5) # position after "* Foo" buffer.insert_parsetree(iter, pastetree, interactive=True) tree = buffer.get_parsetree() self.assertTrue(buffer.get_modified()) self.assertEqualDiff(tree.tostring(), wanted) # Now paste list halfway and see result is OK # because of the bullets pasting should go to a new line # automatically input = '''\ <?xml version='1.0' encoding='utf-8'?> <zim-tree><li>Foo</li><li>Bar</li> </zim-tree>''' wanted = '''\ <?xml version='1.0' encoding='utf-8'?> <zim-tree> foo <h level="1">bar</h> baz <li bullet="*" indent="0">Foo</li><li bullet="*" indent="0">Bar</li> dus <code>ja</code> hmm <h level="2">foo</h> bar dus ja <emphasis>hmm</emphasis> <emphasis>dus ja</emphasis> grrr <li bullet="*" indent="0">Foo<strong>Bold</strong></li><li bullet="*" indent="0">Bar</li></zim-tree>''' pastetree = get_tree_from_xml(input) iter = buffer.get_iter_at_line(4) iter.forward_chars(3) # position after "baz" buffer.insert_parsetree(iter, pastetree, interactive=True) tree = buffer.get_parsetree() self.assertTrue(buffer.get_modified()) self.assertEqualDiff(tree.tostring(), wanted) # Test sanity for editing "errors" input = '''\ <?xml version='1.0' encoding='utf-8'?> <zim-tree> <li bullet="unchecked-box" indent="0">Box 1</li><li bullet="unchecked-box" indent="0">Box 2</li><li bullet="unchecked-box" indent="0">Box 3</li> </zim-tree> ''' wanted = '''\ <?xml version='1.0' encoding='utf-8'?> <zim-tree> <li bullet="unchecked-box" indent="0">Box 1</li>foo <li bullet="unchecked-box" indent="0">Box 2</li><li bullet="unchecked-box" indent="0">Box 3</li> </zim-tree>''' tree = get_tree_from_xml(input) buffer.set_parsetree(tree) iter = buffer.get_iter_at_line(2) # iter before checkbox buffer.insert(iter, 'foo ') #print buffer.get_parsetree(raw=True).tostring() #print buffer.get_parsetree().tostring() tree = buffer.get_parsetree() self.assertEqualDiff(tree.tostring(), wanted)
# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg <*****@*****.**> '''Test cases for the zim.formats module.''' from tests import TestCase, get_test_data_page, get_test_page from zim.formats import * from zim.notebook import Link from zim.parsing import link_type if not ElementTreeModule.__name__.endswith('cElementTree'): print 'WARNING: using ElementTree instead of cElementTree' wikitext = get_test_data_page('wiki', 'roundtrip') class TestParseTree(TestCase): def setUp(self): self.xml = '''\ <?xml version='1.0' encoding='utf-8'?> <zim-tree> <h level="1">Head 1</h> <h level="2">Head 2</h> <h level="3">Head 3</h> <h level="2">Head 4</h> <h level="5">Head 5</h> <h level="4">Head 6</h> <h level="5">Head 7</h> <h level="6">Head 8</h>
def runTest(self): '''Test the undo/redo functionality''' buffer = TextBuffer() undomanager = UndoStackManager(buffer) wikitext = get_test_data_page('wiki', 'roundtrip') tree = get_tree(wikitext) with FilterNoSuchImageWarning(): buffer._insert_element_children(tree.getroot()) # Use private method to circumvent begin-insert-tree signal etc. #~ import pprint #~ undomanager.flush_insert() i = 0 for group in undomanager.stack + [undomanager.group]: #~ pprint.pprint( #~ [(a[0], a[1], a[2], a[3].tostring()[39:]) for a in group] ) for action in group: self.assertEqual(action[1], i) # assert undo stack is continous i = action[2] self.assertTrue(len(undomanager.stack) > 10) # check we recorded something buffertree1 = buffer.get_parsetree(raw=True) while undomanager.undo(): continue emptytree = buffer.get_parsetree(raw=True) self.assertEqualDiff(emptytree.tostring(), "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree raw=\"True\" />") with FilterNoSuchImageWarning(): while undomanager.redo(): continue buffertree2 = buffer.get_parsetree(raw=True) self.assertEqualDiff(buffertree2.tostring(), buffertree1.tostring()) while undomanager.undo(): continue emptytree = buffer.get_parsetree(raw=True) self.assertEqualDiff(emptytree.tostring(), "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree raw=\"True\" />") buffer.clear() self.assertTrue(len(undomanager.stack) == 0) undomanager.unblock() # test merging for c in 'fooo barr baz': with buffer.user_action: buffer.insert_at_cursor(c) #~ import pprint #~ undomanager.flush_insert() #~ pprint.pprint(undomanager.stack) self.assertTrue(len(undomanager.stack) == 5) # 3 words, 2 spaces for group in undomanager.stack: self.assertTrue(len(group) == 1) # merge was sucessfull self.assertEqualDiff(buffer.get_parsetree().tostring(), "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo barr baz</zim-tree>") for wanted in ( "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo barr </zim-tree>", "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo barr</zim-tree>", "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo </zim-tree>", "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo</zim-tree>", "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree />" ): undomanager.undo() self.assertEqualDiff(buffer.get_parsetree().tostring(), wanted) while undomanager.redo(): continue self.assertEqualDiff(buffer.get_parsetree().tostring(), "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo barr baz</zim-tree>") # test other actions iter = buffer.get_iter_at_offset(7) buffer.place_cursor(iter) buffer.select_word() buffer.toggle_textstyle('strong', interactive=True) self.assertEqualDiff(buffer.get_parsetree().tostring(), "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo <strong>barr</strong> baz</zim-tree>") undomanager.undo() self.assertEqualDiff(buffer.get_parsetree().tostring(), "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo barr baz</zim-tree>") undomanager.redo() self.assertEqualDiff(buffer.get_parsetree().tostring(), "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo <strong>barr</strong> baz</zim-tree>") start, end = map(buffer.get_iter_at_offset, (5, 10)) with buffer.user_action: buffer.delete(start, end) self.assertEqualDiff(buffer.get_parsetree().tostring(), "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo baz</zim-tree>") undomanager.undo() self.assertEqualDiff(buffer.get_parsetree().tostring(), "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo <strong>barr</strong> baz</zim-tree>") undomanager.redo() self.assertEqualDiff(buffer.get_parsetree().tostring(), "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo baz</zim-tree>") # test folding undomanager.undo() undomanager.undo() undomanager.undo() undomanager.undo() self.assertEqualDiff(buffer.get_parsetree().tostring(), "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo barr</zim-tree>") with buffer.user_action: buffer.insert_at_cursor(' ') undomanager.undo() self.assertEqualDiff(buffer.get_parsetree().tostring(), "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo barr</zim-tree>") undomanager.undo() # here we undo fold of 4 undos above self.assertEqualDiff(buffer.get_parsetree().tostring(), "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo baz</zim-tree>") undomanager.undo() self.assertEqualDiff(buffer.get_parsetree().tostring(), "<?xml version='1.0' encoding='utf-8'?>\n<zim-tree>fooo <strong>barr</strong> baz</zim-tree>")