Files
FreeCADWasmDev/web/tools/test-window-host-contract.mjs
wangdequan 9a7c4f0335 Save FreeCAD Web workspace sources and user validation evidence
IFC native binding remains incomplete; preserve accurate test results.
2026-09-15 22:01:58 +08:00

43 lines
2.9 KiB
JavaScript

import assert from 'node:assert/strict';
import fs from 'node:fs';
import vm from 'node:vm';
import test from 'node:test';
import ts from 'typescript';
const modules = new Map();
function load(name) {
if(modules.has(name))return modules.get(name);
if(name.endsWith('.json'))return JSON.parse(fs.readFileSync(new URL(`../src/${name.slice(2)}`,import.meta.url),'utf8'));
const source=fs.readFileSync(new URL(`../src/${name.slice(2).replace(/\.js$/,'.ts')}`,import.meta.url),'utf8');
const code=ts.transpileModule(source,{compilerOptions:{module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES2022,esModuleInterop:true}}).outputText;
const module={exports:{}};modules.set(name,module.exports);
vm.runInNewContext(`(function(exports,require,module){${code}})`,{AbortController})(module.exports,load,module);
return module.exports;
}
const facade=load('./part-view-facade.js');
const {validWindowHostResult}=load('./web-window-contract.js');
const envelope=load('./facade-envelope.js');
function payload(owner='PartBox',command='Std_DockViewMenu') {
return {schema:'freecad-web/document-view/v1',owner,document:'workbench-document',command,
parameters:{host:{toolbar:'window-commands',panels:[{objectName:'modules',title:'Modules',visible:true}]}}};
}
test('only window-host commands accept a non-native workspace identifier',()=>{
for(const owner of ['PartBox','DocumentProbe']) {
const p=payload(owner);
assert.equal(facade.isDocumentViewRequest(envelope.createRequest('test',facade.viewEndpoint(owner),p)),true);
assert.equal(facade.isDocumentViewRequest(envelope.createRequest('test',facade.viewEndpoint(owner),{...p,command:'Std_DrawStyle'})),false);
assert.equal(facade.isDocumentViewRequest(envelope.createRequest('test',facade.viewEndpoint(owner),{...p,document:''})),false);
}
});
test('native window replies retain owner identity and command-specific shape',async()=>{
const p=payload(), result={command:p.command,documentId:p.document,items:[{objectName:'modules',title:'Modules',visible:true,enabled:true}]};
const reply={ok:true,schema:p.schema,owner:p.owner,document:p.document,command:p.command,result};
const call=value=>facade.handleDocumentView(p,new AbortController().signal,{ccall:()=>JSON.stringify(value)});
assert.equal(JSON.stringify(await call(reply)),JSON.stringify(result));
for(const mutation of [{owner:'DocumentProbe'},{document:'Another'}, {result:{...result,items:[]}},
{result:{...result,items:[result.items[0],result.items[0]]}}, {result:{...result,documentId:'Another'}}])
await assert.rejects(call({...reply,...mutation}),/Invalid native window/);
assert.equal(validWindowHostResult({command:'Std_ToggleToolBarLock',documentId:p.document,locked:false},'Std_ToggleToolBarLock',p.document),true);
assert.equal(validWindowHostResult({command:'Std_ToggleToolBarLock',documentId:p.document,locked:'false'},'Std_ToggleToolBarLock',p.document),false);
});