mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-22 00:41:00 +00:00
1fa5eebf0c
Raising `AttributeError` is definitely wasn't correct here, since it might push the code to assume it's a wrong entity type. Returning some stub value like `None` also could suggest incorrect derived attribute value, leading to unexpected behaviour. So adding an error, so it would propagate and code would need to be adjusted not to rely on derived attributes, if it actually interacts with sql/stream. `test_unit` was asserting that derived attr will return `None`, though it was actually raising `AttributeError`.
81 lines
2.7 KiB
Python
81 lines
2.7 KiB
Python
# IfcOpenShell - IFC toolkit and geometry engine
|
|
# Copyright (C) 2021 Thomas Krijnen <thomas@aecgeeks.com>
|
|
#
|
|
# 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 <http://www.gnu.org/licenses/>.
|
|
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
from ifcpatch.recipes import Ifc2Sql
|
|
|
|
import ifcopenshell
|
|
|
|
TEST_FILE = Path(__file__).parent / "files" / "basic.ifc"
|
|
SQLITE_PATH = None
|
|
|
|
|
|
def get_ifc_sqlite() -> ifcopenshell.sqlite:
|
|
global SQLITE_PATH
|
|
if SQLITE_PATH is None:
|
|
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".ifcsqlite")
|
|
ifc_file = ifcopenshell.open(TEST_FILE)
|
|
assert isinstance(ifc_file, ifcopenshell.file)
|
|
patcher = Ifc2Sql.Patcher(ifc_file, database=tmp.name)
|
|
patcher.patch()
|
|
SQLITE_PATH = tmp.name
|
|
ifc_sqlite = ifcopenshell.open(SQLITE_PATH)
|
|
assert isinstance(ifc_sqlite, ifcopenshell.sqlite)
|
|
return ifc_sqlite
|
|
|
|
|
|
class TestFile:
|
|
def test_run(self):
|
|
ifc_sqlite = get_ifc_sqlite()
|
|
assert ifc_sqlite.schema == "IFC4"
|
|
|
|
def test_by_id(self):
|
|
ifc_sqlite = get_ifc_sqlite()
|
|
assert (element := ifc_sqlite.by_id(1))
|
|
assert str(element) == "#1=IFCPROJECT('3kv235yMjDO9tHiTzD8QuS',$,'My Project',$,$,$,$,(#14,#26),#9);"
|
|
|
|
def test_by_type(self):
|
|
ifc_sqlite = get_ifc_sqlite()
|
|
assert (elements := ifc_sqlite.by_type("IfcProject"))
|
|
assert str(elements[0]) == "#1=IFCPROJECT('3kv235yMjDO9tHiTzD8QuS',$,'My Project',$,$,$,$,(#14,#26),#9);"
|
|
|
|
|
|
class TestEntity:
|
|
def test_getattr(self):
|
|
ifc_sqlite = get_ifc_sqlite()
|
|
assert (element := ifc_sqlite.by_id(1))
|
|
assert element.Name == "My Project"
|
|
|
|
def test_getattr_derive(self):
|
|
ifc_sqlite = get_ifc_sqlite()
|
|
assert (units := ifc_sqlite.by_type("IfcSIUnit"))
|
|
with pytest.raises(RuntimeError):
|
|
units[0].Dimensions
|
|
|
|
def test_setattr(self):
|
|
ifc_sqlite = get_ifc_sqlite()
|
|
assert (element := ifc_sqlite.by_id(1))
|
|
assert element.Name == "My Project"
|
|
element.Name = "Foo"
|
|
assert element.Name == "Foo"
|
|
element.Name = "My Project"
|
|
assert element.Name == "My Project"
|