From 5f5ab10b35420dd33d4405286826fd5a3834bde1 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 2 Sep 2024 13:06:14 +0500 Subject: [PATCH] ifcopenshell.validate to validate ifc header #4119 --- .../ifcopenshell/validate.py | 64 ++++++++++++++++++- .../fixtures/validate/fail-attr-too-few.ifc | 2 +- .../fixtures/validate/fail-attr-too-many.ifc | 2 +- .../fixtures/validate/fail-derived-as-nil.ifc | 2 +- .../validate/fail-duplicated-guids-ifc2x3.ifc | 2 +- .../validate/fail-duplicated-guids-ifc4.ifc | 2 +- .../validate/fail-duplicated-guids-ifc4x3.ifc | 2 +- .../validate/fail-group-0-rels-IFC2X3.ifc | 2 +- .../validate/fail-group-2-rels-IFC2X3.ifc | 2 +- .../validate/fail-header-attr-too-few.ifc | 2 +- .../validate/fail-header-attr-too-many.ifc | 2 +- ...-header-wrong-type-instead-of-list-str.ifc | 10 +++ .../fail-header-wrong-type-instead-of-str.ifc | 10 +++ .../validate/fail-header-wrong-type-list.ifc | 10 +++ .../fixtures/validate/fail-invalid-entity.ifc | 2 +- .../fail-invalid-selected-enumeration.ifc | 2 +- .../fail-invalid-selected-simple-type.ifc | 2 +- .../fixtures/validate/fail-nil-as-derived.ifc | 2 +- .../fixtures/validate/pass-attr-count-ok.ifc | 2 +- .../validate/pass-complex-number-ifc4.ifc | 2 +- .../fixtures/validate/pass-derived-ok.ifc | 2 +- .../validate/pass-group-1-rels-IFC2X3.ifc | 2 +- .../fixtures/validate/pass-header-valid.ifc | 10 +++ .../pass-not-duplicated-guids-ifc2x3.ifc | 2 +- .../pass-not-duplicated-guids-ifc4.ifc | 2 +- .../pass-not-duplicated-guids-ifc4x3.ifc | 2 +- .../pass-valid-selected-enumeration.ifc | 2 +- 27 files changed, 124 insertions(+), 24 deletions(-) create mode 100644 src/ifcopenshell-python/test/fixtures/validate/fail-header-wrong-type-instead-of-list-str.ifc create mode 100644 src/ifcopenshell-python/test/fixtures/validate/fail-header-wrong-type-instead-of-str.ifc create mode 100644 src/ifcopenshell-python/test/fixtures/validate/fail-header-wrong-type-list.ifc create mode 100644 src/ifcopenshell-python/test/fixtures/validate/pass-header-valid.ifc diff --git a/src/ifcopenshell-python/ifcopenshell/validate.py b/src/ifcopenshell-python/ifcopenshell/validate.py index 295a2ba15a..299e475297 100644 --- a/src/ifcopenshell-python/ifcopenshell/validate.py +++ b/src/ifcopenshell-python/ifcopenshell/validate.py @@ -43,6 +43,7 @@ from logging import Logger, Handler import ifcopenshell import ifcopenshell.ifcopenshell_wrapper +import ifcopenshell.ifcopenshell_wrapper as W import ifcopenshell.express.rule_executor named_type = ifcopenshell.ifcopenshell_wrapper.named_type @@ -95,11 +96,13 @@ simple_type_python_mapping = { } -def annotate_inst_attr_pos(inst: ifcopenshell.entity_instance, pos: int) -> str: +def annotate_inst_attr_pos( + inst: Union[ifcopenshell.entity_instance, W.HeaderEntity], pos: int, entity_str: str = "" +) -> str: def get_pos() -> Iterator[int]: depth = 0 idx = -1 - for c in str(inst): + for c in entity_str or str(inst): if c == "(": depth += 1 if depth == 1: @@ -389,6 +392,8 @@ def validate(f: Union[ifcopenshell.file, str], logger: Logger, express_rules=Fal log_internal_cpp_errors(f, filename, logger) + validate_ifc_header(f, logger) + schema = ifcopenshell.ifcopenshell_wrapper.schema_by_name(f.schema_identifier) used_guids: dict[str, ifcopenshell.entity_instance] = dict() @@ -521,6 +526,61 @@ def validate(f: Union[ifcopenshell.file, str], logger: Logger, express_rules=Fal ifcopenshell.express.rule_executor.run(f, logger) +def validate_ifc_header(f: ifcopenshell.file, logger: Logger) -> None: + header: W.IfcSpfHeader = f.wrapped_data.header + AGGREGATE_TYPE = "LIST [ 1 : ? ] OF STRING (256)" + STRING_TYPE = "STRING (256)" + + def log_error(header_entity: W.HeaderEntity, name: str, index: int, expected_type: str, provided_type: str) -> None: + logger.error( + ( + "For instance:\n %s\n %s\n" + "Attribute '%s' has invalid type:\n" + " Expected: %s\n Current value type: %s\n" + ), + (s := header_entity.toString()), + annotate_inst_attr_pos(header_entity, index, s), + name, + expected_type, + provided_type, + ) + + def validate_attribute(header_entity: W.HeaderEntity, name: str, index: int, *, aggregate: bool = False) -> None: + value = getattr(header_entity, name) + if aggregate: + if not isinstance(value, tuple): + log_error(header_entity, name, index, AGGREGATE_TYPE, type(value).__name__) + return + if not value: + log_error(header_entity, name, index, AGGREGATE_TYPE, "EMPTY LIST") + return + if not all(isinstance(last_value := v, str) for v in value): + log_error( + header_entity, + name, + index, + AGGREGATE_TYPE, + f"LIST with {type(last_value).__name__} (value: {last_value})", + ) + return + + if not isinstance(value, str): + log_error(header_entity, name, index, STRING_TYPE, type(value).__name__) + + # Ignore header.file_schema as file won't load to IfcOpenShell with invalid file_schema. + file_description: W.FileDescription = header.file_description + validate_attribute(file_description, "description", 0, aggregate=True) + validate_attribute(file_description, "implementation_level", 1) + file_name: W.FileName = header.file_name + validate_attribute(file_name, "name", 0) + validate_attribute(file_name, "time_stamp", 1) + validate_attribute(file_name, "author", 2, aggregate=True) + validate_attribute(file_name, "organization", 3, aggregate=True) + validate_attribute(file_name, "preprocessor_version", 4) + validate_attribute(file_name, "originating_system", 5) + validate_attribute(file_name, "authorization", 6) + + class LogDetectionHandler(Handler): message_logged = False 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 index b39bc0dee1..1af110a368 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/fail-attr-too-few.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-attr-too-few.ifc @@ -1,7 +1,7 @@ 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_NAME('','2022-10-02T14:16:07',(''),(''),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; 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 index f39c0cf0d3..8afbf3fa79 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/fail-attr-too-many.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-attr-too-many.ifc @@ -1,7 +1,7 @@ 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_NAME('','2022-10-02T14:16:07',(''),(''),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-derived-as-nil.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-derived-as-nil.ifc index 5638fb5b4c..52335e3e4a 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/fail-derived-as-nil.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-derived-as-nil.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2022-11-23T13:41:45',(),(),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0',''); +FILE_NAME('','2022-11-23T13:41:45',(''),(''),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-duplicated-guids-ifc2x3.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-duplicated-guids-ifc2x3.ifc index 9a6eb58e05..5ec7f482e6 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/fail-duplicated-guids-ifc2x3.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-duplicated-guids-ifc2x3.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2024-04-02T17:16:50',(),(),'IfcOpenShell v0.7.0-e38eafd03','IfcOpenShell v0.7.0-e38eafd03',''); +FILE_NAME('','2024-04-02T17:16:50',(''),(''),'IfcOpenShell v0.7.0-e38eafd03','IfcOpenShell v0.7.0-e38eafd03',''); FILE_SCHEMA(('IFC2X3')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-duplicated-guids-ifc4.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-duplicated-guids-ifc4.ifc index eeca2cf84f..3db2b7f0a6 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/fail-duplicated-guids-ifc4.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-duplicated-guids-ifc4.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2024-04-02T17:16:50',(),(),'IfcOpenShell v0.7.0-e38eafd03','IfcOpenShell v0.7.0-e38eafd03',''); +FILE_NAME('','2024-04-02T17:16:50',(''),(''),'IfcOpenShell v0.7.0-e38eafd03','IfcOpenShell v0.7.0-e38eafd03',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-duplicated-guids-ifc4x3.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-duplicated-guids-ifc4x3.ifc index 9a648490ef..8c9e3e2f61 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/fail-duplicated-guids-ifc4x3.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-duplicated-guids-ifc4x3.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2024-04-02T17:16:50',(),(),'IfcOpenShell v0.7.0-e38eafd03','IfcOpenShell v0.7.0-e38eafd03',''); +FILE_NAME('','2024-04-02T17:16:50',(''),(''),'IfcOpenShell v0.7.0-e38eafd03','IfcOpenShell v0.7.0-e38eafd03',''); FILE_SCHEMA(('IFC4X3_ADD2')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-group-0-rels-IFC2X3.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-group-0-rels-IFC2X3.ifc index a86dbd1c0a..2b002bdf1f 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/fail-group-0-rels-IFC2X3.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-group-0-rels-IFC2X3.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2023-02-12T15:07:11',(),(),'IfcOpenShell v0.7.0-07ee62eb9','IfcOpenShell v0.7.0-07ee62eb9',''); +FILE_NAME('','2023-02-12T15:07:11',(''),(''),'IfcOpenShell v0.7.0-07ee62eb9','IfcOpenShell v0.7.0-07ee62eb9',''); FILE_SCHEMA(('IFC2X3')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-group-2-rels-IFC2X3.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-group-2-rels-IFC2X3.ifc index 30fa487f2d..752b975030 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/fail-group-2-rels-IFC2X3.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-group-2-rels-IFC2X3.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2023-02-12T15:07:11',(),(),'IfcOpenShell v0.7.0-07ee62eb9','IfcOpenShell v0.7.0-07ee62eb9',''); +FILE_NAME('','2023-02-12T15:07:11',(''),(''),'IfcOpenShell v0.7.0-07ee62eb9','IfcOpenShell v0.7.0-07ee62eb9',''); FILE_SCHEMA(('IFC2X3')); ENDSEC; DATA; 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 index e1954b0d33..9ee33c82dc 100644 --- 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 @@ -1,7 +1,7 @@ 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_NAME('','2022-10-02T14:16:07',(''),(''),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0'); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; 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 index 216fc1b1bc..6afe9d0f0d 100644 --- 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 @@ -1,7 +1,7 @@ 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_NAME('','2022-10-02T14:16:07',(''),(''),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0','',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-header-wrong-type-instead-of-list-str.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-header-wrong-type-instead-of-list-str.ifc new file mode 100644 index 0000000000..e2a245cb53 --- /dev/null +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-header-wrong-type-instead-of-list-str.ifc @@ -0,0 +1,10 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition[DesignTransferView]'),'2;1'); +FILE_NAME('test.ifc','2024-08-30T12:34:53+05:00',$,('organization','organization email'),'IfcOpenShell','Bonsai','Nobody'); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPROJECT('1iBd2lkrX61vZxF9AnXLa0',$,'My Project',$,$,$,$,$,$); +ENDSEC; +END-ISO-10303-21; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-header-wrong-type-instead-of-str.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-header-wrong-type-instead-of-str.ifc new file mode 100644 index 0000000000..8041ce1068 --- /dev/null +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-header-wrong-type-instead-of-str.ifc @@ -0,0 +1,10 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition[DesignTransferView]'),'2;1'); +FILE_NAME('test.ifc',$,('author','author email'),('organization','organization email'),'IfcOpenShell','Bonsai','Nobody'); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPROJECT('1iBd2lkrX61vZxF9AnXLa0',$,'My Project',$,$,$,$,$,$); +ENDSEC; +END-ISO-10303-21; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-header-wrong-type-list.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-header-wrong-type-list.ifc new file mode 100644 index 0000000000..aaff65f140 --- /dev/null +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-header-wrong-type-list.ifc @@ -0,0 +1,10 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition[DesignTransferView]'),'2;1'); +FILE_NAME('test.ifc','2024-08-30T12:34:53+05:00',(4, 5),('organization','organization email'),'IfcOpenShell','Bonsai','Nobody'); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPROJECT('1iBd2lkrX61vZxF9AnXLa0',$,'My Project',$,$,$,$,$,$); +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 index 3788c16cd5..b6367d784d 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/fail-invalid-entity.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-invalid-entity.ifc @@ -1,7 +1,7 @@ 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_NAME('','2022-10-01T16:31:47',(''),(''),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-invalid-selected-enumeration.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-invalid-selected-enumeration.ifc index 7709215248..c674ba65be 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/fail-invalid-selected-enumeration.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-invalid-selected-enumeration.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2023-04-13T10:27:43',(),(),'IfcOpenShell v0.7.0-198fa67cc','IfcOpenShell v0.7.0-198fa67cc',''); +FILE_NAME('','2023-04-13T10:27:43',(''),(''),'IfcOpenShell v0.7.0-198fa67cc','IfcOpenShell v0.7.0-198fa67cc',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-invalid-selected-simple-type.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-invalid-selected-simple-type.ifc index 0dba7e4479..024776c312 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/fail-invalid-selected-simple-type.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-invalid-selected-simple-type.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2023-04-13T10:24:46',(),(),'IfcOpenShell v0.7.0-198fa67cc','IfcOpenShell v0.7.0-198fa67cc',''); +FILE_NAME('','2023-04-13T10:24:46',(''),(''),'IfcOpenShell v0.7.0-198fa67cc','IfcOpenShell v0.7.0-198fa67cc',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/fail-nil-as-derived.ifc b/src/ifcopenshell-python/test/fixtures/validate/fail-nil-as-derived.ifc index 5638fb5b4c..52335e3e4a 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/fail-nil-as-derived.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/fail-nil-as-derived.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2022-11-23T13:41:45',(),(),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0',''); +FILE_NAME('','2022-11-23T13:41:45',(''),(''),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; 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 index ec52fc3d70..c8ee3e8be0 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/pass-attr-count-ok.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/pass-attr-count-ok.ifc @@ -1,7 +1,7 @@ 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_NAME('','2022-10-02T14:16:07',(''),(''),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/pass-complex-number-ifc4.ifc b/src/ifcopenshell-python/test/fixtures/validate/pass-complex-number-ifc4.ifc index a6cf5660d0..beece3f8e0 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/pass-complex-number-ifc4.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/pass-complex-number-ifc4.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2023-04-13T10:27:43',(),(),'IfcOpenShell v0.7.0-198fa67cc','IfcOpenShell v0.7.0-198fa67cc',''); +FILE_NAME('','2023-04-13T10:27:43',(''),(''),'IfcOpenShell v0.7.0-198fa67cc','IfcOpenShell v0.7.0-198fa67cc',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/pass-derived-ok.ifc b/src/ifcopenshell-python/test/fixtures/validate/pass-derived-ok.ifc index a8372bab1e..3e5a95ca49 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/pass-derived-ok.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/pass-derived-ok.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2022-11-23T13:41:45',(),(),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0',''); +FILE_NAME('','2022-11-23T13:41:45',(''),(''),'IfcOpenShell 0.7.0','IfcOpenShell 0.7.0',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/pass-group-1-rels-IFC2X3.ifc b/src/ifcopenshell-python/test/fixtures/validate/pass-group-1-rels-IFC2X3.ifc index 91ade03f52..851ba9cf91 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/pass-group-1-rels-IFC2X3.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/pass-group-1-rels-IFC2X3.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2023-02-12T15:07:11',(),(),'IfcOpenShell v0.7.0-07ee62eb9','IfcOpenShell v0.7.0-07ee62eb9',''); +FILE_NAME('','2023-02-12T15:07:11',(''),(''),'IfcOpenShell v0.7.0-07ee62eb9','IfcOpenShell v0.7.0-07ee62eb9',''); FILE_SCHEMA(('IFC2X3')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/pass-header-valid.ifc b/src/ifcopenshell-python/test/fixtures/validate/pass-header-valid.ifc new file mode 100644 index 0000000000..681746bad6 --- /dev/null +++ b/src/ifcopenshell-python/test/fixtures/validate/pass-header-valid.ifc @@ -0,0 +1,10 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition[DesignTransferView]'),'2;1'); +FILE_NAME('test.ifc','2024-08-30T12:34:53+05:00',('author','author email'),('organization','organization email'),'IfcOpenShell','Bonsai','Nobody'); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPROJECT('1iBd2lkrX61vZxF9AnXLa0',$,'My Project',$,$,$,$,$,$); +ENDSEC; +END-ISO-10303-21; diff --git a/src/ifcopenshell-python/test/fixtures/validate/pass-not-duplicated-guids-ifc2x3.ifc b/src/ifcopenshell-python/test/fixtures/validate/pass-not-duplicated-guids-ifc2x3.ifc index 37d71d03e4..e23f8b68bc 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/pass-not-duplicated-guids-ifc2x3.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/pass-not-duplicated-guids-ifc2x3.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2024-04-02T17:16:50',(),(),'IfcOpenShell v0.7.0-e38eafd03','IfcOpenShell v0.7.0-e38eafd03',''); +FILE_NAME('','2024-04-02T17:16:50',(''),(''),'IfcOpenShell v0.7.0-e38eafd03','IfcOpenShell v0.7.0-e38eafd03',''); FILE_SCHEMA(('IFC2X3')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/pass-not-duplicated-guids-ifc4.ifc b/src/ifcopenshell-python/test/fixtures/validate/pass-not-duplicated-guids-ifc4.ifc index e839daaba6..5d18d57e95 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/pass-not-duplicated-guids-ifc4.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/pass-not-duplicated-guids-ifc4.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2024-04-02T17:16:50',(),(),'IfcOpenShell v0.7.0-e38eafd03','IfcOpenShell v0.7.0-e38eafd03',''); +FILE_NAME('','2024-04-02T17:16:50',(''),(''),'IfcOpenShell v0.7.0-e38eafd03','IfcOpenShell v0.7.0-e38eafd03',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/pass-not-duplicated-guids-ifc4x3.ifc b/src/ifcopenshell-python/test/fixtures/validate/pass-not-duplicated-guids-ifc4x3.ifc index 7d7fac5b4f..fa950af3f8 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/pass-not-duplicated-guids-ifc4x3.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/pass-not-duplicated-guids-ifc4x3.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2024-04-02T17:16:50',(),(),'IfcOpenShell v0.7.0-e38eafd03','IfcOpenShell v0.7.0-e38eafd03',''); +FILE_NAME('','2024-04-02T17:16:50',(''),(''),'IfcOpenShell v0.7.0-e38eafd03','IfcOpenShell v0.7.0-e38eafd03',''); FILE_SCHEMA(('IFC4X3_ADD2')); ENDSEC; DATA; diff --git a/src/ifcopenshell-python/test/fixtures/validate/pass-valid-selected-enumeration.ifc b/src/ifcopenshell-python/test/fixtures/validate/pass-valid-selected-enumeration.ifc index fa6e897d36..d62aec0fad 100644 --- a/src/ifcopenshell-python/test/fixtures/validate/pass-valid-selected-enumeration.ifc +++ b/src/ifcopenshell-python/test/fixtures/validate/pass-valid-selected-enumeration.ifc @@ -1,7 +1,7 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); -FILE_NAME('','2023-04-13T10:27:43',(),(),'IfcOpenShell v0.7.0-198fa67cc','IfcOpenShell v0.7.0-198fa67cc',''); +FILE_NAME('','2023-04-13T10:27:43',(''),(''),'IfcOpenShell v0.7.0-198fa67cc','IfcOpenShell v0.7.0-198fa67cc',''); FILE_SCHEMA(('IFC4')); ENDSEC; DATA;