xref: /trunk/test/aoo-test/tests/selftest/test_kinds.py (revision 85d6e4e58e50c1ed01601e2737a66d9715456246)
1*85d6e4e5SJim Jagielski################################################################
2*85d6e4e5SJim Jagielski#
3*85d6e4e5SJim Jagielski#  Licensed to the Apache Software Foundation (ASF) under one
4*85d6e4e5SJim Jagielski#  or more contributor license agreements.  See the NOTICE file
5*85d6e4e5SJim Jagielski#  distributed with this work for additional information
6*85d6e4e5SJim Jagielski#  regarding copyright ownership.  The ASF licenses this file
7*85d6e4e5SJim Jagielski#  to you under the Apache License, Version 2.0 (the
8*85d6e4e5SJim Jagielski#  "License"); you may not use this file except in compliance
9*85d6e4e5SJim Jagielski#  with the License.  You may obtain a copy of the License at
10*85d6e4e5SJim Jagielski#
11*85d6e4e5SJim Jagielski#    http://www.apache.org/licenses/LICENSE-2.0
12*85d6e4e5SJim Jagielski#
13*85d6e4e5SJim Jagielski#  Unless required by applicable law or agreed to in writing,
14*85d6e4e5SJim Jagielski#  software distributed under the License is distributed on an
15*85d6e4e5SJim Jagielski#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*85d6e4e5SJim Jagielski#  KIND, either express or implied.  See the License for the
17*85d6e4e5SJim Jagielski#  specific language governing permissions and limitations
18*85d6e4e5SJim Jagielski#  under the License.
19*85d6e4e5SJim Jagielski
20*85d6e4e5SJim Jagielski"""aootest.kinds: grouping of schema errors into kinds, and what counts as worse than a baseline."""
21*85d6e4e5SJim Jagielskiimport pytest
22*85d6e4e5SJim Jagielski
23*85d6e4e5SJim Jagielskifrom aootest import kinds
24*85d6e4e5SJim Jagielski
25*85d6e4e5SJim Jagielskipytestmark = pytest.mark.selftest
26*85d6e4e5SJim Jagielski
27*85d6e4e5SJim Jagielski
28*85d6e4e5SJim Jagielskidef entry(package, message, part="content.xml"):
29*85d6e4e5SJim Jagielski    return ["%s/%s" % (package, part), 2, 10, message]
30*85d6e4e5SJim Jagielski
31*85d6e4e5SJim Jagielski
32*85d6e4e5SJim JagielskiVAL = {"errors": {"12": [entry("a.odt", 'element "text:bogus" not allowed here; expected element "text:p"'),
33*85d6e4e5SJim Jagielski                         entry("b.odt", 'element "text:bogus" not allowed here; expected element "text:h"'),
34*85d6e4e5SJim Jagielski                         entry("b.odt", 'attribute "x:y" not allowed here'),
35*85d6e4e5SJim Jagielski                         entry("other.odt", 'attribute "x:y" not allowed here')]}}
36*85d6e4e5SJim Jagielski
37*85d6e4e5SJim Jagielski
38*85d6e4e5SJim Jagielskidef test_errors_are_grouped_by_message_without_the_expected_tail_and_limited_to_the_packages():
39*85d6e4e5SJim Jagielski    got = kinds.kinds_of(VAL, "12", {"a.odt", "b.odt"})
40*85d6e4e5SJim Jagielski    assert got == {'element "text:bogus" not allowed here': {"errors": 2, "packages": ["a.odt", "b.odt"]},
41*85d6e4e5SJim Jagielski                   'attribute "x:y" not allowed here': {"errors": 1, "packages": ["b.odt"]}}
42*85d6e4e5SJim Jagielski
43*85d6e4e5SJim Jagielski
44*85d6e4e5SJim Jagielskidef test_jing_failures_that_name_the_work_directory_are_one_kind_whatever_the_directory():
45*85d6e4e5SJim Jagielski    a = {"errors": {"12": [["?", 0, 0, "file not found: /tmp/one/w-validate/12/a.odt/META-INF/Manifest.dtd"]]}}
46*85d6e4e5SJim Jagielski    b = {"errors": {"12": [["?", 0, 0, "file not found: /var/x/two/w-validate/12/a.odt/META-INF/Manifest.dtd"]]}}
47*85d6e4e5SJim Jagielski    # the package of such an entry is "?", so name it
48*85d6e4e5SJim Jagielski    assert kinds.kinds_of(a, "12", {"?"}) == kinds.kinds_of(b, "12", {"?"})
49*85d6e4e5SJim Jagielski    assert list(kinds.kinds_of(a, "12", {"?"})) == ["UNPARSED: file not found: <workdir>/12/a.odt/META-INF/Manifest.dtd"]
50*85d6e4e5SJim Jagielski
51*85d6e4e5SJim Jagielski
52*85d6e4e5SJim JagielskiBASE = {"documents": ["a.odt", "b.odt"], "kinds": {"k1": {"errors": 3, "packages": ["a.odt", "b.odt"]}, "k2": {"errors": 1, "packages": ["b.odt"]}}}
53*85d6e4e5SJim Jagielski
54*85d6e4e5SJim Jagielski
55*85d6e4e5SJim Jagielskidef test_the_same_kinds_are_not_worse():
56*85d6e4e5SJim Jagielski    assert kinds.judge(BASE, ["a.odt", "b.odt"], BASE["kinds"]) == ([], False)
57*85d6e4e5SJim Jagielski
58*85d6e4e5SJim Jagielski
59*85d6e4e5SJim Jagielski@pytest.mark.parametrize("change", [
60*85d6e4e5SJim Jagielski    lambda k: {**k, "k3": {"errors": 1, "packages": ["a.odt"]}},
61*85d6e4e5SJim Jagielski    lambda k: {**k, "k1": {"errors": 4, "packages": ["a.odt", "b.odt"]}},
62*85d6e4e5SJim Jagielski    lambda k: {**k, "k2": {"errors": 1, "packages": ["a.odt", "b.odt"]}},
63*85d6e4e5SJim Jagielski])
64*85d6e4e5SJim Jagielskidef test_a_new_kind_or_a_higher_count_or_another_package_is_worse(change):
65*85d6e4e5SJim Jagielski    lines, bad = kinds.judge(BASE, ["a.odt", "b.odt"], change(BASE["kinds"]))
66*85d6e4e5SJim Jagielski    assert bad and any(l.startswith("WORSE") for l in lines)
67*85d6e4e5SJim Jagielski
68*85d6e4e5SJim Jagielski
69*85d6e4e5SJim Jagielskidef test_fewer_errors_are_reported_but_not_worse():
70*85d6e4e5SJim Jagielski    lines, bad = kinds.judge(BASE, ["a.odt", "b.odt"], {"k1": {"errors": 2, "packages": ["a.odt"]}})
71*85d6e4e5SJim Jagielski    assert not bad and lines and all(l.startswith("better") for l in lines)
72*85d6e4e5SJim Jagielski
73*85d6e4e5SJim Jagielski
74*85d6e4e5SJim Jagielskidef test_a_baseline_document_that_is_no_longer_covered_is_worse():
75*85d6e4e5SJim Jagielski    lines, bad = kinds.judge(BASE, ["a.odt"], BASE["kinds"])
76*85d6e4e5SJim Jagielski    assert bad and lines == ["NOT COVERED  b.odt"]
77*85d6e4e5SJim Jagielski
78*85d6e4e5SJim Jagielski
79*85d6e4e5SJim Jagielskidef test_a_written_baseline_reads_back(tmp_path, monkeypatch):
80*85d6e4e5SJim Jagielski    monkeypatch.setattr(kinds, "BASELINE", tmp_path / "baseline")
81*85d6e4e5SJim Jagielski    kinds.write("ext", "12", {"b.odt", "a.odt"}, BASE["kinds"])
82*85d6e4e5SJim Jagielski    assert kinds.load("ext", "12") == BASE
83*85d6e4e5SJim Jagielski    assert kinds.load("ext", "13") is None
84