rushabhcodes/fidget-counter

A tscircuit package created by rushabhcodes.

Version
1.0.31
License
unset
Stars
0

validation/routing-compatibility.test.mjs

import {describe,it as test} from "node:test"
import assert from "node:assert/strict"
import paths from "../routed-paths.json"
import contract from "../routing-contract.json"
import {routeBoard} from "../routing"

const input=()=>{
 const value=structuredClone(contract.geometry)
 value.connections=JSON.parse(paths.expectedPhaseSignature).map((c)=>{
  const approved=contract.geometry.connections.find(x=>x.name===c.name)
  return {name:c.name,width:approved.width,nominalTraceWidth:approved.nominalTraceWidth,pointsToConnect:c.points}
 })
 for(const via of contract.auxiliaryVias){
  const o=value.obstacles.find((o)=>o.shape==="circle"&&o.center.x===via.center.x&&o.center.y===via.center.y)
  o.connectedTo.push(...via.ports)
 }
 return value
}
const output=async(value)=>{
 const router=await routeBoard(value)
 let traces=[]
 router.on("complete",event=>{traces=event.traces})
 router.start()
 return traces
}
const portRefs=(value)=>{
 if(typeof value==="string")return value.startsWith("pcb_port_")?[value]:[]
 if(Array.isArray(value))return value.flatMap(portRefs)
 if(value&&typeof value==="object")return Object.values(value).flatMap(portRefs)
 return []
}

describe("prescribed routing across compiler versions",()=>{
 test("retains the existing routes for the validated terminal IDs",async()=>{
  assert.deepEqual(await output(input()),paths.traces)
 })
 test("renumbering and ordering preserve all copper geometry and update every port reference",async()=>{
  const value=input()
  for(const c of value.connections) {
   c.pointsToConnect.reverse()
   for(const p of c.pointsToConnect)for(const key of ["pointId","pcb_port_id"])
    p[key]=`pcb_port_${Number(p[key].replace("pcb_port_",""))+1000}`
  }
  value.connections.reverse()
  const result=await output(value)
  assert.deepEqual(result.map(t=>t.route.map(({start_pcb_port_id,end_pcb_port_id,...geometry})=>geometry)),
   paths.traces.map(t=>t.route.map(({start_pcb_port_id,end_pcb_port_id,...geometry})=>geometry)))
  assert.deepEqual(portRefs(result),portRefs(paths.traces).map(id=>contract.auxiliaryVias.some(v=>v.ports.includes(id))?id:`pcb_port_${Number(id.replace("pcb_port_",""))+1000}`))
 })
 test("rejects moved pads",async()=>{
  const value=input();value.connections[0].pointsToConnect[0].x+=.01
  await assert.rejects(output(value),/Routing terminals or copper changed/)
 })
 test("rejects changed net membership even when all physical points still exist",async()=>{
  const value=input(),a=value.connections[0].pointsToConnect,b=value.connections[1].pointsToConnect
  ;[a[0],b[0]]=[b[0],a[0]]
  await assert.rejects(output(value),/Routing terminals or copper changed/)
 })
 test("rejects changed fixed copper width",async()=>{
  const value=input()
  const fixed=value.obstacles.find(o=>!o.componentId&&o.connectedTo.some(id=>id.startsWith('source_trace_')))
  assert(fixed,'Fixed critical routes must appear as copper obstacles')
  fixed.width+=.01
  await assert.rejects(output(value),/copper changed/)
 })
 test("rejects an unexpected copper trace",async()=>{
  const value=input();value.traces.push({type:'pcb_trace',connectsTo:[],route:[{route_type:'wire',x:0,y:0,layer:'top',width:.11}]})
  await assert.rejects(output(value),/copper changed/)
 })
 test("rejects changed layers",async()=>{
  const value=input();value.connections[0].pointsToConnect[0].layer="bottom"
  await assert.rejects(output(value),/copper changed/)
 })
 test("rejects moved obstacles",async()=>{
  const value=input();value.obstacles[0].center.x+=.01
  await assert.rejects(output(value),/copper changed/)
 })
 test("rejects unidentifiable through-via port renumbering",async()=>{
  const value=input()
  for(const o of value.obstacles)o.connectedTo=o.connectedTo.map((id)=>id===contract.auxiliaryVias[0].ports[0]?"pcb_port_999":id)
  await assert.rejects(output(value),/through-via terminals changed/)
 })
})