Skip to content

Commit f5855f3

Browse files
committed
Fix up more tests to work with nose
1 parent 19686c8 commit f5855f3

File tree

5 files changed

+102
-150
lines changed

5 files changed

+102
-150
lines changed

html5lib/tests/test_serializer.py

Lines changed: 44 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -83,28 +83,21 @@ def serialize_xhtml(input, options):
8383
options = dict([(str(k),v) for k,v in options.iteritems()])
8484
return serializer.XHTMLSerializer(**options).render(JsonWalker(input),options.get("encoding",None))
8585

86+
def make_test(input, expected, xhtml, options):
87+
result = serialize_html(input, options)
88+
if len(expected) == 1:
89+
assert expected[0] == result, "Expected:\n%s\nActual:\n%s\nOptions\nxhtml:False\n%s"%(expected[0], result, str(options))
90+
elif result not in expected:
91+
assert False, "Expected: %s, Received: %s" % (expected, result)
8692

87-
class TestCase(unittest.TestCase):
88-
def addTest(cls, name, description, input, expected, xhtml, options):
89-
func = lambda self: self.mockTest(input, options, expected, xhtml)
90-
func.__doc__ = "\t".join([name, description, str(input), str(options)])
91-
setattr(cls, name, func)
92-
addTest = classmethod(addTest)
93+
if not xhtml:
94+
return
9395

94-
def mockTest(self, input, options, expected, xhtml):
95-
result = serialize_html(input, options)
96-
if len(expected) == 1:
97-
self.assertEquals(expected[0], result, "Expected:\n%s\nActual:\n%s\nOptions\nxhtml:False\n%s"%(expected[0], result, str(options)))
98-
elif result not in expected:
99-
self.fail("Expected: %s, Received: %s" % (expected, result))
100-
101-
if not xhtml: return
102-
103-
result = serialize_xhtml(input, options)
104-
if len(xhtml) == 1:
105-
self.assertEquals(xhtml[0], result, "Expected:\n%s\nActual:\n%s\nOptions\nxhtml:True\n%s"%(xhtml[0], result, str(options)))
106-
elif result not in xhtml:
107-
self.fail("Expected: %s, Received: %s" % (xhtml, result))
96+
result = serialize_xhtml(input, options)
97+
if len(xhtml) == 1:
98+
assert xhtml[0] == result, "Expected:\n%s\nActual:\n%s\nOptions\nxhtml:True\n%s"%(xhtml[0], result, str(options))
99+
elif result not in xhtml:
100+
assert False, "Expected: %s, Received: %s" % (xhtml, result)
108101

109102

110103
class EncodingTestCase(unittest.TestCase):
@@ -150,55 +143,38 @@ def testComment(self):
150143
self.throwsWithLatin1([["Comment", u"\u0101"]])
151144

152145

