MCPcopy Create free account
hub / github.com/IfcOpenShell/IfcOpenShell / IdsDocGenerator

Class IdsDocGenerator

src/ifctester/test/ids_doc_generator.py:139–208  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

137
138
139class IdsDocGenerator:
140 def __init__(self):
141 self.testcases = []
142
143 def __call__(self, name, ids, ifc, expected, applicable_entities=None, failed_entities=None):
144 ids.validate(ifc)
145 all_applicable = set()
146 all_failures = set()
147 if not applicable_entities:
148 applicable_entities = []
149 if not failed_entities:
150 failed_entities = []
151 for spec in ids.specifications:
152 assert spec.status is expected
153 all_applicable.update(spec.applicable_entities)
154 for requirement in spec.requirements:
155 if requirement.status is False:
156 all_failures.update(f["element"] for f in requirement.failures)
157 assert set(all_applicable) == set(applicable_entities)
158 assert set(all_failures) == set(failed_entities)
159
160 result = "pass" if expected is True else "fail"
161
162 regenerate_guids(ifc)
163
164 l = validate.json_logger()
165 validate.validate(ifc, l)
166 for issue in l.statements:
167 # test_parsing_entities_with_no_attributes uses nameless IfcMaterial; fix for doc generation.
168 if issue["instance"].is_a("IfcMaterial") and issue.get("attribute") == "IfcMaterial.Name":
169 issue["instance"].Name = "Unnamed"
170 else:
171 raise Exception("About to emit invalid example data:", issue)
172
173 lines = ifc.wrapped_data.to_string().split("\n")[7:-3]
174 ifc_text = ""
175 for i, line in enumerate(lines):
176 step_id = int(line[1 : line.index("=")])
177 element = ifc.by_id(step_id)
178 newline = "" if i == 0 else "\n"
179 if element in applicable_entities:
180 pass_or_fail = "FAIL" if element in failed_entities else "PASS"
181 ifc_text += f"{newline}[{pass_or_fail}] {line}"
182 else:
183 ifc_text += f"{newline} {line}"
184 basename = f"{result}-" + re.sub("[^0-9a-zA-Z]", "_", name.lower())
185
186 # Write IFC to disk
187 ifc.write(os.path.join(outdir, "testcases", "ids", f"{basename}.ifc"))
188
189 # Write IDS to disk
190 with open(os.path.join(outdir, "testcases", "ids", f"{basename}.ids"), "w", encoding="utf-8") as ids_file:
191 ids_file.write(ids.to_string())
192
193 reports = []
194 for spec in ids.specifications:
195 report = {"applicability": [], "requirements": [], "usage": spec.get_usage(), "status": spec.status}
196 for facet in spec.applicability:

Callers 1

Calls

no outgoing calls

Tested by

no test coverage detected