'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')}));