diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-attr-too-few.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-attr-too-few.ifc new file mode 100644 index 0000000000..b39bc0dee1 --- /dev/null +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-attr-too-few.ifc @@ -0,0 +1,10 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('','2022-10-02T14:16:07',(),(),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0',''); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPERSON($,$,$,$,$,$,$); +ENDSEC; +END-ISO-10303-21; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-attr-too-many.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-attr-too-many.ifc new file mode 100644 index 0000000000..f39c0cf0d3 --- /dev/null +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-attr-too-many.ifc @@ -0,0 +1,10 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('','2022-10-02T14:16:07',(),(),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0',''); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPERSON($,$,$,$,$,$,$,$,$); +ENDSEC; +END-ISO-10303-21; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-header-attr-too-few.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-header-attr-too-few.ifc new file mode 100644 index 0000000000..e1954b0d33 --- /dev/null +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-header-attr-too-few.ifc @@ -0,0 +1,10 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('','2022-10-02T14:16:07',(),(),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0'); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPERSON($,$,$,$,$,$,$,$); +ENDSEC; +END-ISO-10303-21; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-header-attr-too-many.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-header-attr-too-many.ifc new file mode 100644 index 0000000000..216fc1b1bc --- /dev/null +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-header-attr-too-many.ifc @@ -0,0 +1,10 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('','2022-10-02T14:16:07',(),(),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0','',''); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPERSON($,$,$,$,$,$,$,$); +ENDSEC; +END-ISO-10303-21; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-invalid-entity.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-invalid-entity.ifc new file mode 100644 index 0000000000..3788c16cd5 --- /dev/null +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-invalid-entity.ifc @@ -0,0 +1,12 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('','2022-10-01T16:31:47',(),(),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0',''); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCBUILTELEMENT('2CbOYFeCHBku9$oytmyQ2e',$,$,$,$,$,$,$); +#2=IFCRELASSOCIATESMATERIAL('0e6aLxV9b8OvwguVdjzRsn',$,$,$,(#1),#3); +#3=IFCMATERIAL('brick',$,$); +ENDSEC; +END-ISO-10303-21; diff --git a/src/ifcopenshell-python/test/fixtures/validate/pass-attr-count-ok.ifc b/src/ifcopenshell-python/test/fixtures/validate/pass-attr-count-ok.ifc new file mode 100644 index 0000000000..0e62b69592 --- /dev/null +++ b/src/ifcopenshell-python/test/fixtures/validate/pass-attr-count-ok.ifc @@ -0,0 +1,10 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('','2022-10-02T14:16:07',(),(),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0',''); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPERSON($,$,$,$,$,$,$,$); +ENDSEC; +END-ISO-10303-21; diff --git a/src/ifcopenshell-python/test/validate.py b/src/ifcopenshell-python/test/validate.py new file mode 100644 index 0000000000..5ad4a83f45 --- /dev/null +++ b/src/ifcopenshell-python/test/validate.py @@ -0,0 +1,41 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Thomas Krijnen +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import os +import glob + +import pytest + +import ifcopenshell.validate + + +@pytest.mark.parametrize( + "file", + glob.glob(os.path.join(os.path.dirname(__file__), "fixtures/validate/*.ifc")), +) +def test_file(file): + logger = ifcopenshell.validate.json_logger() + ifcopenshell.validate.validate(file, logger) + if file.startswith("fail-"): + assert len(logger.statements) > 0 + if file.startswith("pass-"): + assert len(logger.statements) == 0 + + +if __name__ == "__main__": + pytest.main(["-sx", __file__])