153-
class LxmlTestCase(unittest.TestCase):
154-
def setUp(self):
155-
self.parser = etree.XMLParser(resolve_entities=False)
156-
self.treewalker = html5lib.getTreeWalker("lxml")
157-
self.serializer = serializer.HTMLSerializer()
158-
159-
def testEntityReplacement(self):
160-
doc = """<!DOCTYPE html SYSTEM "about:legacy-compat"><html>&beta;</html>"""
161-
tree = etree.fromstring(doc, parser = self.parser).getroottree()
162-
result = serializer.serialize(tree, tree="lxml", omit_optional_tags=False)
163-
self.assertEquals(u"""<!DOCTYPE html SYSTEM "about:legacy-compat"><html>\u03B2</html>""", result)
164-
165-
def testEntityXML(self):
166-
doc = """<!DOCTYPE html SYSTEM "about:legacy-compat"><html>&gt;</html>"""
167-
tree = etree.fromstring(doc, parser = self.parser).getroottree()
168-
result = serializer.serialize(tree, tree="lxml", omit_optional_tags=False)
169-
self.assertEquals(u"""<!DOCTYPE html SYSTEM "about:legacy-compat"><html>&gt;</html>""", result)
170-
171-
def testEntityNoResolve(self):
172-
doc = """<!DOCTYPE html SYSTEM "about:legacy-compat"><html>&beta;</html>"""
173-
tree = etree.fromstring(doc, parser = self.parser).getroottree()
174-
result = serializer.serialize(tree, tree="lxml", omit_optional_tags=False,
175-
resolve_entities=False)
176-
self.assertEquals(u"""<!DOCTYPE html SYSTEM "about:legacy-compat"><html>&beta;</html>""", result)
177-
178-
def buildBasicTestSuite():
146+
if "lxml" in optionals_loaded:
147+
class LxmlTestCase(unittest.TestCase):
148+
def setUp(self):
149+
self.parser = etree.XMLParser(resolve_entities=False)
150+
self.treewalker = html5lib.getTreeWalker("lxml")
151+
self.serializer = serializer.HTMLSerializer()
152+
153+
def testEntityReplacement(self):
154+
doc = """<!DOCTYPE html SYSTEM "about:legacy-compat"><html>&beta;</html>"""
155+
tree = etree.fromstring(doc, parser = self.parser).getroottree()
156+
result = serializer.serialize(tree, tree="lxml", omit_optional_tags=False)
157+
self.assertEquals(u"""<!DOCTYPE html SYSTEM "about:legacy-compat"><html>\u03B2</html>""", result)
158+
159+
def testEntityXML(self):
160+
doc = """<!DOCTYPE html SYSTEM "about:legacy-compat"><html>&gt;</html>"""
161+
tree = etree.fromstring(doc, parser = self.parser).getroottree()
162+
result = serializer.serialize(tree, tree="lxml", omit_optional_tags=False)
163+
self.assertEquals(u"""<!DOCTYPE html SYSTEM "about:legacy-compat"><html>&gt;</html>""", result)
164+
165+
def testEntityNoResolve(self):
166+
doc = """<!DOCTYPE html SYSTEM "about:legacy-compat"><html>&beta;</html>"""
167+
tree = etree.fromstring(doc, parser = self.parser).getroottree()
168+
result = serializer.serialize(tree, tree="lxml", omit_optional_tags=False,
169+
resolve_entities=False)
170+
self.assertEquals(u"""<!DOCTYPE html SYSTEM "about:legacy-compat"><html>&beta;</html>""", result)
171+
172+
def test_serializer():
179173
for filename in html5lib_test_files('serializer', '*.test'):
180-
test_name = os.path.basename(filename).replace('.test','')
181174
tests = json.load(file(filename))
175+
test_name = os.path.basename(filename).replace('.test','')
182176
for index, test in enumerate(tests['tests']):
183177
xhtml = test.get("xhtml", test["expected"])
184-
if test_name == 'optionaltags': xhtml = None
185-
TestCase.addTest('test_%s_%d' % (test_name, index+1),
186-
test["description"], test["input"], test["expected"], xhtml,
187-
test.get("options", {}))
188-
return unittest.TestLoader().loadTestsFromTestCase(TestCase)
189-
190-
def buildTestSuite():
191-
allTests = [buildBasicTestSuite()]
192-
allTests.append(unittest.TestLoader().loadTestsFromTestCase(EncodingTestCase))
193-
if "lxml" in optionals_loaded:
194-
allTests.append(unittest.TestLoader().loadTestsFromTestCase(LxmlTestCase))
195-
196-
return unittest.TestSuite(allTests)
197-
198-
199-
def main():
200-
buildTestSuite()
201-
unittest.main()
202-
203-
if __name__ == "__main__":
204-
main()
178+
if test_name == 'optionaltags':
179+
xhtml = None
180+
yield make_test, test["input"], test["expected"], xhtml, test.get("options", {})

html5lib/tests/test_tokenizer.py

Lines changed: 29 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -138,33 +138,32 @@ def decode(inp):
138138
token[2][decode(key)] = decode(value)
139139
return test
140140

