diff --git a/Documentation/testcases/classification/fail-a_prohibited_classification_reference_returns_the_opposite_of_a_required_facet.ids b/Documentation/testcases/classification/fail-a_prohibited_classification_reference_returns_the_opposite_of_a_required_facet.ids
new file mode 100644
index 0000000..19f277d
--- /dev/null
+++ b/Documentation/testcases/classification/fail-a_prohibited_classification_reference_returns_the_opposite_of_a_required_facet.ids
@@ -0,0 +1,28 @@
+
+
+
+ A prohibited classification reference returns the opposite of a required facet
+ Generated via code automation in the Ids Repository on github.
+
+
+
+
+
+
+ IFCSLAB
+
+
+
+
+
+
+ 1
+
+
+ Foobar
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Documentation/testcases/classification/fail-a_prohibited_classification_reference_returns_the_opposite_of_a_required_facet.ifc b/Documentation/testcases/classification/fail-a_prohibited_classification_reference_returns_the_opposite_of_a_required_facet.ifc
new file mode 100644
index 0000000..d48d7fc
--- /dev/null
+++ b/Documentation/testcases/classification/fail-a_prohibited_classification_reference_returns_the_opposite_of_a_required_facet.ifc
@@ -0,0 +1,25 @@
+ISO-10303-21;
+HEADER;
+FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
+FILE_NAME('','2022-10-07T13:48:42',(),(),'IfcOpenShell v0.7.0-dc67287d','IfcOpenShell v0.7.0-dc67287d','');
+FILE_SCHEMA(('IFC4'));
+ENDSEC;
+DATA;
+#1=IFCPROJECT('1hqIFTRjfV6AWq_bMtnZwI',$,$,$,$,$,$,$,$);
+#2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$);
+#3=IFCRELASSOCIATESCLASSIFICATION('05rScmOVzMoQXOfbYdtLYj',$,$,$,(#1),#2);
+#4=IFCWALL('3Agm079vPIYBL4JExVrhD5',$,$,$,$,$,$,$,$);
+#5=IFCSLAB('0BbkGoC6vPvRW13UT7D8zH',$,$,$,$,$,$,$,$);
+#6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$);
+#7=IFCRELASSOCIATESCLASSIFICATION('2nJrDaLQfJ1QPhdJR0o97J',$,$,$,(#5),#6);
+#8=IFCCOLUMN('16MocU_IDOF8_x3Iqllz0d',$,$,$,$,$,$,$,$);
+#9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$);
+#10=IFCRELASSOCIATESCLASSIFICATION('0WTUhjMwvT39YBFH2pryoM',$,$,$,(#8),#9);
+#11=IFCBEAM('1n81bO_6nGjgypJwWUVavJ',$,$,$,$,$,$,$,$);
+#12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$);
+#13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$);
+#15=IFCRELASSOCIATESCLASSIFICATION('2jG7cjHsrIUfgKVktNgbzi',$,$,$,(#11),#12);
+#16=IFCMATERIAL('Material',$,$);
+#17=IFCEXTERNALREFERENCERELATIONSHIP($,$,#6,(#16));
+ENDSEC;
+END-ISO-10303-21;
diff --git a/Documentation/testcases/classification/fail-a_required_classification_system_fails_if_no_match.ids b/Documentation/testcases/classification/fail-a_required_classification_system_fails_if_no_match.ids
new file mode 100644
index 0000000..54fc6e6
--- /dev/null
+++ b/Documentation/testcases/classification/fail-a_required_classification_system_fails_if_no_match.ids
@@ -0,0 +1,25 @@
+
+
+
+ A required classification system fails if no match
+ Generated via code automation in the Ids Repository on github.
+
+
+
+
+
+
+ IFCSLAB
+
+
+
+
+
+
+ Foobar1
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Documentation/testcases/classification/fail-a_required_classification_system_fails_if_no_match.ifc b/Documentation/testcases/classification/fail-a_required_classification_system_fails_if_no_match.ifc
new file mode 100644
index 0000000..d48d7fc
--- /dev/null
+++ b/Documentation/testcases/classification/fail-a_required_classification_system_fails_if_no_match.ifc
@@ -0,0 +1,25 @@
+ISO-10303-21;
+HEADER;
+FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
+FILE_NAME('','2022-10-07T13:48:42',(),(),'IfcOpenShell v0.7.0-dc67287d','IfcOpenShell v0.7.0-dc67287d','');
+FILE_SCHEMA(('IFC4'));
+ENDSEC;
+DATA;
+#1=IFCPROJECT('1hqIFTRjfV6AWq_bMtnZwI',$,$,$,$,$,$,$,$);
+#2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$);
+#3=IFCRELASSOCIATESCLASSIFICATION('05rScmOVzMoQXOfbYdtLYj',$,$,$,(#1),#2);
+#4=IFCWALL('3Agm079vPIYBL4JExVrhD5',$,$,$,$,$,$,$,$);
+#5=IFCSLAB('0BbkGoC6vPvRW13UT7D8zH',$,$,$,$,$,$,$,$);
+#6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$);
+#7=IFCRELASSOCIATESCLASSIFICATION('2nJrDaLQfJ1QPhdJR0o97J',$,$,$,(#5),#6);
+#8=IFCCOLUMN('16MocU_IDOF8_x3Iqllz0d',$,$,$,$,$,$,$,$);
+#9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$);
+#10=IFCRELASSOCIATESCLASSIFICATION('0WTUhjMwvT39YBFH2pryoM',$,$,$,(#8),#9);
+#11=IFCBEAM('1n81bO_6nGjgypJwWUVavJ',$,$,$,$,$,$,$,$);
+#12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$);
+#13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$);
+#15=IFCRELASSOCIATESCLASSIFICATION('2jG7cjHsrIUfgKVktNgbzi',$,$,$,(#11),#12);
+#16=IFCMATERIAL('Material',$,$);
+#17=IFCEXTERNALREFERENCERELATIONSHIP($,$,#6,(#16));
+ENDSEC;
+END-ISO-10303-21;
diff --git a/Documentation/testcases/ids/fail-prohibited_specifications_fails_if_the_applicability_matches.ids b/Documentation/testcases/ids/fail-prohibited_specifications_fails_if_the_applicability_matches.ids
new file mode 100644
index 0000000..e3cff78
--- /dev/null
+++ b/Documentation/testcases/ids/fail-prohibited_specifications_fails_if_the_applicability_matches.ids
@@ -0,0 +1,18 @@
+
+
+
+ Prohibited specifications fails if the applicability matches
+ Generated via code automation in the Ids Repository on github.
+
+
+
+
+
+
+ IFCWALL
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Documentation/testcases/ids/fail-prohibited_specifications_fails_if_the_applicability_matches.ifc b/Documentation/testcases/ids/fail-prohibited_specifications_fails_if_the_applicability_matches.ifc
new file mode 100644
index 0000000..db0af70
--- /dev/null
+++ b/Documentation/testcases/ids/fail-prohibited_specifications_fails_if_the_applicability_matches.ifc
@@ -0,0 +1,10 @@
+ISO-10303-21;
+HEADER;
+FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
+FILE_NAME('','2022-10-07T13:48:44',(),(),'IfcOpenShell v0.7.0-dc67287d','IfcOpenShell v0.7.0-dc67287d','');
+FILE_SCHEMA(('IFC4'));
+ENDSEC;
+DATA;
+#1=IFCWALL('1hqIFTRjfV6AWq_bMtnZwI',$,'Waldo',$,$,$,$,$,$);
+ENDSEC;
+END-ISO-10303-21;
diff --git a/Documentation/testcases/ids/pass-prohibited_specifications_passes_if_the_applicability_does_not_matches.ids b/Documentation/testcases/ids/pass-prohibited_specifications_passes_if_the_applicability_does_not_matches.ids
new file mode 100644
index 0000000..6865a7a
--- /dev/null
+++ b/Documentation/testcases/ids/pass-prohibited_specifications_passes_if_the_applicability_does_not_matches.ids
@@ -0,0 +1,18 @@
+
+
+
+ Prohibited specifications passes if the applicability does not matches
+ Generated via code automation in the Ids Repository on github.
+
+
+
+
+
+
+ IFCWINDOW
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Documentation/testcases/ids/pass-prohibited_specifications_passes_if_the_applicability_does_not_matches.ifc b/Documentation/testcases/ids/pass-prohibited_specifications_passes_if_the_applicability_does_not_matches.ifc
new file mode 100644
index 0000000..db0af70
--- /dev/null
+++ b/Documentation/testcases/ids/pass-prohibited_specifications_passes_if_the_applicability_does_not_matches.ifc
@@ -0,0 +1,10 @@
+ISO-10303-21;
+HEADER;
+FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
+FILE_NAME('','2022-10-07T13:48:44',(),(),'IfcOpenShell v0.7.0-dc67287d','IfcOpenShell v0.7.0-dc67287d','');
+FILE_SCHEMA(('IFC4'));
+ENDSEC;
+DATA;
+#1=IFCWALL('1hqIFTRjfV6AWq_bMtnZwI',$,'Waldo',$,$,$,$,$,$);
+ENDSEC;
+END-ISO-10303-21;
diff --git a/Documentation/testcases/scripts.md b/Documentation/testcases/scripts.md
index 8384358..db1c744 100644
--- a/Documentation/testcases/scripts.md
+++ b/Documentation/testcases/scripts.md
@@ -612,6 +612,15 @@ Requirements:
Classification: Prohibited,Pattern(''\w+'')
```
+### A prohibited classification reference returns the opposite of a required facet
+
+``` ids classification/fail-a_prohibited_classification_reference_returns_the_opposite_of_a_required_facet.ids
+A prohibited classification reference returns the opposite of a required facet
+Entity: ''IFCSLAB''
+Requirements:
+Classification: Prohibited,''Foobar'',''1''
+```
+
### A required facet checks all parameters as normal
``` ids classification/pass-a_required_facet_checks_all_parameters_as_normal.ids
@@ -621,6 +630,15 @@ Requirements:
Classification: Pattern(''\w+'')
```
+### A required classification system fails if no match
+
+``` ids classification/fail-a_required_classification_system_fails_if_no_match.ids
+A required classification system fails if no match
+Entity: ''IFCSLAB''
+Requirements:
+Classification: ''Foobar1''
+```
+
### An optional classification value passes if specified
``` ids classification/pass-an_optional_classification_value_passes_if_specified.ids
@@ -1127,6 +1145,24 @@ Requirements:
Attribute: ''Name'',''Waldo''
```
+### Prohibited specifications fails if the applicability matches
+
+``` ids ids/fail-prohibited_specifications_fails_if_the_applicability_matches.ids
+Prohibited specifications fails if the applicability matches
+Prohibited
+IFC2X3
+Entity: ''IFCWALL''
+```
+
+### Prohibited specifications passes if the applicability does not matches
+
+``` ids ids/pass-prohibited_specifications_passes_if_the_applicability_does_not_matches.ids
+Prohibited specifications passes if the applicability does not matches
+Prohibited
+IFC2X3
+Entity: ''IFCWINDOW''
+```
+
### Required specifications need at least one applicable entity (1/2)
``` ids ids/pass-required_specifications_need_at_least_one_applicable_entity_1_2.ids
diff --git a/SchemaProject/DocAutomation/IdsScript.cs b/SchemaProject/DocAutomation/IdsScript.cs
index ddbc460..7634728 100644
--- a/SchemaProject/DocAutomation/IdsScript.cs
+++ b/SchemaProject/DocAutomation/IdsScript.cs
@@ -559,7 +559,7 @@ internal void WriteTo(TextWriter writer)
{
writer.WriteLine(item);
}
- if (RequirementFacetStrings != null)
+ if (RequirementFacetStrings != null && RequirementFacetStrings.Any())
{
writer.WriteLine("Requirements:");
foreach (var item in RequirementFacetStrings)
diff --git a/SchemaProject/program.cs b/SchemaProject/program.cs
index 3f9428a..e7f21be 100644
--- a/SchemaProject/program.cs
+++ b/SchemaProject/program.cs
@@ -124,8 +124,8 @@ private static void RegenIDS()
var invalidFileName = item.FullName.Replace("fail-", "invalid-");
if (missingIfcFileNames.Contains(invalidFileName))
{
+ Console.WriteLine("Suitable matching invalid IFC is found, it has been renamed.");
File.Move(item.FullName, invalidFileName);
- // Console.WriteLine("A matching invalid IFC is required, should you rename this?");
}
//else if (allIfcFound)
//{