')
def test_shortrepr2(self):
from meld3 import parse_xmlstring
root = parse_xmlstring(_COMPLEX_XHTML)
r = root.shortrepr()
self.assertEqual(r, '\n \n \n [...]\n\n \n [...]\n')
def test_diffmeld1(self):
from meld3 import parse_xmlstring
from meld3 import _MELD_ID
root = parse_xmlstring(_COMPLEX_XHTML)
clone = root.clone()
div = self._makeOne('div', {_MELD_ID:'newdiv'})
clone.append(div)
tr = clone.findmeld('tr')
tr.deparent()
title = clone.findmeld('title')
title.deparent()
clone.append(title)
# unreduced
diff = root.diffmeld(clone)
changes = diff['unreduced']
addedtags = [ x.attrib[_MELD_ID] for x in changes['added'] ]
removedtags = [x.attrib[_MELD_ID] for x in changes['removed'] ]
movedtags = [ x.attrib[_MELD_ID] for x in changes['moved'] ]
addedtags.sort()
removedtags.sort()
movedtags.sort()
self.assertEqual(addedtags,['newdiv'])
self.assertEqual(removedtags,['td1', 'td2', 'tr'])
self.assertEqual(movedtags, ['title'])
# reduced
changes = diff['reduced']
addedtags = [ x.attrib[_MELD_ID] for x in changes['added'] ]
removedtags = [x.attrib[_MELD_ID] for x in changes['removed'] ]
movedtags = [ x.attrib[_MELD_ID] for x in changes['moved'] ]
addedtags.sort()
removedtags.sort()
movedtags.sort()
self.assertEqual(addedtags,['newdiv'])
self.assertEqual(removedtags,['tr'])
self.assertEqual(movedtags, ['title'])
def test_diffmeld2(self):
source = """
"""
target = """
"""
from meld3 import parse_htmlstring
source_root = parse_htmlstring(source)
target_root = parse_htmlstring(target)
changes = source_root.diffmeld(target_root)
# unreduced
actual = [x.meldid() for x in changes['unreduced']['moved']]
expected = ['b']
self.assertEqual(expected, actual)
actual = [x.meldid() for x in changes['unreduced']['added']]
expected = []
self.assertEqual(expected, actual)
actual = [x.meldid() for x in changes['unreduced']['removed']]
expected = []
self.assertEqual(expected, actual)
# reduced
actual = [x.meldid() for x in changes['reduced']['moved']]
expected = ['b']
self.assertEqual(expected, actual)
actual = [x.meldid() for x in changes['reduced']['added']]
expected = []
self.assertEqual(expected, actual)
actual = [x.meldid() for x in changes['reduced']['removed']]
expected = []
self.assertEqual(expected, actual)
def test_diffmeld3(self):
source = """
"""
target = """
"""
from meld3 import parse_htmlstring
source_root = parse_htmlstring(source)
target_root = parse_htmlstring(target)
changes = source_root.diffmeld(target_root)
# unreduced
actual = [x.meldid() for x in changes['unreduced']['moved']]
expected = ['b', 'c']
self.assertEqual(expected, actual)
actual = [x.meldid() for x in changes['unreduced']['added']]
expected = ['d', 'e']
self.assertEqual(expected, actual)
actual = [x.meldid() for x in changes['unreduced']['removed']]
expected = ['z', 'y']
self.assertEqual(expected, actual)
# reduced
actual = [x.meldid() for x in changes['reduced']['moved']]
expected = ['b']
self.assertEqual(expected, actual)
actual = [x.meldid() for x in changes['reduced']['added']]
expected = ['d']
self.assertEqual(expected, actual)
actual = [x.meldid() for x in changes['reduced']['removed']]
expected = ['z']
self.assertEqual(expected, actual)
def test_diffmeld4(self):
source = """
"""
target = """
"""
from meld3 import parse_htmlstring
source_root = parse_htmlstring(source)
target_root = parse_htmlstring(target)
changes = source_root.diffmeld(target_root)
# unreduced
actual = [x.meldid() for x in changes['unreduced']['moved']]
expected = ['a', 'b']
self.assertEqual(expected, actual)
actual = [x.meldid() for x in changes['unreduced']['added']]
expected = ['m', 'n']
self.assertEqual(expected, actual)
actual = [x.meldid() for x in changes['unreduced']['removed']]
expected = ['c', 'd', 'z', 'y']
self.assertEqual(expected, actual)
# reduced
actual = [x.meldid() for x in changes['reduced']['moved']]
expected = ['a']
self.assertEqual(expected, actual)
actual = [x.meldid() for x in changes['reduced']['added']]
expected = ['m']
self.assertEqual(expected, actual)
actual = [x.meldid() for x in changes['reduced']['removed']]
expected = ['c', 'z']
self.assertEqual(expected, actual)
def test_diffmeld5(self):
source = """
"""
target = """
' % meld_ns)
self.assertRaises(ValueError, self._parse_html, repeated)
class UtilTests(unittest.TestCase):
def test_insert_xhtml_doctype(self):
from meld3 import insert_doctype
orig = ''
actual = insert_doctype(orig)
expected = ''
self.assertEqual(actual, expected)
def test_insert_doctype_after_xmldecl(self):
from meld3 import insert_doctype
orig = ''
actual = insert_doctype(orig)
expected = ''
self.assertEqual(actual, expected)
def test_insert_meld_ns_decl(self):
from meld3 import insert_meld_ns_decl
orig = ''
actual = insert_meld_ns_decl(orig)
expected = ''
self.assertEqual(actual, expected)
def test_prefeed_preserves_existing_meld_ns(self):
from meld3 import prefeed
orig = ''
actual = prefeed(orig)
expected = ''
self.assertEqual(actual, expected)
def test_prefeed_preserves_existing_doctype(self):
from meld3 import prefeed
orig = ''
actual = prefeed(orig)
self.assertEqual(actual, orig)
class WriterTests(unittest.TestCase):
def _parse(self, xml):
from meld3 import parse_xmlstring
root = parse_xmlstring(xml)
return root
def _parse_html(self, xml):
from meld3 import parse_htmlstring
root = parse_htmlstring(xml)
return root
def _write(self, fn, **kw):
out = StringIO()
fn(out, **kw)
out.seek(0)
actual = out.read()
return actual
def _write_xml(self, node, **kw):
return self._write(node.write_xml, **kw)
def _write_html(self, node, **kw):
return self._write(node.write_html, **kw)
def _write_xhtml(self, node, **kw):
return self._write(node.write_xhtml, **kw)
def assertNormalizedXMLEqual(self, a, b):
a = normalize_xml(a)
b = normalize_xml(b)
self.assertEqual(a, b)
def assertNormalizedHTMLEqual(self, a, b):
a = normalize_html(a)
b = normalize_html(b)
self.assertEqual(a, b)
def test_write_simple_xml(self):
root = self._parse(_SIMPLE_XML)
actual = self._write_xml(root)
expected = """NameDescription"""
self.assertNormalizedXMLEqual(actual, expected)
for el, data in root.findmeld('item').repeat(((1,2),)):
el.findmeld('name').text = str(data[0])
el.findmeld('description').text = str(data[1])
actual = self._write_xml(root)
expected = """12"""
self.assertNormalizedXMLEqual(actual, expected)
def test_write_simple_xhtml(self):
root = self._parse(_SIMPLE_XHTML)
actual = self._write_xhtml(root)
expected = """
Hello!"""
self.assertNormalizedXMLEqual(actual, expected)
def test_write_simple_xhtml_as_html(self):
root = self._parse(_SIMPLE_XHTML)
actual = self._write_html(root)
expected = """
Hello!
"""
self.assertNormalizedHTMLEqual(actual, expected)
def test_write_complex_xhtml_as_html(self):
root = self._parse(_COMPLEX_XHTML)
actual = self._write_html(root)
expected = """
This will be escaped in html output: &
"""
self.assertNormalizedHTMLEqual(actual, expected)
def test_write_complex_xhtml_as_xhtml(self):
# I'm not entirely sure if the cdata "script" quoting in this
# test is entirely correct for XHTML. Ryan Tomayko suggests
# that escaped entities are handled properly in script tags by
# XML-aware browsers at
# http://sourceforge.net/mailarchive/message.php?msg_id=10835582
# but I haven't tested it at all. ZPT does not seem to do
# this; it outputs unescaped data.
root = self._parse(_COMPLEX_XHTML)
actual = self._write_xhtml(root)
expected = """
This will be escaped in html output: &