@@ -47,8 +47,9 @@ class TokenizerTestCase(object): | |||||
*label* for the method's docstring. | *label* for the method's docstring. | ||||
""" | """ | ||||
def inner(self): | def inner(self): | ||||
expected = data["output"] | |||||
actual = self.tokenizer().tokenize(data["input"]) | actual = self.tokenizer().tokenize(data["input"]) | ||||
self.assertEqual(actual, data["output"]) | |||||
self.assertEqual(expected, actual) | |||||
if not py3k: | if not py3k: | ||||
inner.__name__ = funcname.encode("utf8") | inner.__name__ = funcname.encode("utf8") | ||||
inner.__doc__ = data["label"] | inner.__doc__ = data["label"] | ||||
@@ -61,7 +62,7 @@ class TokenizerTestCase(object): | |||||
counter = 1 | counter = 1 | ||||
digits = len(str(len(tests))) | digits = len(str(len(tests))) | ||||
for test in tests: | for test in tests: | ||||
data = {"name": "", "label": "", "input": "", "output": []} | |||||
data = {"name": None, "label": None, "input": None, "output": None} | |||||
try: | try: | ||||
for line in test.strip().splitlines(): | for line in test.strip().splitlines(): | ||||
if line.startswith("name:"): | if line.startswith("name:"): | ||||
@@ -92,7 +93,7 @@ class TokenizerTestCase(object): | |||||
error = "A test in '{0}' was ignored because it lacked a name" | error = "A test in '{0}' was ignored because it lacked a name" | ||||
print(error.format(filename)) | print(error.format(filename)) | ||||
continue | continue | ||||
if not data["input"] or not data["output"]: | |||||
if data["input"] is None or data["output"] is None: | |||||
error = "Test '{0}' in '{1}' was ignored because it lacked an input or an output" | error = "Test '{0}' in '{1}' was ignored because it lacked an input or an output" | ||||
print(error.format(data["name"], filename)) | print(error.format(data["name"], filename)) | ||||
continue | continue | ||||
@@ -35,7 +35,7 @@ class TestDocs(unittest.TestCase): | |||||
buff = StringIO() | buff = StringIO() | ||||
print(input, end="", file=buff) | print(input, end="", file=buff) | ||||
buff.seek(0) | buff.seek(0) | ||||
self.assertEqual(buff.read(), output) | |||||
self.assertEqual(output, buff.read()) | |||||
def test_readme_1(self): | def test_readme_1(self): | ||||
"""test a block of example code in the README""" | """test a block of example code in the README""" | ||||
@@ -115,9 +115,9 @@ class TestDocs(unittest.TestCase): | |||||
raw = urllib.urlopen(url1, urllib.urlencode(data)).read() | raw = urllib.urlopen(url1, urllib.urlencode(data)).read() | ||||
res = json.loads(raw) | res = json.loads(raw) | ||||
text = res["query"]["pages"].values()[0]["revisions"][0]["*"] | text = res["query"]["pages"].values()[0]["revisions"][0]["*"] | ||||
actual = mwparserfromhell.parse(text) | |||||
expected = urllib.urlopen(url2.format(title)).read().decode("utf8") | expected = urllib.urlopen(url2.format(title)).read().decode("utf8") | ||||
self.assertEqual(actual, expected) | |||||
actual = mwparserfromhell.parse(text) | |||||
self.assertEqual(expected, actual) | |||||
if __name__ == "__main__": | if __name__ == "__main__": | ||||
unittest.main(verbosity=2) | unittest.main(verbosity=2) |
@@ -208,17 +208,62 @@ output: [TemplateOpen(), TemplateOpen(), TemplateOpen(), TemplateOpen(), Text(te | |||||
--- | --- | ||||
name: incomplete_tests | |||||
name: mixed_nested_templates | |||||
label: mixed assortment of nested templates within template names, parameter names, and values | |||||
input: "{{{{{{{{foo}}bar|baz=biz}}buzz}}usr|{{bin}}}}" | |||||
output: [TemplateOpen(), TemplateOpen(), TemplateOpen(), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text="bar"), TemplateParamSeparator(), Text(text="baz"), TemplateParamEquals(), Text(text="biz"), TemplateClose(), Text(text="buzz"), TemplateClose(), Text(text="usr"), TemplateParamSeparator(), TemplateOpen(), Text(text="bin"), TemplateClose(), TemplateClose()] | |||||
--- | |||||
name: newline_start | |||||
label: a newline at the start of a template name | |||||
input: "{{\nfoobar}}" | |||||
output: [TemplateOpen(), Text(text="\nfoobar"), TemplateClose()] | |||||
--- | |||||
name: newline_end | |||||
label: a newline at the end of a template name | |||||
input: "{{foobar\n}}" | |||||
output: [TemplateOpen(), Text(text="foobar\n"), TemplateClose()] | |||||
--- | |||||
name: newline_start_end | |||||
label: a newline at the start and end of a template name | |||||
input: "{{\nfoobar\n}}" | |||||
output: [TemplateOpen(), Text(text="\nfoobar\n"), TemplateClose()] | |||||
--- | |||||
"{{{{{{{{foo}}bar|baz=biz}}buzz}}usr|{{bin}}}}" | |||||
name: newline_mid | |||||
label: a newline at the middle of a template name | |||||
input: "{{foo\nbar}}" | |||||
output: [Text(text="{{foo\nbar}}")] | |||||
"{{\nfoobar}}" | |||||
"{{foobar\n}}" | |||||
"{{\nfoobar\n}}" | |||||
"{{foo\nbar}}" | |||||
"{{\nfoo\nbar}}" | |||||
"{{foo\nbar\n}}" | |||||
"{{\nfoo\nbar\n}}" | |||||
--- | |||||
name: newline_start_mid | |||||
label: a newline at the start and middle of a template name | |||||
input: "{{\nfoo\nbar}}" | |||||
output: [Text(text="{{\nfoo\nbar}}")] | |||||
--- | |||||
name: newline_mid_end | |||||
label: a newline at the middle and end of a template name | |||||
input: "{{foo\nbar\n}}" | |||||
output: [Text(text="{{foo\nbar\n}}")] | |||||
--- | |||||
name: newline_start_mid_end | |||||
label: a newline at the start, middle, and end of a template name | |||||
input: "{{\nfoo\nbar\n}}" | |||||
output: [Text(text="{{\nfoo\nbar\n}}")] | |||||
--- | |||||
name: incomplete_tests | |||||
"{{foo|\nbar}}" | "{{foo|\nbar}}" | ||||
"{{foo|bar\n}}" | "{{foo|bar\n}}" | ||||
@@ -300,6 +345,11 @@ name: incomplete_tests | |||||
"{{[foobar}}" | "{{[foobar}}" | ||||
"{{foobar]}}" | "{{foobar]}}" | ||||
"{{foo|ba{r}}" | |||||
"{{foo|ba{r}}}" | |||||
"{{foo|ba{r}=baz}}" | |||||
"{{foo|ba[r]}}" | |||||
"{{foobar" | "{{foobar" | ||||
"{{foobar}" | "{{foobar}" | ||||
"{{foobar|" | "{{foobar|" | ||||