Files
IfcOpenShell/src/ifcopenshell-python/test/test_express_aggregate_bounds.py
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

75 lines
2.3 KiB
Python
Raw Normal View History

import os
import sys
import tempfile
import unittest
import ifcopenshell.express
sys.path.insert(0, os.path.dirname(ifcopenshell.express.__file__))
def _parse(schema_text):
with tempfile.NamedTemporaryFile(mode="w", suffix=".exp", delete=False) as f:
f.write(schema_text)
path = f.name
try:
return ifcopenshell.express.parse(path)
finally:
os.unlink(path)
cache = path + ".cache.dat"
if os.path.exists(cache):
os.unlink(cache)
class TestAggregateBounds(unittest.TestCase):
def test_literal_bounds_preserved(self):
"""After loading [1;3] -> (1, 3)?"""
2026-05-06 11:04:02 +00:00
s = _parse("SCHEMA t; ENTITY E; v : ARRAY [1:3] OF REAL; END_ENTITY; END_SCHEMA;")
agg = (
next(d for d in s.schema.declarations() if d.name() == "E")
.attributes()[0]
.type_of_attribute()
.as_aggregation_type()
)
self.assertEqual((agg.bound1(), agg.bound2()), (1, 3))
s.disown()
def test_unbounded_marker(self):
2026-05-06 11:04:02 +00:00
"""[0:?] -> (0, -1)?"""
s = _parse("SCHEMA t; ENTITY E; v : LIST [0:?] OF REAL; END_ENTITY; END_SCHEMA;")
agg = (
next(d for d in s.schema.declarations() if d.name() == "E")
.attributes()[0]
.type_of_attribute()
.as_aggregation_type()
)
# import pdb; pdb.set_trace()
self.assertEqual((agg.bound1(), agg.bound2()), (0, -1))
s.disown()
def test_voxel_grid_with_dynamic_bound_loads(self):
2026-05-06 11:04:02 +00:00
"""
Array that is an expression : [1:dim_x*dim_y*dim_z]
Parsing must not crash, Bbund must be (1, -1)
"""
2026-05-06 11:04:02 +00:00
s = _parse("""
SCHEMA t;
TYPE IfcBoolean = BOOLEAN; END_TYPE;
ENTITY IfcVoxelHolder;
NumberOfVoxelsX : INTEGER;
NumberOfVoxelsY : INTEGER;
NumberOfVoxelsZ : INTEGER;
Voxels : ARRAY [1:NumberOfVoxelsX*NumberOfVoxelsY*NumberOfVoxelsZ] OF IfcBoolean;
END_ENTITY;
END_SCHEMA;
2026-05-06 11:04:02 +00:00
""")
holder = next(d for d in s.schema.declarations() if d.name() == "IfcVoxelHolder")
voxels = holder.attributes()[-1].type_of_attribute().as_aggregation_type()
self.assertEqual((voxels.bound1(), voxels.bound2()), (1, -1))
s.disown()
if __name__ == "__main__":
unittest.main()