File: testing.py

package info (click to toggle)
xmldiff 2.6.3-0.2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 732 kB
  • sloc: python: 4,617; xml: 855; makefile: 219; sh: 16
file content (46 lines) | stat: -rw-r--r-- 1,730 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import os


def make_case_function(left_filename):
    right_filename = left_filename.replace(".left.", ".right.")
    expected_filename = left_filename.replace(".left.", ".expected.")

    def test(self):
        with open(expected_filename, encoding="utf8") as input_file:
            expected_xml = input_file.read()

        try:
            result_xml = self.process(left_filename, right_filename)
        except Exception as err:
            if ".err" not in left_filename:
                raise
            result_xml = f"{err.__class__.__name__}: {err}"

        self.assertEqual(expected_xml.strip(), result_xml.strip())

    return test


def generate_filebased_cases(data_dir, test_class, suffix="xml", ignore=()):
    for left_filename in os.listdir(data_dir):
        if not left_filename.endswith(".left." + suffix):
            continue
        if left_filename in ignore:
            continue

        left_filename = os.path.join(data_dir, left_filename)
        test_function = make_case_function(left_filename)
        function_name = os.path.split(left_filename)[-1].replace(".", "-")
        test_name = "test_" + function_name
        setattr(test_class, test_name, test_function)


def compare_elements(left, right):
    path = left.getroottree().getpath(left)
    assert left.text == right.text, "Texts differ: %s" % path
    assert left.tail == right.tail, "Tails differ: %s" % path
    assert left.attrib == right.attrib, "Attributes differ: %s" % path
    # We intentionally do NOT compare namespaces, they are allowed to differ
    assert len(left) == len(right), "Children differ: %s" % path
    for litem, ritem in zip(left.getchildren(), right.getchildren()):
        compare_elements(litem, ritem)