141-
class TestCase(unittest.TestCase):
142-
def runTokenizerTest(self, test):
143-
#XXX - move this out into the setup function
144-
#concatenate all consecutive character tokens into a single token
145-
if 'doubleEscaped' in test:
146-
test = unescape_test(test)
147-
148-
expected = concatenateCharacterTokens(test['output'])
149-
if 'lastStartTag' not in test:
150-
test['lastStartTag'] = None
151-
outBuffer = cStringIO.StringIO()
152-
stdout = sys.stdout
153-
sys.stdout = outBuffer
154-
parser = TokenizerTestParser(test['initialState'],
155-
test['lastStartTag'])
156-
tokens = parser.parse(test['input'])
157-
tokens = concatenateCharacterTokens(tokens)
158-
received = normalizeTokens(tokens)
159-
errorMsg = u"\n".join(["\n\nInitial state:",
160-
test['initialState'] ,
161-
"\nInput:", unicode(test['input']),
162-
"\nExpected:", unicode(expected),
163-
"\nreceived:", unicode(tokens)])
164-
errorMsg = errorMsg.encode("utf-8")
165-
ignoreErrorOrder = test.get('ignoreErrorOrder', False)
166-
self.assertEquals(tokensMatch(expected, received, ignoreErrorOrder),
167-
True, errorMsg)
141+
142+
def runTokenizerTest(test):
143+
#XXX - move this out into the setup function
144+
#concatenate all consecutive character tokens into a single token
145+
if 'doubleEscaped' in test:
146+
test = unescape_test(test)
147+
148+
expected = concatenateCharacterTokens(test['output'])
149+
if 'lastStartTag' not in test:
150+
test['lastStartTag'] = None
151+
outBuffer = cStringIO.StringIO()
152+
stdout = sys.stdout
153+
sys.stdout = outBuffer
154+
parser = TokenizerTestParser(test['initialState'],
155+
test['lastStartTag'])
156+
tokens = parser.parse(test['input'])
157+
tokens = concatenateCharacterTokens(tokens)
158+
received = normalizeTokens(tokens)
159+
errorMsg = u"\n".join(["\n\nInitial state:",
160+
test['initialState'] ,
161+
"\nInput:", unicode(test['input']),
162+
"\nExpected:", unicode(expected),
163+
"\nreceived:", unicode(tokens)])
164+
errorMsg = errorMsg.encode("utf-8")
165+
ignoreErrorOrder = test.get('ignoreErrorOrder', False)
166+
assert tokensMatch(expected, received, ignoreErrorOrder), errorMsg
168167

169168

170169
def _doCapitalize(match):
@@ -178,7 +177,7 @@ def capitalize(s):
178177
return s
179178

180179

181-
def buildTestSuite():
180+
def test_tokenizer():
182181
for filename in html5lib_test_files('tokenizer', '*.test'):
183182
tests = json.load(file(filename))
184183
testName = os.path.basename(filename).replace(".test","")
@@ -190,16 +189,5 @@ def buildTestSuite():
190189
test["initialStates"] = ["Data state"]
191190
for initialState in test["initialStates"]:
192191
test["initialState"] = capitalize(initialState)
193-
def testFunc(self, test=test):
194-
self.runTokenizerTest(test)
195-
testFunc.__doc__ = "\t".join([testName,
196-
test['description']])
197-
setattr(TestCase, 'test_%s_%d_%s' % (testName, index, test["initialState"]), testFunc)
198-
return unittest.TestLoader().loadTestsFromTestCase(TestCase)
199-
200-
def main():
201-
buildTestSuite()
202-
unittest.main()
203-
204-
if __name__ == "__main__":
205-
main()
192+
yield runTokenizerTest, test
193+

html5lib/tests/test_treewalkers.py

Lines changed: 25 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -242,30 +242,6 @@ def sortattrs(x):
242242
lines.sort()
243243
return "\n".join(lines)
244244

