feat: establish reproducible FreeCAD web compatibility baseline
This commit is contained in:
24
scripts/check-freecad-partdesign-failure-oracle.mjs
Normal file
24
scripts/check-freecad-partdesign-failure-oracle.mjs
Normal file
@@ -0,0 +1,24 @@
|
||||
import { readFile } from 'node:fs/promises'
|
||||
import { resolve } from 'node:path'
|
||||
|
||||
const root = resolve(new URL('..', import.meta.url).pathname)
|
||||
const report = JSON.parse(await readFile(resolve(root, 'config/freecad-partdesign-failure-oracle.json'), 'utf8'))
|
||||
const expected = [
|
||||
'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',
|
||||
]
|
||||
const acceptedEmpty = new Set(['PartDesign::Mirrored', 'PartDesign::MultiTransform', 'PartDesign::LinearPattern', 'PartDesign::PolarPattern'])
|
||||
const fail = (message) => { throw new Error(`FreeCAD PartDesign failure oracle: ${message}`) }
|
||||
if (report.schemaVersion !== 1 || report.baselineId !== 'freecad-1.1.1-partdesign-failure-oracle' || report.freecadVersion !== '1.1.1' || report.gitCommit !== '0108fd4b4850cc46e625b60e53cea7a7bbe69f8d' || report.status !== 'pass') fail('baseline or status is invalid.')
|
||||
if (report.summary?.cases !== expected.length || report.summary.passed !== expected.length || report.summary.rejected !== expected.length - acceptedEmpty.size || report.summary.acceptedEmpty !== acceptedEmpty.size || report.summary.accepted !== 0 || !Array.isArray(report.cases) || report.cases.length !== expected.length) fail('summary is incomplete.')
|
||||
const actual = report.cases.map((fixture) => fixture.typeId)
|
||||
if (JSON.stringify(actual) !== JSON.stringify(expected) || new Set(actual).size !== expected.length) fail('TypeId coverage is incomplete or reordered.')
|
||||
for (const fixture of report.cases) {
|
||||
const expectedOutcome = acceptedEmpty.has(fixture.typeId) ? 'accepted-empty' : 'rejected'
|
||||
if (fixture.expected !== expectedOutcome || fixture.observed !== expectedOutcome || fixture.passed !== true || fixture.inputClass !== 'missing-required-input') fail(`${fixture.typeId} does not match its native missing-input outcome.`)
|
||||
if (fixture.shapeNull !== true && typeof fixture.error !== 'string') fail(`${fixture.typeId} has neither a null Shape nor a native exception.`)
|
||||
if (typeof fixture.error === 'string' && /No module named|Unknown document object type/i.test(fixture.error)) fail(`${fixture.typeId} records an unavailable module instead of feature semantics.`)
|
||||
}
|
||||
console.log(JSON.stringify({ status: 'freecad-partdesign-failure-oracle-pass', cases: report.summary.cases, rejected: report.summary.rejected, acceptedEmpty: report.summary.acceptedEmpty, typeIds: actual }, null, 2))
|
||||
Reference in New Issue
Block a user