41 lines
3.0 KiB
JavaScript
41 lines
3.0 KiB
JavaScript
'use strict';
|
|
const assert = require('node:assert/strict');
|
|
const fs = require('node:fs');
|
|
const crypto = require('node:crypto');
|
|
const {adapt, inspect} = require('./reference_probe.cjs');
|
|
const nodes = [
|
|
{id:'parent', element:'ep', visual_parent:null, collapsed:false, position:{x:100,y:200},size:{width:300,height:300}},
|
|
{id:'child', element:'ec', visual_parent:'parent', collapsed:false, position:{x:124,y:264},size:{width:100,height:80}},
|
|
{id:'sink', element:'es', visual_parent:null, collapsed:true, position:{x:600,y:264},size:{width:100,height:80}},
|
|
];
|
|
const ports = [
|
|
{owner:'child',element:'out',side:'Right',position:{x:224,y:304}},
|
|
{owner:'sink',element:'in',side:'Left',position:{x:600,y:304}},
|
|
];
|
|
const edges = ['one','two'].map(id=>({id,oriented:true,source:'child',target:'sink',source_port:'out',target_port:'in'}));
|
|
const row = {fixture:'synthetic',diagram:'d',before_project:{diagrams:{d:{nodes:Object.fromEntries(nodes.map(n=>[n.id,n]))}}},
|
|
before:{projected_nodes:nodes,projected_ports:ports,projected_edges:edges,
|
|
routed_edges:edges.map(e=>({id:e.id,label:{text:e.id,size:{width:30,height:24}}}))}};
|
|
const {graph,mapping} = adapt(row);
|
|
assert.equal(mapping.ports.length,2);
|
|
assert.equal(graph.edges[0].sources[0],graph.edges[1].sources[0]);
|
|
const result = inspect(graph,mapping);
|
|
assert.equal(result.structural_checks_passed,true);
|
|
assert.deepEqual(result.nodes.find(n=>n.id==='child').position,{x:124,y:264});
|
|
assert.deepEqual(result.ports.find(p=>p.owner==='child').position,{x:224,y:304});
|
|
const badSize=structuredClone(graph); badSize.children.find(n=>n.id==='sink').height+=1;
|
|
assert(inspect(badSize,mapping).checks.some(c=>c.name==='collapsed_compact_size_exact'&&!c.passed));
|
|
const underHeader=structuredClone(graph); underHeader.children[0].children[0].y=2;
|
|
assert(inspect(underHeader,mapping).checks.some(c=>c.name==='child_inside_parent_body'&&!c.passed));
|
|
const reversed=structuredClone(graph); reversed.edges[0].sources=['sink'];
|
|
assert(inspect(reversed,mapping).checks.some(c=>c.name==='edge_orientation_and_endpoints'&&!c.passed));
|
|
const missing=structuredClone(row); missing.before.projected_edges[0].source_port='unknown';
|
|
assert.throws(()=>adapt(missing),/Missing projected semantic port/);
|
|
const undirected=structuredClone(row); undirected.before.projected_edges[0].oriented=false;
|
|
assert.throws(()=>adapt(undirected),/Unsupported undirected/);
|
|
const duplicate=structuredClone(row); duplicate.before.projected_nodes.push(duplicate.before.projected_nodes[0]);
|
|
assert.throws(()=>adapt(duplicate),/duplicate/);
|
|
console.log(JSON.stringify({checks:'passed',scope:'synthetic adapter mapping only; engine not invoked',
|
|
checks_exercised:['nested coordinate roundtrip','shared physical port reuse','collapsed size rejection','header intrusion rejection','edge reversal rejection','missing semantic port rejection','undirected rejection','duplicate node rejection'],
|
|
adapter_sha256:crypto.createHash('sha256').update(fs.readFileSync(require.resolve('./reference_probe.cjs'))).digest('hex')}));
|