245-
class TestCase(unittest.TestCase):
246-
def runTest(self, innerHTML, input, expected, errors, treeClass):
247-
try:
248-
p = html5parser.HTMLParser(tree = treeClass["builder"])
249-
if innerHTML:
250-
document = p.parseFragment(StringIO.StringIO(input), innerHTML)
251-
else:
252-
document = p.parse(StringIO.StringIO(input))
253-
except constants.DataLossWarning:
254-
#Ignore testcases we know we don't pass
255-
return
256-
257-
document = treeClass.get("adapter", lambda x: x)(document)
258-
try:
259-
output = convertTokens(treeClass["walker"](document))
260-
output = attrlist.sub(sortattrs, output)
261-
expected = attrlist.sub(sortattrs, convertExpected(expected))
262-
self.assertEquals(expected, output, "\n".join([
263-
"", "Input:", input,
264-
"", "Expected:", expected,
265-
"", "Received:", output
266-
]))
267-
except NotImplementedError:
268-
pass # Amnesty for those that confess...
269245

270246
class TokenTestCase(unittest.TestCase):
271247
def test_all_tokens(self):
@@ -290,8 +266,31 @@ def test_all_tokens(self):
290266
for expectedToken, outputToken in zip(expected, output):
291267
self.assertEquals(expectedToken, outputToken)
292268

269+
def run_test(innerHTML, input, expected, errors, treeClass):
270+
try:
271+
p = html5parser.HTMLParser(tree = treeClass["builder"])
272+
if innerHTML:
273+
document = p.parseFragment(StringIO.StringIO(input), innerHTML)
274+
else:
275+
document = p.parse(StringIO.StringIO(input))
276+
except constants.DataLossWarning:
277+
#Ignore testcases we know we don't pass
278+
return
279+
280+
document = treeClass.get("adapter", lambda x: x)(document)
281+
try:
282+
output = convertTokens(treeClass["walker"](document))
283+
output = attrlist.sub(sortattrs, output)
284+
expected = attrlist.sub(sortattrs, convertExpected(expected))
285+
assert expected == output, "\n".join([
286+
"", "Input:", input,
287+
"", "Expected:", expected,
288+
"", "Received:", output
289+
])
290+
except NotImplementedError:
291+
pass # Amnesty for those that confess...
293292

294-
def buildTestSuite():
293+
def test_treewalker():
295294
sys.stdout.write('Testing tree walkers '+ " ".join(treeTypes.keys()) + "\n")
296295

297296
for treeName, treeCls in treeTypes.iteritems():
@@ -307,17 +306,6 @@ def buildTestSuite():
307306
"document-fragment",
308307
"document")]
309308
errors = errors.split("\n")
310-
def testFunc(self, innerHTML=innerHTML, input=input,
311-
expected=expected, errors=errors, treeCls=treeCls):
312-
self.runTest(innerHTML, input, expected, errors, treeCls)
313-
setattr(TestCase, "test_%s_%d_%s" % (testName,index+1,treeName),
314-
testFunc)
315-
316-
return unittest.TestLoader().loadTestsFromTestCase(TestCase)
309+
yield run_test, innerHTML, input, expected, errors, treeCls
317310

318-
def main():
319-
buildTestSuite()
320-
unittest.main()
321311

322-
if __name__ == "__main__":
323-
main()

html5lib/treewalkers/etree.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,11 @@ def getNodeDetails(self, node):
6161
return (_base.DOCTYPE, node.text,
6262
node.get("publicId"), node.get("systemId"))
6363

64-
elif type(node.tag) == type(ElementTree.Comment):
64+
elif node.tag == ElementTree.Comment:
6565
return _base.COMMENT, node.text
6666

6767
else:
68+
assert type(node.tag) in (str, unicode), type(node.tag)
6869
#This is assumed to be an ordinary element
6970
match = tag_regexp.match(node.tag)
7071
if match:

setup.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
]
2222

2323
setup(name='html5lib',
24-
version='0.95-dev',
24+
version='0.95',
2525
url='http://code.google.com/p/html5lib/',
2626
license="MIT License",
2727
description='HTML parser based on the WHAT-WG Web Applications 1.0'
@@ -34,6 +34,5 @@
3434
for name in os.listdir(os.path.join('html5lib'))
3535
if os.path.isdir(os.path.join('html5lib',name)) and
3636
not name.startswith('.')],
37-
test_suite = "html5lib.tests.buildTestSuite",
38-
tests_require = ['simplejson']
37+
test_suite = "html5lib.tests.buildTestSuite"
3938
)

0 commit comments

Comments
 (0)