xref: /third_party/PyYAML/tests/lib/test_schema.py (revision a5f9918a)
1a5f9918aSopenharmony_ciimport yaml
2a5f9918aSopenharmony_ciimport sys
3a5f9918aSopenharmony_ciimport pprint
4a5f9918aSopenharmony_ciimport math
5a5f9918aSopenharmony_ci
6a5f9918aSopenharmony_cidef check_bool(value, expected):
7a5f9918aSopenharmony_ci    if expected == 'false()' and value is False:
8a5f9918aSopenharmony_ci        return 1
9a5f9918aSopenharmony_ci    if expected == 'true()' and value is True:
10a5f9918aSopenharmony_ci        return 1
11a5f9918aSopenharmony_ci    print(value)
12a5f9918aSopenharmony_ci    print(expected)
13a5f9918aSopenharmony_ci    return 0
14a5f9918aSopenharmony_ci
15a5f9918aSopenharmony_cidef check_int(value, expected):
16a5f9918aSopenharmony_ci    if (int(expected) == value):
17a5f9918aSopenharmony_ci        return 1
18a5f9918aSopenharmony_ci    print(value)
19a5f9918aSopenharmony_ci    print(expected)
20a5f9918aSopenharmony_ci    return 0
21a5f9918aSopenharmony_ci
22a5f9918aSopenharmony_cidef check_float(value, expected):
23a5f9918aSopenharmony_ci    if expected == 'inf()':
24a5f9918aSopenharmony_ci        if value == math.inf:
25a5f9918aSopenharmony_ci            return 1
26a5f9918aSopenharmony_ci    elif expected == 'inf-neg()':
27a5f9918aSopenharmony_ci        if value == -math.inf:
28a5f9918aSopenharmony_ci            return 1
29a5f9918aSopenharmony_ci    elif expected == 'nan()':
30a5f9918aSopenharmony_ci        if math.isnan(value):
31a5f9918aSopenharmony_ci            return 1
32a5f9918aSopenharmony_ci    elif (float(expected) == value):
33a5f9918aSopenharmony_ci        return 1
34a5f9918aSopenharmony_ci    else:
35a5f9918aSopenharmony_ci        print(value)
36a5f9918aSopenharmony_ci        print(expected)
37a5f9918aSopenharmony_ci        return 0
38a5f9918aSopenharmony_ci
39a5f9918aSopenharmony_cidef check_str(value, expected):
40a5f9918aSopenharmony_ci    if value == expected:
41a5f9918aSopenharmony_ci        return 1
42a5f9918aSopenharmony_ci    print(value)
43a5f9918aSopenharmony_ci    print(expected)
44a5f9918aSopenharmony_ci    return 0
45a5f9918aSopenharmony_ci
46a5f9918aSopenharmony_ci
47a5f9918aSopenharmony_cidef _fail(input, test):
48a5f9918aSopenharmony_ci    print("Input: >>" + input + "<<")
49a5f9918aSopenharmony_ci    print(test)
50a5f9918aSopenharmony_ci
51a5f9918aSopenharmony_ci# The tests/data/yaml11.schema file is copied from
52a5f9918aSopenharmony_ci# https://github.com/perlpunk/yaml-test-schema/blob/master/data/schema-yaml11.yaml
53a5f9918aSopenharmony_cidef test_implicit_resolver(data_filename, skip_filename, verbose=False):
54a5f9918aSopenharmony_ci    types = {
55a5f9918aSopenharmony_ci        'str':   [str,   check_str],
56a5f9918aSopenharmony_ci        'int':   [int,   check_int],
57a5f9918aSopenharmony_ci        'float': [float, check_float],
58a5f9918aSopenharmony_ci        'inf':   [float, check_float],
59a5f9918aSopenharmony_ci        'nan':   [float, check_float],
60a5f9918aSopenharmony_ci        'bool':  [bool,  check_bool],
61a5f9918aSopenharmony_ci    }
62a5f9918aSopenharmony_ci    with open(skip_filename, 'rb') as file:
63a5f9918aSopenharmony_ci        skipdata = yaml.load(file, Loader=yaml.SafeLoader)
64a5f9918aSopenharmony_ci    skip_load = skipdata['load']
65a5f9918aSopenharmony_ci    skip_dump = skipdata['dump']
66a5f9918aSopenharmony_ci    if verbose:
67a5f9918aSopenharmony_ci        print(skip_load)
68a5f9918aSopenharmony_ci    with open(data_filename, 'rb') as file:
69a5f9918aSopenharmony_ci        tests = yaml.load(file, Loader=yaml.SafeLoader)
70a5f9918aSopenharmony_ci
71a5f9918aSopenharmony_ci    i = 0
72a5f9918aSopenharmony_ci    fail = 0
73a5f9918aSopenharmony_ci    for i, (input, test) in enumerate(sorted(tests.items())):
74a5f9918aSopenharmony_ci        if verbose:
75a5f9918aSopenharmony_ci            print('-------------------- ' + str(i))
76a5f9918aSopenharmony_ci
77a5f9918aSopenharmony_ci        # Skip known loader bugs
78a5f9918aSopenharmony_ci        if input in skip_load:
79a5f9918aSopenharmony_ci            continue
80a5f9918aSopenharmony_ci
81a5f9918aSopenharmony_ci        exp_type = test[0]
82a5f9918aSopenharmony_ci        data     = test[1]
83a5f9918aSopenharmony_ci        exp_dump = test[2]
84a5f9918aSopenharmony_ci
85a5f9918aSopenharmony_ci        # Test loading
86a5f9918aSopenharmony_ci        try:
87a5f9918aSopenharmony_ci            loaded = yaml.safe_load(input)
88a5f9918aSopenharmony_ci        except:
89a5f9918aSopenharmony_ci            print("Error:", sys.exc_info()[0], '(', sys.exc_info()[1], ')')
90a5f9918aSopenharmony_ci            fail+=1
91a5f9918aSopenharmony_ci            _fail(input, test)
92a5f9918aSopenharmony_ci            continue
93a5f9918aSopenharmony_ci
94a5f9918aSopenharmony_ci        if verbose:
95a5f9918aSopenharmony_ci            print(input)
96a5f9918aSopenharmony_ci            print(test)
97a5f9918aSopenharmony_ci            print(loaded)
98a5f9918aSopenharmony_ci            print(type(loaded))
99a5f9918aSopenharmony_ci
100a5f9918aSopenharmony_ci        if exp_type == 'null':
101a5f9918aSopenharmony_ci            if loaded is None:
102a5f9918aSopenharmony_ci                pass
103a5f9918aSopenharmony_ci            else:
104a5f9918aSopenharmony_ci                fail+=1
105a5f9918aSopenharmony_ci                _fail(input, test)
106a5f9918aSopenharmony_ci        else:
107a5f9918aSopenharmony_ci            t = types[exp_type][0]
108a5f9918aSopenharmony_ci            code = types[exp_type][1]
109a5f9918aSopenharmony_ci            if isinstance(loaded, t):
110a5f9918aSopenharmony_ci                if code(loaded, data):
111a5f9918aSopenharmony_ci                    pass
112a5f9918aSopenharmony_ci                else:
113a5f9918aSopenharmony_ci                    fail+=1
114a5f9918aSopenharmony_ci                    _fail(input, test)
115a5f9918aSopenharmony_ci            else:
116a5f9918aSopenharmony_ci                fail+=1
117a5f9918aSopenharmony_ci                _fail(input, test)
118a5f9918aSopenharmony_ci
119a5f9918aSopenharmony_ci        # Skip known dumper bugs
120a5f9918aSopenharmony_ci        if input in skip_dump:
121a5f9918aSopenharmony_ci            continue
122a5f9918aSopenharmony_ci
123a5f9918aSopenharmony_ci        dump = yaml.safe_dump(loaded, explicit_end=False)
124a5f9918aSopenharmony_ci        # strip trailing newlines and footers
125a5f9918aSopenharmony_ci        if dump.endswith('\n...\n'):
126a5f9918aSopenharmony_ci            dump = dump[:-5]
127a5f9918aSopenharmony_ci        if dump.endswith('\n'):
128a5f9918aSopenharmony_ci            dump = dump[:-1]
129a5f9918aSopenharmony_ci        if dump == exp_dump:
130a5f9918aSopenharmony_ci            pass
131a5f9918aSopenharmony_ci        else:
132a5f9918aSopenharmony_ci            print("Compare: >>" + dump + "<< >>" + exp_dump + "<<")
133a5f9918aSopenharmony_ci            fail+=1
134a5f9918aSopenharmony_ci            _fail(input, test)
135a5f9918aSopenharmony_ci
136a5f9918aSopenharmony_ci#        if i >= 80:
137a5f9918aSopenharmony_ci#            break
138a5f9918aSopenharmony_ci
139a5f9918aSopenharmony_ci    if fail > 0:
140a5f9918aSopenharmony_ci        print("Failed " + str(fail) + " / " + str(i) + " tests")
141a5f9918aSopenharmony_ci        assert(False)
142a5f9918aSopenharmony_ci    else:
143a5f9918aSopenharmony_ci        print("Passed " + str(i) + " tests")
144a5f9918aSopenharmony_ci    print("Skipped " + str(len(skip_load)) + " load tests")
145a5f9918aSopenharmony_ci    print("Skipped " + str(len(skip_dump)) + " dump tests")
146a5f9918aSopenharmony_ci
147a5f9918aSopenharmony_citest_implicit_resolver.unittest = ['.schema', '.schema-skip']
148a5f9918aSopenharmony_ci
149a5f9918aSopenharmony_ciif __name__ == '__main__':
150a5f9918aSopenharmony_ci    import test_appliance
151a5f9918aSopenharmony_ci    test_appliance.run(globals())
152a5f9918aSopenharmony_ci
153