| 137 | |
| 138 | |
| 139 | class 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: |