Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[3.11] bpo-45229: Make ElementTree tests discoverable (GH-108859) #108874

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 17 additions & 48 deletions Lib/test/test_xml_etree.py
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,7 @@ def test_path_cache(self):
from xml.etree import ElementPath

elem = ET.XML(SAMPLE_XML)
ElementPath._cache.clear()
for i in range(10): ET.ElementTree(elem).find('./'+str(i))
cache_len_10 = len(ElementPath._cache)
for i in range(10): ET.ElementTree(elem).find('./'+str(i))
Expand Down Expand Up @@ -3955,8 +3956,9 @@ def test_issue14818(self):
# --------------------------------------------------------------------

class NoAcceleratorTest(unittest.TestCase):
def setUp(self):
if not pyET:
@classmethod
def setUpClass(cls):
if ET is not pyET:
raise unittest.SkipTest('only for the Python version')

# Test that the C accelerator was not imported for pyET
Expand Down Expand Up @@ -4202,8 +4204,7 @@ def get_option(config, option_name, default=None):

# --------------------------------------------------------------------


def test_main(module=None):
def setUpModule(module=None):
# When invoked without a module, runs the Python ET tests by loading pyET.
# Otherwise, uses the given module as the ET.
global pyET
Expand All @@ -4215,62 +4216,30 @@ def test_main(module=None):
global ET
ET = module

test_classes = [
ModuleTest,
ElementSlicingTest,
BasicElementTest,
BadElementTest,
BadElementPathTest,
ElementTreeTest,
IOTest,
ParseErrorTest,
XIncludeTest,
ElementTreeTypeTest,
ElementFindTest,
ElementIterTest,
TreeBuilderTest,
XMLParserTest,
XMLPullParserTest,
BugsTest,
KeywordArgsTest,
C14NTest,
]

# These tests will only run for the pure-Python version that doesn't import
# _elementtree. We can't use skipUnless here, because pyET is filled in only
# after the module is loaded.
if pyET is not ET:
test_classes.extend([
NoAcceleratorTest,
])
# don't interfere with subsequent tests
def cleanup():
global ET, pyET
ET = pyET = None
unittest.addModuleCleanup(cleanup)

# Provide default namespace mapping and path cache.
from xml.etree import ElementPath
nsmap = ET.register_namespace._namespace_map
# Copy the default namespace mapping
nsmap_copy = nsmap.copy()
unittest.addModuleCleanup(nsmap.update, nsmap_copy)
unittest.addModuleCleanup(nsmap.clear)

# Copy the path cache (should be empty)
path_cache = ElementPath._cache
unittest.addModuleCleanup(setattr, ElementPath, "_cache", path_cache)
ElementPath._cache = path_cache.copy()

# Align the Comment/PI factories.
if hasattr(ET, '_set_factories'):
old_factories = ET._set_factories(ET.Comment, ET.PI)
else:
old_factories = None

try:
return support.run_unittest(*test_classes)
finally:
from xml.etree import ElementPath
# Restore mapping and path cache
nsmap.clear()
nsmap.update(nsmap_copy)
ElementPath._cache = path_cache
if old_factories is not None:
ET._set_factories(*old_factories)
# don't interfere with subsequent tests
ET = pyET = None
unittest.addModuleCleanup(ET._set_factories, *old_factories)


if __name__ == '__main__':
test_main()
unittest.main()
31 changes: 18 additions & 13 deletions Lib/test/test_xml_etree_c.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,20 +234,25 @@ def test_element_with_children(self):
self.check_sizeof(e, self.elementsize + self.extra +
struct.calcsize('8P'))

def test_main():
from test import test_xml_etree

# Run the tests specific to the C implementation
support.run_unittest(
MiscTests,
TestAliasWorking,
TestAcceleratorImported,
SizeofTest,
)

# Run the same test suite as the Python module
test_xml_etree.test_main(module=cET)
def install_tests():
# Test classes should have __module__ referring to this module.
from test import test_xml_etree
for name, base in vars(test_xml_etree).items():
if isinstance(base, type) and issubclass(base, unittest.TestCase):
class Temp(base):
pass
Temp.__name__ = Temp.__qualname__ = name
Temp.__module__ = __name__
assert name not in globals()
globals()[name] = Temp

install_tests()

def setUpModule():
from test import test_xml_etree
test_xml_etree.setUpModule(module=cET)


if __name__ == '__main__':
test_main()
unittest.main()