diff --git a/src/ifctester/ifctester/facet.py b/src/ifctester/ifctester/facet.py index a9498d5eb7..e2639b556c 100644 --- a/src/ifctester/ifctester/facet.py +++ b/src/ifctester/ifctester/facet.py @@ -688,7 +688,9 @@ class Property(Facet): elif prop is not None and prop != "": props[pset_name][self.baseName] = prop else: - props[pset_name] = {k: v for k, v in pset_props.items() if k == self.baseName} + props[pset_name] = { + k: v for k, v in pset_props.items() if k == self.baseName and v is not None and v != "" + } if not bool(props[pset_name]): if self.cardinality == "optional": diff --git a/src/ifctester/test/test_facet.py b/src/ifctester/test/test_facet.py index 3daa2d213f..7bdb85bc01 100644 --- a/src/ifctester/test/test_facet.py +++ b/src/ifctester/test/test_facet.py @@ -921,8 +921,11 @@ class TestProperty: pset = ifcopenshell.api.pset.add_pset(ifc, product=element, name="Foo_Bar") ifcopenshell.api.pset.edit_pset(ifc, pset=pset, properties={"AnotherProperty": "AnotherValue"}) run("Elements with a matching pset but no property also fail", facet=facet, inst=element, expected=False) - ifcopenshell.api.pset.edit_pset(ifc, pset=pset, properties={"AnotherProperty": None}) + ifcopenshell.api.pset.edit_pset(ifc, pset=pset, properties={"Foo": None}, should_purge=False) run("Properties with a null value fail", facet=facet, inst=element, expected=False) + restriction = Restriction(options={"pattern": "Fo.*"}) + facet = Property(propertySet="Foo_Bar", baseName=restriction, dataType="IFCLABEL") + run("Pattern matched properties with a null value fail", facet=facet, inst=element, expected=False) ifcopenshell.api.pset.edit_pset(ifc, pset=pset, properties={"Foo": "Bar"}) run("A name check will match any property with any string value", facet=facet, inst=element, expected=True)