98 lines
3.3 KiB
Python
98 lines
3.3 KiB
Python
import json
|
|
|
|
import FreeCAD as App
|
|
import Part
|
|
import Sketcher
|
|
|
|
|
|
FREECAD_COMMIT = "0108fd4b4850cc46e625b60e53cea7a7bbe69f8d"
|
|
TYPE_IDS = [
|
|
"PartDesign::Pad",
|
|
"PartDesign::Pocket",
|
|
"PartDesign::Revolution",
|
|
"PartDesign::Groove",
|
|
"PartDesign::AdditiveLoft",
|
|
"PartDesign::SubtractiveLoft",
|
|
"PartDesign::AdditivePipe",
|
|
"PartDesign::SubtractivePipe",
|
|
"PartDesign::Fillet",
|
|
"PartDesign::Chamfer",
|
|
"PartDesign::Draft",
|
|
"PartDesign::Thickness",
|
|
"PartDesign::Mirrored",
|
|
"PartDesign::MultiTransform",
|
|
"PartDesign::LinearPattern",
|
|
"PartDesign::PolarPattern",
|
|
"PartDesign::Hole",
|
|
]
|
|
ACCEPTED_EMPTY_TYPE_IDS = {
|
|
"PartDesign::Mirrored",
|
|
"PartDesign::MultiTransform",
|
|
"PartDesign::LinearPattern",
|
|
"PartDesign::PolarPattern",
|
|
}
|
|
|
|
|
|
def run_case(type_id):
|
|
case_id = "missing-input-" + type_id.split("::", 1)[1].lower()
|
|
document = App.newDocument("FailureOracle_" + case_id.replace("-", "_"))
|
|
try:
|
|
body = document.addObject("PartDesign::Body", "Body")
|
|
feature = document.addObject(type_id, "Feature")
|
|
body.addObject(feature)
|
|
recompute_result = document.recompute()
|
|
shape_null = bool(feature.Shape.isNull())
|
|
state = [str(value) for value in feature.State]
|
|
try:
|
|
status_string = str(feature.getStatusString())
|
|
except Exception:
|
|
status_string = ""
|
|
invalid = shape_null and ("Invalid" in state or status_string != "Valid")
|
|
observed = "rejected" if invalid else "accepted-empty" if shape_null else "accepted"
|
|
expected = "accepted-empty" if type_id in ACCEPTED_EMPTY_TYPE_IDS else "rejected"
|
|
return {
|
|
"id": case_id,
|
|
"typeId": type_id,
|
|
"inputClass": "missing-required-input",
|
|
"expected": expected,
|
|
"observed": observed,
|
|
"passed": observed == expected,
|
|
"recomputeResult": bool(recompute_result),
|
|
"shapeNull": shape_null,
|
|
"state": state,
|
|
"statusString": status_string,
|
|
}
|
|
except Exception as error:
|
|
expected = "accepted-empty" if type_id in ACCEPTED_EMPTY_TYPE_IDS else "rejected"
|
|
return {
|
|
"id": case_id,
|
|
"typeId": type_id,
|
|
"inputClass": "missing-required-input",
|
|
"expected": expected,
|
|
"observed": "rejected",
|
|
"passed": expected == "rejected",
|
|
"errorType": type(error).__name__,
|
|
"error": str(error),
|
|
}
|
|
finally:
|
|
App.closeDocument(document.Name)
|
|
|
|
|
|
cases = [run_case(type_id) for type_id in TYPE_IDS]
|
|
report = {
|
|
"schemaVersion": 1,
|
|
"baselineId": "freecad-1.1.1-partdesign-failure-oracle",
|
|
"freecadVersion": ".".join(App.Version()[0:3]),
|
|
"gitCommit": FREECAD_COMMIT,
|
|
"status": "pass" if all(case["passed"] for case in cases) else "failed",
|
|
"summary": {
|
|
"cases": len(cases),
|
|
"passed": sum(1 for case in cases if case["passed"]),
|
|
"rejected": sum(1 for case in cases if case["observed"] == "rejected"),
|
|
"acceptedEmpty": sum(1 for case in cases if case["observed"] == "accepted-empty"),
|
|
"accepted": sum(1 for case in cases if case["observed"] == "accepted"),
|
|
},
|
|
"cases": cases,
|
|
}
|
|
print("FREECAD_PARTDESIGN_FAILURE_ORACLE_RESULT=" + json.dumps(report, sort_keys=True))
|