# -*- coding: utf-8 -*- # # Copyright (C) 2012-2013 Ben Kurtovic # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. from __future__ import unicode_literals import unittest from mwparserfromhell.compat import str from mwparserfromhell.nodes import Template, Text from mwparserfromhell.nodes.extras import Parameter from mwparserfromhell.smart_list import SmartList from mwparserfromhell.wikicode import Wikicode from ._test_tree_equality import TreeEqualityTestCase wrap = lambda L: Wikicode(SmartList(L)) pgens = lambda k, v: Parameter(wrap([Text(k)]), wrap([Text(v)]), True) pgenh = lambda k, v: Parameter(wrap([Text(k)]), wrap([Text(v)]), False) class TestTemplate(TreeEqualityTestCase): """Test cases for the Template node.""" def test_unicode(self): """test Template.__unicode__()""" node = Template(wrap([Text("foobar")])) self.assertEqual("{{foobar}}", str(node)) node2 = Template(wrap([Text("foo")]), [pgenh("1", "bar"), pgens("abc", "def")]) self.assertEqual("{{foo|bar|abc=def}}", str(node2)) def test_strip(self): """test Template.__strip__()""" node1 = Template(wrap([Text("foobar")])) node2 = Template(wrap([Text("foo")]), [pgenh("1", "bar"), pgens("abc", "def")]) for a in (True, False): for b in (True, False): self.assertEqual(None, node1.__strip__(a, b)) self.assertEqual(None, node2.__strip__(a, b)) def test_showtree(self): """test Template.__showtree__()""" output = [] getter, marker = object(), object() get = lambda code: output.append((getter, code)) mark = lambda: output.append(marker) node1 = Template(wrap([Text("foobar")])) node2 = Template(wrap([Text("foo")]), [pgenh("1", "bar"), pgens("abc", "def")]) node1.__showtree__(output.append, get, mark) node2.__showtree__(output.append, get, mark) valid = [ "{{", (getter, node1.name), "}}", "{{", (getter, node2.name), " | ", marker, (getter, node2.params[0].name), " = ", marker, (getter, node2.params[0].value), " | ", marker, (getter, node2.params[1].name), " = ", marker, (getter, node2.params[1].value), "}}"] self.assertEqual(valid, output) def test_name(self): """test getter/setter for the name attribute""" name = wrap([Text("foobar")]) node1 = Template(name) node2 = Template(name, [pgenh("1", "bar")]) self.assertIs(name, node1.name) self.assertIs(name, node2.name) node1.name = "asdf" node2.name = "téstïng" self.assertWikicodeEqual(wrap([Text("asdf")]), node1.name) self.assertWikicodeEqual(wrap([Text("téstïng")]), node2.name) def test_params(self): """test getter for the params attribute""" node1 = Template(wrap([Text("foobar")])) plist = [pgenh("1", "bar"), pgens("abc", "def")] node2 = Template(wrap([Text("foo")]), plist) self.assertEqual([], node1.params) self.assertIs(plist, node2.params) def test_has_param(self): """test Template.has_param()""" node1 = Template(wrap([Text("foobar")])) node2 = Template(wrap([Text("foo")]), [pgenh("1", "bar"), pgens("\nabc ", "def")]) node3 = Template(wrap([Text("foo")]), [pgenh("1", "a"), pgens("b", "c"), pgens("1", "d")]) node4 = Template(wrap([Text("foo")]), [pgenh("1", "a"), pgens("b", " ")]) self.assertFalse(node1.has_param("foobar")) self.assertTrue(node2.has_param(1)) self.assertTrue(node2.has_param("abc")) self.assertFalse(node2.has_param("def")) self.assertTrue(node3.has_param("1")) self.assertTrue(node3.has_param(" b ")) self.assertFalse(node4.has_param("b")) self.assertTrue(node3.has_param("b", False)) self.assertTrue(node4.has_param("b", False)) def test_get(self): """test Template.get()""" node1 = Template(wrap([Text("foobar")])) node2p1 = pgenh("1", "bar") node2p2 = pgens("abc", "def") node2 = Template(wrap([Text("foo")]), [node2p1, node2p2]) node3p1 = pgens("b", "c") node3p2 = pgens("1", "d") node3 = Template(wrap([Text("foo")]), [pgenh("1", "a"), node3p1, node3p2]) node4p1 = pgens(" b", " ") node4 = Template(wrap([Text("foo")]), [pgenh("1", "a"), node4p1]) self.assertRaises(ValueError, node1.get, "foobar") self.assertIs(node2p1, node2.get(1)) self.assertIs(node2p2, node2.get("abc")) self.assertRaises(ValueError, node2.get, "def") self.assertIs(node3p1, node3.get("b")) self.assertIs(node3p2, node3.get("1")) self.assertIs(node4p1, node4.get("b ")) # add def test_remove(self): """test Template.remove()""" node1 = Template(wrap([Text("foobar")])) node2 = Template(wrap([Text("foo")]), [pgenh("1", "bar"), pgens("abc", "def")]) node3 = Template(wrap([Text("foo")]), [pgenh("1", "bar"), pgens("abc", "def")]) node4 = Template(wrap([Text("foo")]), [pgenh("1", "bar"), pgenh("2", "baz")]) node5 = Template(wrap([Text("foo")]), [ pgens(" a", "b"), pgens("b", "c"), pgens("a ", "d")]) node6 = Template(wrap([Text("foo")]), [ pgens(" a", "b"), pgens("b", "c"), pgens("a ", "d")]) node7 = Template(wrap([Text("foo")]), [ pgens("1 ", "a"), pgens(" 1", "b"), pgens("2", "c")]) node8 = Template(wrap([Text("foo")]), [ pgens("1 ", "a"), pgens(" 1", "b"), pgens("2", "c")]) node9 = Template(wrap([Text("foo")]), [ pgens("1 ", "a"), pgenh("1", "b"), pgenh("2", "c")]) node10 = Template(wrap([Text("foo")]), [ pgens("1 ", "a"), pgenh("1", "b"), pgenh("2", "c")]) node2.remove("1") node2.remove("abc") node3.remove(1, keep_field=True) node3.remove("abc", keep_field=True) node4.remove("1", keep_field=False) node5.remove("a", keep_field=False) node6.remove("a", keep_field=True) node7.remove(1, keep_field=True) node8.remove(1, keep_field=False) node9.remove(1, keep_field=True) node10.remove(1, keep_field=False) self.assertRaises(ValueError, node1.remove, 1) self.assertRaises(ValueError, node1.remove, "a") self.assertRaises(ValueError, node2.remove, "1") self.assertEquals("{{foo}}", node2) self.assertEquals("{{foo||abc=}}", node3) self.assertEquals("{{foo||baz}}", node4) self.assertEquals("{{foo|b=c}}", node5) self.assertEquals("{{foo| a=|b=c}}", node6) self.assertEquals("{{foo|1 =|2=c}}", node7) self.assertEquals("{{foo|2=c}}", node8) self.assertEquals("{{foo||c}}", node9) self.assertEquals("{{foo||c}}", node10) if __name__ == "__main__": unittest.main(verbosity=2)