feat: establish reproducible FreeCAD web compatibility baseline
This commit is contained in:
97
scripts/freecad-partdesign-failure-oracle.py
Normal file
97
scripts/freecad-partdesign-failure-oracle.py
Normal file
@@ -0,0 +1,97 @@
|
||||
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))
|
||||
Reference in New Issue
Block a user