28 lines
4.5 KiB
JavaScript
28 lines
4.5 KiB
JavaScript
import { isDeepStrictEqual } from 'node:util'
|
|
import { readFile } from 'node:fs/promises'
|
|
import { resolve } from 'node:path'
|
|
|
|
const root = resolve(new URL('..', import.meta.url).pathname)
|
|
const load = (path) => readFile(resolve(root, path), 'utf8').then(JSON.parse)
|
|
const [report, semantics, progress, roundTrip, chrome] = await Promise.all([
|
|
load('config/freecad-property-linksubhidden-promotion.json'),
|
|
load('config/freecad-native-property-semantics.json'),
|
|
load('config/freecad-follow-up-task-progress.json'),
|
|
load('config/freecad-property-linksubhidden-roundtrip.json'),
|
|
load('config/chrome-property-linksubhidden-verification.json'),
|
|
])
|
|
const fail = (message) => { throw new Error(`FreeCAD PropertyLinkSubHidden promotion check failed: ${message}`) }
|
|
if (report.schemaVersion !== 1 || report.status !== 'pass' || report.taskId !== 'PROP-app-propertylinksubhidden-I' || report.propertyType !== 'App::PropertyLinkSubHidden' || report.recordCount !== 4 || report.baseline?.freecadVersion !== '1.1.1' || report.baseline?.commit !== '0108fd4b4850cc46e625b60e53cea7a7bbe69f8d' || report.systemExact !== false) fail('promotion report boundary is invalid')
|
|
const requiredPhases = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
|
|
const completed = new Map(progress.completedTasks?.map((entry) => [entry.id, entry]) ?? [])
|
|
for (const phase of requiredPhases) { const taskId = `PROP-app-propertylinksubhidden-${phase}`; if (!completed.has(taskId) || !Array.isArray(report.phaseEvidence?.[phase]) || report.phaseEvidence[phase].length === 0 || !isDeepStrictEqual(report.phaseEvidence[phase], completed.get(taskId).evidence)) fail(`phase ${phase} evidence is incomplete`) }
|
|
const target = { schemaVersion: 1, objectId: 'ColorSourceB', subElements: ['Face5'] }
|
|
const propertyType = semantics.types?.find(({ typeId }) => typeId === report.propertyType)
|
|
const promotion = report.promotion
|
|
if (promotion?.from !== 'opaque-fcstd-proxy' || promotion.to !== 'native-editable-codec' || propertyType?.support !== promotion.to || propertyType.recordCount !== 4 || propertyType.objectTypeCount !== 4 || propertyType.statusNames?.join(',') !== 'LockDynamic,PropHidden' || promotion.facadeValueModel !== 'same-document-object-and-ordered-sub-element-name-array-or-null' || promotion.writableRecords !== 4 || promotion.objectTypeCount !== 4 || promotion.propertyStatus !== 'LockDynamic,PropHidden' || promotion.linkScope !== 'Hidden' || promotion.runtimeDependencyEdges !== 0 || promotion.fcstdElement !== 'LinkSub' || !isDeepStrictEqual(promotion.nativeRoundTripValue, target) || !isDeepStrictEqual(promotion.browserRoundTripValue, target) || promotion.hiddenUiFiltered !== true || promotion.hiddenLinksPreserved !== true || promotion.nativeDependencyMetadataNormalized !== true || promotion.zeroUnknownDrift !== true) fail('capability promotion is incomplete')
|
|
const sync = report.exactBlockerSync
|
|
if (sync?.nativeEditableTypes !== 37 || sync.nativeEditableRecords !== 4377 || sync.opaqueTypes !== 43 || sync.opaqueRecords !== 450 || sync.exactPromotionReady !== false || sync.exactBlocker !== '43 runtime property types and 450 records remain opaque-only; complete native document and property semantics') fail('exact blocker synchronization is stale')
|
|
if (!isDeepStrictEqual(sync, { nativeEditableTypes: semantics.supportSummary['native-editable-codec'].typeCount, nativeEditableRecords: semantics.supportSummary['native-editable-codec'].recordCount, opaqueTypes: semantics.supportSummary['opaque-fcstd-proxy'].typeCount, opaqueRecords: semantics.supportSummary['opaque-fcstd-proxy'].recordCount, exactPromotionReady: semantics.exactPromotionReady, exactBlocker: semantics.exactBlocker })) fail('promotion report diverges from global property semantics')
|
|
if (roundTrip.classification?.zeroUnknownDrift !== true || !isDeepStrictEqual(roundTrip.classification.resavedValue, target) || roundTrip.classification.hiddenLinksPreserved !== true || roundTrip.classification.nativeDependencyMetadataNormalized !== true || chrome.status !== 'pass' || !isDeepStrictEqual(chrome.persistence?.loadedValue, target) || chrome.persistence?.fcstdElement !== 'LinkSub' || chrome.ui?.hiddenControlCountBefore !== 0 || chrome.ui?.hiddenControlCountAfter !== 0 || chrome.resource?.released !== true || chrome.release?.workerTerminated !== true) fail('G/H closure evidence regressed')
|
|
console.log(JSON.stringify({ status: 'freecad-property-linksubhidden-promotion-pass', propertyType: report.propertyType, promotion, completedPhases: requiredPhases, exactBlockerSync: sync, systemExact: report.systemExact }, null, 2))
|