12cb6d6f1SJim Jagielski################################################################ 22cb6d6f1SJim Jagielski# 32cb6d6f1SJim Jagielski# Licensed to the Apache Software Foundation (ASF) under one 42cb6d6f1SJim Jagielski# or more contributor license agreements. See the NOTICE file 52cb6d6f1SJim Jagielski# distributed with this work for additional information 62cb6d6f1SJim Jagielski# regarding copyright ownership. The ASF licenses this file 72cb6d6f1SJim Jagielski# to you under the Apache License, Version 2.0 (the 82cb6d6f1SJim Jagielski# "License"); you may not use this file except in compliance 92cb6d6f1SJim Jagielski# with the License. You may obtain a copy of the License at 102cb6d6f1SJim Jagielski# 112cb6d6f1SJim Jagielski# http://www.apache.org/licenses/LICENSE-2.0 122cb6d6f1SJim Jagielski# 132cb6d6f1SJim Jagielski# Unless required by applicable law or agreed to in writing, 142cb6d6f1SJim Jagielski# software distributed under the License is distributed on an 152cb6d6f1SJim Jagielski# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 162cb6d6f1SJim Jagielski# KIND, either express or implied. See the License for the 172cb6d6f1SJim Jagielski# specific language governing permissions and limitations 182cb6d6f1SJim Jagielski# under the License. 192cb6d6f1SJim Jagielski# 202cb6d6f1SJim Jagielski################################################################ 212cb6d6f1SJim Jagielski 222cb6d6f1SJim Jagielski"""validate.check() on the negative controls: each row must hold, so a validator that stops flagging a control fails here.""" 232cb6d6f1SJim Jagielskiimport pytest 242cb6d6f1SJim Jagielski 252cb6d6f1SJim Jagielskipytestmark = pytest.mark.selftest 262cb6d6f1SJim Jagielski 272cb6d6f1SJim JagielskiBOGUS = '"text:bogus"' 282cb6d6f1SJim Jagielski 292cb6d6f1SJim Jagielski 302cb6d6f1SJim Jagielskidef flags(E, versions, pkg, needle): 312cb6d6f1SJim Jagielski return all(any(needle in m for m in E(v, pkg)) for v in versions) 322cb6d6f1SJim Jagielski 332cb6d6f1SJim Jagielski 342cb6d6f1SJim JagielskiROWS = [ 352cb6d6f1SJim Jagielski ("good.odt clean in 1.2 and 1.4", lambda E, d: not E("12", "good.odt") and not E("14", "good.odt")), 362cb6d6f1SJim Jagielski ("bad.odt flags text:bogus in 1.2 and 1.4", lambda E, d: flags(E, ("12", "14"), "bad.odt", BOGUS)), 372cb6d6f1SJim Jagielski ("wrongver.odt flags office:version in 1.2 and 1.4", lambda E, d: flags(E, ("12", "14"), "wrongver.odt", "office:version")), 382cb6d6f1SJim Jagielski ("13: good.odt clean in 1.3 and 1.3 extended", lambda E, d: not E("13", "good.odt") and not E("13x", "good.odt")), 392cb6d6f1SJim Jagielski ("13: bad.odt flags text:bogus in 1.3 and 1.3 extended", lambda E, d: flags(E, ("13", "13x"), "bad.odt", BOGUS)), 402cb6d6f1SJim Jagielski ("13: wrongver.odt flags office:version in 1.3 and 1.3 extended", lambda E, d: flags(E, ("13", "13x"), "wrongver.odt", "office:version")), 412cb6d6f1SJim Jagielski ("13: new13.odt (text:drop-down) invalid in 1.2, valid in 1.3 and 1.3 extended", 422cb6d6f1SJim Jagielski lambda E, d: bool(E("12", "new13.odt")) and not E("13", "new13.odt") and not E("13x", "new13.odt")), 432cb6d6f1SJim Jagielski ("13: extforeign.odt invalid as written, valid once foreign content is removed", 442cb6d6f1SJim Jagielski lambda E, d: bool(E("13", "extforeign.odt")) and not E("13x", "extforeign.odt")), 452cb6d6f1SJim Jagielski ("13: meta:creator-initials invalid in 1.2, valid in 1.3 and 1.3 extended; the note without it is clean in all", 462cb6d6f1SJim Jagielski lambda E, d: any('"meta:creator-initials"' in m for m in E("12", "newinit.odt")) and not E("13", "newinit.odt") and not E("13x", "newinit.odt") 472cb6d6f1SJim Jagielski and not any(E(v, "baseinit.odt") for v in ("12", "13", "13x"))), 482cb6d6f1SJim Jagielski ("13: chart:coordinate-region invalid in 1.2, valid in 1.3 and 1.3 extended; the chart without it is clean in all", 492cb6d6f1SJim Jagielski lambda E, d: any('"chart:coordinate-region"' in m for m in E("12", "newregion.odc")) and not E("13", "newregion.odc") and not E("13x", "newregion.odc") 502cb6d6f1SJim Jagielski and not any(E(v, "baseregion.odc") for v in ("12", "13", "13x"))), 512cb6d6f1SJim Jagielski ("13: style:scale-to-X/Y together with style:scale-to invalid in 1.3 and 1.3 extended", 522cb6d6f1SJim Jagielski lambda E, d: flags(E, ("13", "13x"), "scaleboth.odt", '"style:scale-to"')), 532cb6d6f1SJim Jagielski ("13: style:scale-to-X/Y alone and style:scale-to alone valid in 1.3 and 1.3 extended; X/Y invalid in 1.2", 542cb6d6f1SJim Jagielski lambda E, d: not any(E(v, p) for v in ("13", "13x") for p in ("scalexy.odt", "scaleone.odt")) 552cb6d6f1SJim Jagielski and any('"style:scale-to-X"' in m for m in E("12", "scalexy.odt")) and not E("12", "scaleone.odt")), 56*6e223505SJim Jagielski ("14: good.odt clean in 1.4 and 1.4 extended; a 1.3 version is rewritten like a 1.2 one", lambda E, d: not E("14", "good.odt") and not E("14x", "good.odt")), 57*6e223505SJim Jagielski ("14: bad.odt flags text:bogus in 1.4 and 1.4 extended", lambda E, d: flags(E, ("14", "14x"), "bad.odt", BOGUS)), 58*6e223505SJim Jagielski ("14: wrongver.odt (1.1) flags office:version in 1.4 and 1.4 extended", lambda E, d: flags(E, ("14", "14x"), "wrongver.odt", "office:version")), 59*6e223505SJim Jagielski ("14: extforeign.odt invalid as written, valid in 1.4 extended once foreign content is removed", 60*6e223505SJim Jagielski lambda E, d: bool(E("14", "extforeign.odt")) and not E("14x", "extforeign.odt")), 61*6e223505SJim Jagielski ("14: draw:decorative invalid in 1.2 and 1.3, valid in 1.4 and 1.4 extended; the same style without it is clean in all", 62*6e223505SJim Jagielski lambda E, d: all(any('"draw:decorative"' in m for m in E(v, "newdeco.odt")) for v in ("12", "13")) 63*6e223505SJim Jagielski and not E("14", "newdeco.odt") and not E("14x", "newdeco.odt") and not any(E(v, "basedeco.odt") for v in ("12", "13", "14", "14x"))), 64*6e223505SJim Jagielski ("14: draw:handle with only the old combined attribute valid in 1.2 and 1.3, invalid in 1.4 and 1.4 extended", 65*6e223505SJim Jagielski lambda E, d: not any(E(v, "handleold.odt") for v in ("12", "13")) and all(E(v, "handleold.odt") for v in ("14", "14x"))), 66*6e223505SJim Jagielski ("14: draw:handle with the new position or polar pair valid in 1.4 and 1.4 extended, invalid in 1.2 and 1.3", 67*6e223505SJim Jagielski lambda E, d: not any(E(v, p) for v in ("14", "14x") for p in ("handlenew.odt", "handlepolar.odt")) 68*6e223505SJim Jagielski and all(E(v, p) for v in ("12", "13") for p in ("handlenew.odt", "handlepolar.odt"))), 692cb6d6f1SJim Jagielski ("mathobj.odt MathML object skipped", lambda E, d: d["mathml_skipped"] == ["mathobj.odt/Object 1/content.xml"] and not E("12", "mathobj.odt")), 702cb6d6f1SJim Jagielski ("no unparsed jing output", lambda E, d: not any(e[0] == "?" for v in d["errors"] for e in d["errors"][v])), 712cb6d6f1SJim Jagielski ("extended: extforeign.odt invalid as written, valid once foreign content is removed", 722cb6d6f1SJim Jagielski lambda E, d: bool(E("12", "extforeign.odt")) and not E("12x", "extforeign.odt")), 732cb6d6f1SJim Jagielski ("extended: good.odt, goodid.odt clean", lambda E, d: not E("12x", "good.odt") and not E("12x", "goodid.odt")), 742cb6d6f1SJim Jagielski ("extended: bad.odt (unknown element in an ODF namespace) still flagged", lambda E, d: any(BOGUS in m for m in E("12x", "bad.odt"))), 752cb6d6f1SJim Jagielski ("extended: wrongver.odt (attribute in an ODF namespace) still flagged", lambda E, d: any("office:version" in m for m in E("12x", "wrongver.odt"))), 762cb6d6f1SJim Jagielski ("extended: badns.odt (unbound prefix) still flagged", lambda E, d: any("not bound" in m for m in E("12x", "badns.odt"))), 772cb6d6f1SJim Jagielski] 782cb6d6f1SJim Jagielski 792cb6d6f1SJim Jagielski 802cb6d6f1SJim Jagielski@pytest.mark.parametrize("row", [pytest.param(r[1], id=r[0]) for r in ROWS]) 812cb6d6f1SJim Jagielskidef test_validate_controls(row, errs, val): 822cb6d6f1SJim Jagielski assert row(errs, val) 83