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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy