接入虚拟HAL仿真配置promotion证据
This commit is contained in:
@@ -37,14 +37,19 @@ assert.equal(jsonWorkflow.report.capabilityMatrix.ready, true);
|
||||
assert.deepEqual(jsonWorkflow.report.capabilityMatrix.capabilityTypes, ["workflow", "api", "gate"]);
|
||||
assert.equal(jsonWorkflow.report.workflow.ready, true);
|
||||
assert.equal(jsonWorkflow.report.workflow.virtualHalSimConfigSourceCoverageReady, true);
|
||||
assert.equal(jsonWorkflow.report.workflow.virtualHalMotionControllerMatrixReady, true);
|
||||
assert.equal(jsonWorkflow.report.virtualHalSimConfigSourceCoverage.apiName, "linuxcnc-wasm-virtual-hal-sim-config-source-coverage-report");
|
||||
assert.equal(jsonWorkflow.report.virtualHalSimConfigSourceCoverage.complete, true);
|
||||
assert.equal(jsonWorkflow.report.virtualHalSimConfigSourceCoverage.webSimulationSatisfied, true);
|
||||
assert.equal(jsonWorkflow.report.virtualHalSimConfigSourceCoverage.sourceFiles.includes("linuxcnc/configs/sim/axis/foam/axis_foam.ini"), true);
|
||||
assert.equal(jsonWorkflow.report.virtualHalMotionControllerMatrix.apiName, "linuxcnc-wasm-virtual-hal-motion-controller-matrix-report");
|
||||
assert.equal(jsonWorkflow.report.virtualHalMotionControllerMatrix.complete, true);
|
||||
assert.equal(jsonWorkflow.report.virtualHalMotionControllerMatrix.manifestChecked, true);
|
||||
assert.equal(jsonWorkflow.report.virtualHalMotionControllerMatrix.simConfigSourceFiles.includes("linuxcnc/configs/sim/axis/external_offsets/dynamic_offsets.ini"), true);
|
||||
assert.equal(jsonWorkflow.report.summaryViewModel.statusLine, "Ready: Batch acceptance evidence complete");
|
||||
assert.equal(jsonWorkflow.report.actionPlan.nextCommand, null);
|
||||
assert.equal(jsonWorkflow.report.checklist.passedCount, 4);
|
||||
assert.equal(jsonWorkflow.report.rows.find(({ id }) => id === "checklist")?.value, "4/4 passed");
|
||||
assert.equal(jsonWorkflow.report.checklist.passedCount, 5);
|
||||
assert.equal(jsonWorkflow.report.rows.find(({ id }) => id === "checklist")?.value, "5/5 passed");
|
||||
assert.equal(validationSummary.apiName, "project-batch-acceptance-report-validation-summary-view-model");
|
||||
assert.equal(validationSummary.statusLine, "Ready: Batch acceptance report evidence complete");
|
||||
assert.equal(validationSummary.rows.find(({ id }) => id === "validation")?.value, "ready");
|
||||
|
||||
@@ -122,6 +122,7 @@ assert.deepEqual(
|
||||
["capabilities", "api, gate"],
|
||||
["project-batch-acceptance", "passed"],
|
||||
["virtual-hal-sim-config-source-coverage", "not required"],
|
||||
["virtual-hal-motion-controller-matrix", "not required"],
|
||||
["missing", "none"],
|
||||
],
|
||||
);
|
||||
@@ -149,7 +150,7 @@ assert.equal(readyChecklist.checklistVersion, 1);
|
||||
assert.equal(readyChecklist.phase, "ready");
|
||||
assert.equal(readyChecklist.ready, true);
|
||||
assert.equal(readyChecklist.batchId, "batch-acceptance-workflow");
|
||||
assert.equal(readyChecklist.passedCount, 4);
|
||||
assert.equal(readyChecklist.passedCount, 5);
|
||||
assert.equal(readyChecklist.blockedCount, 0);
|
||||
assert.deepEqual(
|
||||
readyChecklist.rows.map(({ id, value }) => [id, value]),
|
||||
@@ -157,6 +158,7 @@ assert.deepEqual(
|
||||
["accepted-capability", "pass: api, gate"],
|
||||
["batch-acceptance-gate", "pass: passed"],
|
||||
["virtual-hal-sim-config-source-coverage", "pass: not required"],
|
||||
["virtual-hal-motion-controller-matrix", "pass: not required"],
|
||||
["next-action", "pass: none"],
|
||||
],
|
||||
);
|
||||
@@ -176,13 +178,13 @@ assert.equal(readyReport.capabilityMatrix.apiName, "project-batch-acceptance-cap
|
||||
assert.equal(readyReport.workflow.apiName, "project-batch-acceptance-workflow");
|
||||
assert.equal(readyReport.summaryViewModel.statusLine, "Ready: Batch acceptance evidence complete");
|
||||
assert.equal(readyReport.actionPlan.nextCommand, null);
|
||||
assert.equal(readyReport.checklist.passedCount, 4);
|
||||
assert.equal(readyReport.checklist.passedCount, 5);
|
||||
assert.deepEqual(
|
||||
readyReport.rows.map(({ id, value }) => [id, value]),
|
||||
[
|
||||
["summary", "Ready: Batch acceptance evidence complete"],
|
||||
["capabilities", "api, gate"],
|
||||
["checklist", "4/4 passed"],
|
||||
["checklist", "5/5 passed"],
|
||||
["next-command", "none"],
|
||||
],
|
||||
);
|
||||
@@ -208,6 +210,7 @@ assert.deepEqual(
|
||||
["workflow", "ready"],
|
||||
["checklist", "ready"],
|
||||
["virtual-hal-sim-config-source-coverage", "not required"],
|
||||
["virtual-hal-motion-controller-matrix", "not required"],
|
||||
["missing", "none"],
|
||||
],
|
||||
);
|
||||
@@ -351,7 +354,7 @@ const blockedChecklist = createProjectBatchAcceptanceChecklist({
|
||||
});
|
||||
assert.equal(blockedChecklist.phase, "blocked");
|
||||
assert.equal(blockedChecklist.ready, false);
|
||||
assert.equal(blockedChecklist.passedCount, 1);
|
||||
assert.equal(blockedChecklist.passedCount, 2);
|
||||
assert.equal(blockedChecklist.blockedCount, 3);
|
||||
assert.deepEqual(
|
||||
blockedChecklist.items.map(({ id, status }) => [id, status]),
|
||||
@@ -359,6 +362,7 @@ assert.deepEqual(
|
||||
["accepted-capability", "blocked"],
|
||||
["batch-acceptance-gate", "blocked"],
|
||||
["virtual-hal-sim-config-source-coverage", "pass"],
|
||||
["virtual-hal-motion-controller-matrix", "pass"],
|
||||
["next-action", "blocked"],
|
||||
],
|
||||
);
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
import assert from "node:assert/strict";
|
||||
import { readFileSync } from "node:fs";
|
||||
import { dirname, resolve } from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
import {
|
||||
createProjectReleaseBrowserDiagnosticsArtifactValidation,
|
||||
@@ -7,6 +10,7 @@ import {
|
||||
createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel,
|
||||
createProjectReleaseReadinessReport,
|
||||
createVirtualHalSimConfigSourceCoverageReport,
|
||||
createVirtualHalSimConfigPromotionCandidateReport,
|
||||
createVirtualHalCommandScriptFixtureReport,
|
||||
createVirtualHalMotionControllerMatrixReport,
|
||||
createVirtualHalSimulationReplacementReport,
|
||||
@@ -15,8 +19,17 @@ import {
|
||||
loadProjectReleaseReadinessArtifactUrlWorkflow,
|
||||
} from "../../../runtime/sdk/src/index.js";
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const root = resolve(__dirname, "../../..");
|
||||
const sourceManifestText = readFileSync(resolve(root, "tools/source-manifest.txt"), "utf8");
|
||||
const manifest = createProjectReleaseGateManifest();
|
||||
const virtualHalSimConfigSourceCoverage = createVirtualHalSimConfigSourceCoverageReport();
|
||||
const virtualHalMotionControllerMatrix = createVirtualHalMotionControllerMatrixReport({ manifestText: sourceManifestText });
|
||||
const virtualHalSimConfigPromotionCandidates = createVirtualHalSimConfigPromotionCandidateReport({
|
||||
manifestText: sourceManifestText,
|
||||
simConfigSourceCoverage: virtualHalSimConfigSourceCoverage,
|
||||
motionControllerMatrix: virtualHalMotionControllerMatrix,
|
||||
});
|
||||
const virtualHalState = createVirtualHalState();
|
||||
const browserDiagnosticsArtifact = {
|
||||
apiName: "real-browser-simulation-diagnostics-artifact",
|
||||
@@ -25,13 +38,31 @@ const browserDiagnosticsArtifact = {
|
||||
virtualHalSimulationReplacement: createVirtualHalSimulationReplacementReport(virtualHalState),
|
||||
virtualHalSourceCompliance: createVirtualHalSourceComplianceReport({ halState: virtualHalState }),
|
||||
virtualHalSimConfigSourceCoverage,
|
||||
virtualHalSimConfigPromotionCandidates,
|
||||
virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport({ halState: virtualHalState }),
|
||||
virtualHalMotionControllerMatrix: createVirtualHalMotionControllerMatrixReport(),
|
||||
virtualHalMotionControllerMatrix,
|
||||
};
|
||||
const browserDiagnosticsSessionNestedArtifact = { ...browserDiagnosticsArtifact };
|
||||
const savedSessionDiagnosticsArtifact = {
|
||||
apiName: "real-browser-simulation-virtual-hal-session-diagnostics",
|
||||
artifactVersion: 1,
|
||||
ready: true,
|
||||
phase: "release-ready",
|
||||
sessionId: "release-url-workflow-virtual-hal-session",
|
||||
machineId: "release-url-workflow-machine",
|
||||
createdAt: "2026-06-17T00:00:00.000Z",
|
||||
metadata: { source: "project-release-artifact-url-workflow-fixture" },
|
||||
files: {},
|
||||
virtualHalRevision: virtualHalState.revision,
|
||||
validation: createProjectReleaseBrowserDiagnosticsArtifactValidation(browserDiagnosticsSessionNestedArtifact),
|
||||
diagnosticsArtifact: browserDiagnosticsSessionNestedArtifact,
|
||||
};
|
||||
browserDiagnosticsArtifact.virtualHalSessionDiagnostics = savedSessionDiagnosticsArtifact;
|
||||
assert.equal(createProjectReleaseBrowserDiagnosticsArtifactValidation(browserDiagnosticsArtifact).ready, true);
|
||||
const readyArtifactJson = JSON.stringify(createProjectReleaseReadinessReport({
|
||||
gateResults: Object.fromEntries(manifest.gateIds.map((id) => [id, true])),
|
||||
virtualHalSimConfigSourceCoverage,
|
||||
virtualHalMotionControllerMatrix: browserDiagnosticsArtifact.virtualHalMotionControllerMatrix,
|
||||
}));
|
||||
|
||||
let fetchedUrl = null;
|
||||
@@ -67,6 +98,10 @@ assert.equal(readyWorkflow.fetchError, null);
|
||||
assert.equal(readyWorkflow.jsonWorkflow.ready, true);
|
||||
assert.equal(readyWorkflow.validation.ready, true);
|
||||
assert.equal(readyWorkflow.diagnosticsValidation.ready, true);
|
||||
assert.equal(readyWorkflow.diagnosticsValidation.hasPromotionCandidates, true);
|
||||
assert.equal(readyWorkflow.diagnosticsValidation.promotionCandidatesReady, true);
|
||||
assert.equal(readyWorkflow.diagnosticsValidation.hasSessionDiagnostics, true);
|
||||
assert.equal(readyWorkflow.diagnosticsValidation.sessionDiagnosticsReady, true);
|
||||
assert.equal(readyWorkflow.diagnosticsFetched, true);
|
||||
assert.equal(readyWorkflow.diagnosticsHttpStatus, 200);
|
||||
assert.equal(readyWorkflow.actionPlan.ready, true);
|
||||
@@ -80,6 +115,7 @@ assert.deepEqual(
|
||||
["json-workflow", "ready"],
|
||||
["artifact-validation", "ready"],
|
||||
["browser-diagnostics", "ready"],
|
||||
["saved-session-diagnostics", "ready"],
|
||||
["next-command", "none"],
|
||||
["missing", "none"],
|
||||
],
|
||||
@@ -100,6 +136,97 @@ assert.deepEqual(readyActionPlan, {
|
||||
rows: [],
|
||||
});
|
||||
|
||||
const liveOnlyDiagnosticsArtifact = { ...browserDiagnosticsSessionNestedArtifact };
|
||||
const liveOnlyDiagnosticsWorkflow = await loadProjectReleaseReadinessArtifactUrlWorkflow({
|
||||
artifactUrl: "/project-release-readiness.json",
|
||||
diagnosticsUrl: "/real-browser-simulation-live-only-diagnostics.json",
|
||||
requireSavedSessionDiagnostics: true,
|
||||
fetchRef: async (url) => ({
|
||||
ok: true,
|
||||
status: 200,
|
||||
text: async () => url === "/real-browser-simulation-live-only-diagnostics.json"
|
||||
? JSON.stringify(liveOnlyDiagnosticsArtifact)
|
||||
: readyArtifactJson,
|
||||
}),
|
||||
});
|
||||
assert.equal(liveOnlyDiagnosticsWorkflow.ready, false);
|
||||
assert.equal(liveOnlyDiagnosticsWorkflow.diagnosticsValidation.ready, true);
|
||||
assert.equal(liveOnlyDiagnosticsWorkflow.diagnosticsValidation.hasSessionDiagnostics, false);
|
||||
assert.equal(liveOnlyDiagnosticsWorkflow.missing.includes("diagnostics.virtualHalSessionDiagnostics"), true);
|
||||
assert.equal(
|
||||
createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel(liveOnlyDiagnosticsWorkflow)
|
||||
.rows.find(({ id }) => id === "saved-session-diagnostics")?.value,
|
||||
"not provided",
|
||||
);
|
||||
|
||||
const incompleteSourceSessionDiagnosticsArtifact = {
|
||||
...browserDiagnosticsArtifact,
|
||||
virtualHalSessionDiagnostics: {
|
||||
...savedSessionDiagnosticsArtifact,
|
||||
diagnosticsArtifact: {
|
||||
...browserDiagnosticsSessionNestedArtifact,
|
||||
virtualHalSourceCompliance: {
|
||||
...browserDiagnosticsSessionNestedArtifact.virtualHalSourceCompliance,
|
||||
complete: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
incompleteSourceSessionDiagnosticsArtifact.virtualHalSessionDiagnostics.validation =
|
||||
createProjectReleaseBrowserDiagnosticsArtifactValidation(
|
||||
incompleteSourceSessionDiagnosticsArtifact.virtualHalSessionDiagnostics.diagnosticsArtifact,
|
||||
);
|
||||
const incompleteSourceDiagnosticsWorkflow = await loadProjectReleaseReadinessArtifactUrlWorkflow({
|
||||
artifactUrl: "/project-release-readiness.json",
|
||||
diagnosticsUrl: "/real-browser-simulation-incomplete-source-diagnostics.json",
|
||||
requireSavedSessionDiagnostics: true,
|
||||
fetchRef: async (url) => ({
|
||||
ok: true,
|
||||
status: 200,
|
||||
text: async () => url === "/real-browser-simulation-incomplete-source-diagnostics.json"
|
||||
? JSON.stringify(incompleteSourceSessionDiagnosticsArtifact)
|
||||
: readyArtifactJson,
|
||||
}),
|
||||
});
|
||||
assert.equal(incompleteSourceDiagnosticsWorkflow.ready, false);
|
||||
assert.equal(incompleteSourceDiagnosticsWorkflow.diagnosticsValidation.sessionDiagnosticsReady, false);
|
||||
assert.equal(incompleteSourceDiagnosticsWorkflow.missing.includes("diagnostics.virtualHalSessionDiagnostics"), true);
|
||||
assert.equal(
|
||||
createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel(incompleteSourceDiagnosticsWorkflow)
|
||||
.rows.find(({ id }) => id === "saved-session-diagnostics")?.value,
|
||||
"blocked",
|
||||
);
|
||||
|
||||
const missingManifestSessionDiagnosticsArtifact = {
|
||||
...browserDiagnosticsArtifact,
|
||||
virtualHalSessionDiagnostics: {
|
||||
...savedSessionDiagnosticsArtifact,
|
||||
diagnosticsArtifact: {
|
||||
...browserDiagnosticsSessionNestedArtifact,
|
||||
virtualHalMotionControllerMatrix: createVirtualHalMotionControllerMatrixReport(),
|
||||
},
|
||||
},
|
||||
};
|
||||
missingManifestSessionDiagnosticsArtifact.virtualHalSessionDiagnostics.validation =
|
||||
createProjectReleaseBrowserDiagnosticsArtifactValidation(
|
||||
missingManifestSessionDiagnosticsArtifact.virtualHalSessionDiagnostics.diagnosticsArtifact,
|
||||
);
|
||||
const missingManifestDiagnosticsWorkflow = await loadProjectReleaseReadinessArtifactUrlWorkflow({
|
||||
artifactUrl: "/project-release-readiness.json",
|
||||
diagnosticsUrl: "/real-browser-simulation-missing-manifest-diagnostics.json",
|
||||
requireSavedSessionDiagnostics: true,
|
||||
fetchRef: async (url) => ({
|
||||
ok: true,
|
||||
status: 200,
|
||||
text: async () => url === "/real-browser-simulation-missing-manifest-diagnostics.json"
|
||||
? JSON.stringify(missingManifestSessionDiagnosticsArtifact)
|
||||
: readyArtifactJson,
|
||||
}),
|
||||
});
|
||||
assert.equal(missingManifestDiagnosticsWorkflow.ready, false);
|
||||
assert.equal(missingManifestDiagnosticsWorkflow.diagnosticsValidation.sessionDiagnosticsReady, false);
|
||||
assert.equal(missingManifestDiagnosticsWorkflow.missing.includes("diagnostics.virtualHalSessionDiagnostics"), true);
|
||||
|
||||
const missingInputWorkflow = await loadProjectReleaseReadinessArtifactUrlWorkflow({
|
||||
artifactUrl: "",
|
||||
fetchRef: null,
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import assert from "node:assert/strict";
|
||||
|
||||
import {
|
||||
VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS,
|
||||
createVirtualHalMotionControllerMatrixReport,
|
||||
createVirtualHalSimConfigSourceCoverageReport,
|
||||
createProjectReleaseGateActionPlan,
|
||||
createProjectReleaseGateExecutionManifest,
|
||||
@@ -19,6 +21,9 @@ import {
|
||||
|
||||
const manifest = createProjectReleaseGateManifest();
|
||||
const virtualHalSimConfigSourceCoverage = createVirtualHalSimConfigSourceCoverageReport();
|
||||
const virtualHalMotionControllerMatrix = createVirtualHalMotionControllerMatrixReport({
|
||||
manifestEntries: VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS.flatMap((target) => target.sourceFiles ?? []),
|
||||
});
|
||||
|
||||
assert.equal(manifest.apiName, "project-release-gate-manifest");
|
||||
assert.equal(manifest.manifestVersion, 1);
|
||||
@@ -204,6 +209,7 @@ assert.match(partialActionPlan.shellScript, /wasm-port\/tests\/host\/verify_proj
|
||||
const report = createProjectReleaseReadinessReport({
|
||||
gateResults: Object.fromEntries(manifest.gateIds.map((id) => [id, true])),
|
||||
virtualHalSimConfigSourceCoverage,
|
||||
virtualHalMotionControllerMatrix,
|
||||
});
|
||||
assert.deepEqual(report.gateManifest, manifest);
|
||||
assert.equal(report.gateExecutionManifest.apiName, "project-release-gate-execution-manifest");
|
||||
@@ -251,6 +257,11 @@ assert.deepEqual(createProjectReleaseReadinessSummaryViewModel(report), {
|
||||
label: "Virtual HAL sim-config source coverage",
|
||||
value: "ready",
|
||||
},
|
||||
{
|
||||
id: "virtual-hal-motion-controller-matrix",
|
||||
label: "Virtual HAL motion controller matrix",
|
||||
value: "ready",
|
||||
},
|
||||
{
|
||||
id: "blocked-runtime-families",
|
||||
label: "Blocked runtime families",
|
||||
@@ -270,12 +281,13 @@ assert.deepEqual(createProjectReleaseReadinessSummaryViewModel(report), {
|
||||
});
|
||||
assert.equal(
|
||||
createProjectReleaseReadinessSummaryViewModel(createProjectReleaseReadinessReport()).statusLine,
|
||||
"Waiting: project-release-gate, virtual-hal-sim-config-source-coverage",
|
||||
"Waiting: project-release-gate, virtual-hal-sim-config-source-coverage, virtual-hal-motion-controller-matrix",
|
||||
);
|
||||
assert.equal(
|
||||
createProjectReleaseReadinessSummaryViewModel(createProjectReleaseReadinessReport({
|
||||
gateResults: Object.fromEntries(manifest.gateIds.map((id) => [id, true])),
|
||||
virtualHalSimConfigSourceCoverage,
|
||||
virtualHalMotionControllerMatrix,
|
||||
promotedRuntimeFamilies: ["L4-TOOL-DB"],
|
||||
})).rows.find(({ id }) => id === "blocked-runtime-families")?.value,
|
||||
"promoted: L4-TOOL-DB",
|
||||
@@ -318,6 +330,7 @@ assert.deepEqual(
|
||||
["gate-result-matrix", "ready"],
|
||||
["gate-action-plan", "ready"],
|
||||
["virtual-hal-sim-config-source-coverage", "ready"],
|
||||
["virtual-hal-motion-controller-matrix", "ready"],
|
||||
["missing", "none"],
|
||||
],
|
||||
);
|
||||
@@ -405,6 +418,7 @@ assert.deepEqual(
|
||||
["json-workflow", "ready"],
|
||||
["artifact-validation", "ready"],
|
||||
["browser-diagnostics", "not requested"],
|
||||
["saved-session-diagnostics", "not requested"],
|
||||
["next-command", "none"],
|
||||
["missing", "none"],
|
||||
],
|
||||
|
||||
@@ -36,6 +36,7 @@ import {
|
||||
VIRTUAL_HAL_COVERAGE_STATES,
|
||||
VIRTUAL_HAL_MOTION_CONTROLLER_MATRIX_FIXTURES,
|
||||
VIRTUAL_HAL_PROJECT_PIN_GROUPS,
|
||||
VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES,
|
||||
VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS,
|
||||
VIRTUAL_HAL_SOURCE_DERIVED_CAPABILITIES,
|
||||
VIRTUAL_HAL_SIMULATION_REPLACEMENT_TARGETS,
|
||||
@@ -89,6 +90,7 @@ import {
|
||||
createVirtualHalPinInventory,
|
||||
createVirtualHalPinRegistry,
|
||||
createVirtualHalProjectReport,
|
||||
createVirtualHalSimConfigPromotionCandidateReport,
|
||||
createVirtualHalSimConfigSourceCoverageReport,
|
||||
createVirtualHalSimulationReplacementReport,
|
||||
createVirtualHalState,
|
||||
@@ -239,6 +241,7 @@ const requiredExports = [
|
||||
["createVirtualHalPinInventory", createVirtualHalPinInventory],
|
||||
["createVirtualHalPinRegistry", createVirtualHalPinRegistry],
|
||||
["createVirtualHalProjectReport", createVirtualHalProjectReport],
|
||||
["createVirtualHalSimConfigPromotionCandidateReport", createVirtualHalSimConfigPromotionCandidateReport],
|
||||
["createVirtualHalSimConfigSourceCoverageReport", createVirtualHalSimConfigSourceCoverageReport],
|
||||
["createVirtualHalSimulationReplacementReport", createVirtualHalSimulationReplacementReport],
|
||||
["createVirtualHalSimulationRuntimeReport", createVirtualHalSimulationRuntimeReport],
|
||||
@@ -536,6 +539,10 @@ assert.match(sdkIndexText, /\bcreateVirtualHalSimulationReplacementReport\b/);
|
||||
assert.match(sdkReadmeText, /\bcreateVirtualHalSimulationReplacementReport\b/);
|
||||
assert.match(sdkIndexText, /\bcreateVirtualHalSimConfigSourceCoverageReport\b/);
|
||||
assert.match(sdkReadmeText, /\bcreateVirtualHalSimConfigSourceCoverageReport\b/);
|
||||
assert.match(sdkIndexText, /\bVIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES\b/);
|
||||
assert.match(sdkReadmeText, /\bVIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES\b/);
|
||||
assert.match(sdkIndexText, /\bcreateVirtualHalSimConfigPromotionCandidateReport\b/);
|
||||
assert.match(sdkReadmeText, /\bcreateVirtualHalSimConfigPromotionCandidateReport\b/);
|
||||
assert.match(sdkIndexText, /\bcreateVirtualHalSourceComplianceReport\b/);
|
||||
assert.match(sdkReadmeText, /\bcreateVirtualHalSourceComplianceReport\b/);
|
||||
assert.match(sdkIndexText, /\bcreateVirtualHalSystemCoverageReport\b/);
|
||||
@@ -668,10 +675,23 @@ assert.equal(motionControllerMatrixReport.simConfigSourceFiles.includes("linuxcn
|
||||
assert.equal(motionControllerMatrixReport.simConfigSourceFiles.includes("linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini"), true);
|
||||
assert.equal(motionControllerMatrixReport.simConfigSourceFiles.includes("linuxcnc/configs/sim/axis/vismach/puma/puma.ini"), true);
|
||||
assert.equal(motionControllerMatrixReport.missingSimConfigTargets.length, 0);
|
||||
assert.equal(motionControllerMatrixReport.manifestChecked, false);
|
||||
assert.equal(motionControllerMatrixReport.missingManifestFiles.length, 0);
|
||||
assert.equal(motionControllerMatrixReport.rows.some(({ id, inPosition }) => id === "xyz-multi-axis-in-position" && inPosition === true), true);
|
||||
assert.equal(motionControllerMatrixReport.rows.some(({ id, simConfigTargets }) => id === "x-single-axis-servo-dtg" && simConfigTargets.includes("external-offsets")), true);
|
||||
assert.equal(motionControllerMatrixReport.rows.every(({ axisFeedbackRows }) => axisFeedbackRows.every(({ matched }) => matched)), true);
|
||||
assert.equal(virtualHalRuntime.getMotionControllerMatrixReport().complete, true);
|
||||
const manifestCheckedMotionControllerMatrixReport = createVirtualHalMotionControllerMatrixReport({
|
||||
manifestText: sourceManifestText,
|
||||
});
|
||||
assert.equal(manifestCheckedMotionControllerMatrixReport.complete, true);
|
||||
assert.equal(manifestCheckedMotionControllerMatrixReport.manifestChecked, true);
|
||||
assert.equal(manifestCheckedMotionControllerMatrixReport.missingManifestFiles.length, 0);
|
||||
assert.equal(manifestCheckedMotionControllerMatrixReport.rows.every(({ manifestChecked }) => manifestChecked === true), true);
|
||||
assert.equal(
|
||||
manifestCheckedMotionControllerMatrixReport.rows.every(({ missingManifestFiles }) => missingManifestFiles.length === 0),
|
||||
true,
|
||||
);
|
||||
const steppedVirtualHal = stepVirtualHalMotion(virtualHalRuntime.getState(), {
|
||||
target: { x: 3 },
|
||||
maxVelocity: 10,
|
||||
@@ -729,6 +749,41 @@ assert.equal(simConfigSourceCoverageReport.sourceFiles.includes("linuxcnc/config
|
||||
assert.equal(simConfigSourceCoverageReport.sourceFiles.includes("linuxcnc/configs/sim/qtdragon/qtdragon_xyz/on_abort.ngc"), true);
|
||||
assert.equal(simConfigSourceCoverageReport.rows.every(({ sourceDerived }) => sourceDerived), true);
|
||||
assert.equal(virtualHalRuntime.getSimConfigSourceCoverageReport({ manifestText: sourceManifestText }).complete, true);
|
||||
assert.equal(VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES.length >= 8, true);
|
||||
const simConfigPromotionCandidateReport = createVirtualHalSimConfigPromotionCandidateReport({
|
||||
manifestText: sourceManifestText,
|
||||
simConfigSourceCoverage: simConfigSourceCoverageReport,
|
||||
motionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
|
||||
});
|
||||
assert.equal(
|
||||
simConfigPromotionCandidateReport.apiName,
|
||||
"linuxcnc-wasm-virtual-hal-sim-config-promotion-candidate-report",
|
||||
);
|
||||
assert.equal(simConfigPromotionCandidateReport.complete, true);
|
||||
assert.equal(simConfigPromotionCandidateReport.webSimulationSatisfied, true);
|
||||
assert.equal(simConfigPromotionCandidateReport.inventoryBaselineUnchanged, true);
|
||||
assert.equal(simConfigPromotionCandidateReport.manifestChecked, true);
|
||||
assert.equal(simConfigPromotionCandidateReport.missingCandidates.length, 0);
|
||||
assert.equal(simConfigPromotionCandidateReport.blockedCandidateIds.length, 0);
|
||||
assert.equal(simConfigPromotionCandidateReport.missingManifestFiles.length, 0);
|
||||
assert.equal(simConfigPromotionCandidateReport.missingRequiredReports.length, 0);
|
||||
assert.equal(
|
||||
simConfigPromotionCandidateReport.rows.some((row) =>
|
||||
row.id === "qtdragon-multi-joint-on-abort" &&
|
||||
row.complete === true &&
|
||||
row.currentNodeInventoryStatus === "PASS" &&
|
||||
row.targetBrowserEvidence === "explicit-browser-diagnostics" &&
|
||||
row.sourceFiles.includes("linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini") &&
|
||||
row.sourceFiles.includes("linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc")
|
||||
),
|
||||
true,
|
||||
);
|
||||
assert.equal(simConfigPromotionCandidateReport.rows.every(({ blockedKind }) => blockedKind === "-"), true);
|
||||
assert.equal(virtualHalRuntime.getSimConfigPromotionCandidateReport({
|
||||
manifestText: sourceManifestText,
|
||||
simConfigSourceCoverage: simConfigSourceCoverageReport,
|
||||
motionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
|
||||
}).complete, true);
|
||||
const sourceComplianceReport = createVirtualHalSourceComplianceReport({ halState: virtualHalRuntime.getState() });
|
||||
assert.equal(sourceComplianceReport.apiName, "linuxcnc-wasm-virtual-hal-source-compliance-report");
|
||||
assert.equal(sourceComplianceReport.complete, true);
|
||||
@@ -768,25 +823,47 @@ assert.equal(
|
||||
restoreVirtualHalStateFromSessionSnapshot(virtualHalSessionSnapshot).hal.nets["x-pos"].includes("axis.x.pos-cmd"),
|
||||
true,
|
||||
);
|
||||
const browserDiagnosticsArtifactValidation = createProjectReleaseBrowserDiagnosticsArtifactValidation({
|
||||
const browserDiagnosticsArtifact = {
|
||||
apiName: "real-browser-simulation-diagnostics-artifact",
|
||||
virtualHal: virtualHalRuntime.getState(),
|
||||
virtualHalSimulationReplacement: replacementReport,
|
||||
virtualHalSourceCompliance: sourceComplianceReport,
|
||||
virtualHalSimConfigSourceCoverage: simConfigSourceCoverageReport,
|
||||
virtualHalSimConfigPromotionCandidates: simConfigPromotionCandidateReport,
|
||||
virtualHalCommandScriptFixtures: commandScriptFixtureReport,
|
||||
virtualHalMotionControllerMatrix: motionControllerMatrixReport,
|
||||
});
|
||||
virtualHalMotionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
|
||||
};
|
||||
const browserDiagnosticsSessionNestedArtifact = { ...browserDiagnosticsArtifact };
|
||||
browserDiagnosticsArtifact.virtualHalSessionDiagnostics = {
|
||||
apiName: "real-browser-simulation-virtual-hal-session-diagnostics",
|
||||
artifactVersion: 1,
|
||||
ready: true,
|
||||
phase: "release-ready",
|
||||
sessionId: virtualHalSessionSnapshot.sessionId,
|
||||
machineId: virtualHalSessionSnapshot.payload.machineId,
|
||||
createdAt: virtualHalSessionSnapshot.createdAt,
|
||||
metadata: { ...(virtualHalSessionSnapshot.metadata ?? {}) },
|
||||
files: { ...(virtualHalSessionSnapshot.payload.files ?? {}) },
|
||||
virtualHalRevision: virtualHalSessionPayload.state.revision,
|
||||
validation: createProjectReleaseBrowserDiagnosticsArtifactValidation(browserDiagnosticsArtifact),
|
||||
diagnosticsArtifact: browserDiagnosticsSessionNestedArtifact,
|
||||
};
|
||||
const browserDiagnosticsArtifactValidation = createProjectReleaseBrowserDiagnosticsArtifactValidation(browserDiagnosticsArtifact);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.apiName, "project-release-browser-diagnostics-artifact-validation");
|
||||
assert.equal(browserDiagnosticsArtifactValidation.ready, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.sourceComplianceReady, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.simConfigSourceCoverageReady, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.promotionCandidatesReady, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.hasPromotionCandidates, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.commandScriptFixturesReady, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.motionControllerMatrixReady, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.hasSessionDiagnostics, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.sessionDiagnosticsReady, true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/src/hal/utils/halcmd_commands.cc"), true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/src/emc/motion/axis.c"), true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/external_offsets/dynamic_offsets.ini"), true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini"), true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc"), true);
|
||||
assert.equal(browserDiagnosticsArtifactValidation.sourceFiles.includes("linuxcnc/configs/sim/axis/vismach/puma/puma.ini"), true);
|
||||
const runtimeProjectReport = virtualHalRuntime.getProjectReport({ availableFunctions: VIRTUAL_HAL_WASM_BRIDGE_FUNCTIONS });
|
||||
assert.equal(runtimeProjectReport.simulationRuntime.replacesHostRuntimeForSimulation, true);
|
||||
@@ -857,16 +934,20 @@ assert.equal(
|
||||
capabilities: batchAcceptanceWorkflow.capabilities,
|
||||
observedOutputs: ["project_batch_acceptance_workflow_node_smoke=ok"],
|
||||
virtualHalSimConfigSourceCoverage: simConfigSourceCoverageReport,
|
||||
virtualHalMotionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
|
||||
}).rows.find(({ id }) => id === "checklist")?.value,
|
||||
"4/4 passed",
|
||||
"5/5 passed",
|
||||
);
|
||||
const batchAcceptanceReport = createProjectBatchAcceptanceReport({
|
||||
batchId: "sdk-surface-batch",
|
||||
capabilities: batchAcceptanceWorkflow.capabilities,
|
||||
observedOutputs: ["project_batch_acceptance_workflow_node_smoke=ok"],
|
||||
virtualHalSimConfigSourceCoverage: simConfigSourceCoverageReport,
|
||||
virtualHalMotionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
|
||||
});
|
||||
assert.equal(batchAcceptanceReport.virtualHalSimConfigSourceCoverage.complete, true);
|
||||
assert.equal(batchAcceptanceReport.virtualHalMotionControllerMatrix.complete, true);
|
||||
assert.equal(batchAcceptanceReport.workflow.virtualHalMotionControllerMatrixReady, true);
|
||||
assert.equal(createProjectBatchAcceptanceReportValidation(batchAcceptanceReport).ready, true);
|
||||
assert.equal(
|
||||
createProjectBatchAcceptanceReportValidationSummaryViewModel(
|
||||
@@ -920,7 +1001,11 @@ assert.equal(
|
||||
);
|
||||
assert.equal(releaseReadinessWaiting.apiName, "project-release-readiness-report");
|
||||
assert.equal(releaseReadinessWaiting.ready, false);
|
||||
assert.deepEqual(releaseReadinessWaiting.missing, ["project-release-gate", "virtual-hal-sim-config-source-coverage"]);
|
||||
assert.deepEqual(releaseReadinessWaiting.missing, [
|
||||
"project-release-gate",
|
||||
"virtual-hal-sim-config-source-coverage",
|
||||
"virtual-hal-motion-controller-matrix",
|
||||
]);
|
||||
assert.equal(releaseReadinessWaiting.simConfigInventory.unexpectedFail, 0);
|
||||
assert.deepEqual(releaseReadinessWaiting.promotedBlockedFamilies, []);
|
||||
assert.equal(releaseReadinessWaiting.gateActionPlan.apiName, "project-release-gate-action-plan");
|
||||
@@ -933,10 +1018,12 @@ assert.equal(
|
||||
const releaseReadinessReady = createProjectReleaseReadinessReport({
|
||||
observedOutputs: ["project_release_gate=ok"],
|
||||
virtualHalSimConfigSourceCoverage: simConfigSourceCoverageReport,
|
||||
virtualHalMotionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
|
||||
});
|
||||
assert.equal(releaseReadinessReady.ready, true);
|
||||
assert.equal(releaseReadinessReady.releaseGate.passed, true);
|
||||
assert.equal(releaseReadinessReady.virtualHalSimConfigSourceCoverageReady, true);
|
||||
assert.equal(releaseReadinessReady.virtualHalMotionControllerMatrixReady, true);
|
||||
assert.deepEqual(releaseReadinessReady.gateManifest, createProjectReleaseGateManifest());
|
||||
assert.equal(releaseReadinessReady.gateResultMatrix.rows.length, createProjectReleaseGateManifest().gateCount);
|
||||
assert.equal(createProjectReleaseGateActionPlan({
|
||||
@@ -953,6 +1040,7 @@ assert.equal(
|
||||
const releaseReadinessWithScreenshots = createProjectReleaseReadinessReport({
|
||||
gateResults: Object.fromEntries(createProjectReleaseGateManifest().gateIds.map((id) => [id, true])),
|
||||
virtualHalSimConfigSourceCoverage: simConfigSourceCoverageReport,
|
||||
virtualHalMotionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
|
||||
axisScreenshotArtifacts: ["desktop-preview", "desktop-dro", "mobile-preview", "mobile-mdi"].map((viewportName) => ({
|
||||
apiName: "real-browser-simulation-axis-screenshot-artifact",
|
||||
artifactVersion: 1,
|
||||
@@ -987,6 +1075,7 @@ assert.equal(
|
||||
const releaseReadinessArtifact = parseProjectReleaseReadinessArtifactJson(JSON.stringify(createProjectReleaseReadinessReport({
|
||||
gateResults: Object.fromEntries(createProjectReleaseGateManifest().gateIds.map((id) => [id, true])),
|
||||
virtualHalSimConfigSourceCoverage: simConfigSourceCoverageReport,
|
||||
virtualHalMotionControllerMatrix: manifestCheckedMotionControllerMatrixReport,
|
||||
})));
|
||||
assert.equal(releaseReadinessArtifact.apiName, "project-release-readiness-report");
|
||||
const releaseReadinessArtifactValidation = createProjectReleaseReadinessArtifactValidation(releaseReadinessArtifact);
|
||||
@@ -1007,6 +1096,7 @@ assert.deepEqual(releaseReadinessArtifactValidation, {
|
||||
gateResultMatrixReady: true,
|
||||
gateActionPlanReady: true,
|
||||
virtualHalSimConfigSourceCoverageReady: true,
|
||||
virtualHalMotionControllerMatrixReady: true,
|
||||
axisScreenshotArtifactSummaryReady: true,
|
||||
axisScreenshotArtifactCount: 0,
|
||||
blockedRuntimeFamilies: [
|
||||
@@ -1055,6 +1145,11 @@ assert.deepEqual(releaseReadinessArtifactValidation, {
|
||||
label: "Virtual HAL sim-config source coverage",
|
||||
value: "ready",
|
||||
},
|
||||
{
|
||||
id: "virtual-hal-motion-controller-matrix",
|
||||
label: "Virtual HAL motion controller matrix",
|
||||
value: "ready",
|
||||
},
|
||||
{
|
||||
id: "axis-screenshot-artifacts",
|
||||
label: "AXIS screenshot artifacts",
|
||||
@@ -1152,6 +1247,7 @@ assert.deepEqual(
|
||||
"simConfigInventory.skipped",
|
||||
"simConfigInventory.unexpectedFail",
|
||||
"virtualHalSimConfigSourceCoverage",
|
||||
"virtualHalMotionControllerMatrix",
|
||||
"blockedRuntimeFamilies",
|
||||
"gateManifest",
|
||||
"gateExecutionManifest",
|
||||
|
||||
@@ -4,6 +4,7 @@ import { fileURLToPath } from "node:url";
|
||||
|
||||
import {
|
||||
createProjectBatchAcceptanceReport,
|
||||
createVirtualHalMotionControllerMatrixReport,
|
||||
createVirtualHalSimConfigSourceCoverageReport,
|
||||
} from "../../../runtime/sdk/src/index.js";
|
||||
|
||||
@@ -29,6 +30,13 @@ const report = createProjectBatchAcceptanceReport({
|
||||
evidence: "linuxcnc-wasm-virtual-hal-sim-config-source-coverage-report",
|
||||
command: "wasm-port/tests/sdk/node/verify_sdk_surface.sh",
|
||||
},
|
||||
{
|
||||
id: "virtual-hal-motion-controller-matrix",
|
||||
type: "api",
|
||||
label: "Virtual HAL motion controller matrix",
|
||||
evidence: "linuxcnc-wasm-virtual-hal-motion-controller-matrix-report",
|
||||
command: "wasm-port/tests/sdk/node/verify_sdk_surface.sh",
|
||||
},
|
||||
{
|
||||
id: "project-batch-acceptance-workflow-gate",
|
||||
type: "gate",
|
||||
@@ -41,6 +49,9 @@ const report = createProjectBatchAcceptanceReport({
|
||||
virtualHalSimConfigSourceCoverage: createVirtualHalSimConfigSourceCoverageReport({
|
||||
manifestText: sourceManifestText,
|
||||
}),
|
||||
virtualHalMotionControllerMatrix: createVirtualHalMotionControllerMatrixReport({
|
||||
manifestText: sourceManifestText,
|
||||
}),
|
||||
});
|
||||
|
||||
mkdirSync(dirname(outputPath), { recursive: true });
|
||||
|
||||
Reference in New Issue
Block a user