AnasSarkiz/muse-voice-remote
Muse Voice Remote — bare ESP32-S3R8, 155 TOP JLCPCB parts with real supplier CAD, native 3D assembly and GLB exports. Revised 17 mm case allocation; 0.30 mm via drill /0.45 mm pad. Checked prototype PCB; mechanical, RF and MUSE qualification pending.
- Version
- 1.3.2
- License
- unset
- Stars
- 0
tests/assembly.test.ts
import { test } from "node:test"
import assert from "node:assert/strict"
import { readFileSync } from "node:fs"
import { createHash } from "node:crypto"
const report=JSON.parse(readFileSync("docs/assembly-verification.json","utf8"))
const boardBytes=readFileSync("circuit.json")
const board=JSON.parse(boardBytes.toString())
const assembly=JSON.parse(readFileSync("dist/assembly/assembly.circuit.json","utf8"))
test("assembly preserves every verified board record and all imported supplier CAD",()=>{
assert.equal(report.board_source_sha256,createHash("sha256").update(boardBytes).digest("hex"))
assert.deepEqual(assembly.slice(0,board.length),board)
assert.equal(report.supplier_model_types,56)
assert.equal(report.supplier_obj_and_step_sha256_verified,112)
assert.equal(report.supplier_meshes_loaded,155)
assert.equal(report.cad_fallback_boxes,0)
assert.equal(report.cable_parts.length,8)
assert.equal(assembly.filter((e:{type:string})=>e.type==="pcb_component").length,155)
const identifiers=assembly.flatMap((e:Record<string,unknown>)=>Object.entries(e).filter(([k])=>k===`${e.type}_id`).map(([,v])=>v))
assert.equal(new Set(identifiers).size,identifiers.length,"No assembly IDs collide with checked board IDs")
})
test("reference-depth assembly preserves reserve and clears actual supplier triangles",()=>{
assert.equal(report.coordinate_system.pdf_front_to_pcb_centre,4.7)
assert.equal(report.coordinate_system.pcb_top_z,.5)
assert.equal(report.mechanical_revision.proposed_case_depth,16)
assert.equal(report.coordinate_system.actual_front_to_pcb_centre,4.2)
assert.equal(report.mechanical_revision.lcd_to_pcb_gap_mm,.3)
assert.ok(report.mesh_allocation_screens.every((s:{triangle_intersections:string[]})=>s.triangle_intersections.length===0))
assert.deepEqual(report.conservative_battery_intersections,["SW_PRIVACY"],"Known AABB false positive must be refined using actual triangles")
assert.deepEqual(report.conservative_supplier_pair_intersections,[])
assert.deepEqual(report.conservative_transducer_intersections,[])
assert.equal(report.mechanical_revision.battery_swelling_reserve_mm,.57)
assert.ok(Math.abs(report.mechanical_revision.expanded_battery_bottom_mm-8.73)<1e-9)
assert.equal(report.mechanical_parts.filter((p:{kind:string})=>p.kind==="case").length,2)
assert.equal(report.envelopes.length,7)
assert.ok(report.envelopes.every((e:{name:string})=>e.name.startsWith("ENV_")))
})
test("native 3D exports contain real geometry for every populated reference",()=>{
for(const [file,key] of [["MuseVoiceRemote-assembly.glb","assembly_glb"],["MuseVoiceRemote-populated-pcb.glb","pcb_glb"]]){
const bytes=readFileSync(`dist/assembly/${file}`)
assert.equal(bytes.readUInt32LE(0),0x46546c67)
assert.equal(bytes.readUInt32LE(4),2)
assert.equal(bytes.readUInt32LE(8),bytes.length)
assert.equal(createHash("sha256").update(bytes).digest("hex"),report.outputs[key].sha256)
const gltf=JSON.parse(bytes.subarray(20,20+bytes.readUInt32LE(12)).toString())
const names=new Set(gltf.nodes.map((n:{name:string})=>n.name))
if(key==="pcb_glb")for(const p of report.mechanical_parts)assert.ok(!names.has(p.name),`Mechanical body leaked into PCB export: ${p.name}`)
for(const p of report.cable_parts){
if(key==="pcb_glb")assert.ok(!names.has(p.name),`Cable leaked into PCB-only export: ${p.name}`)
else assert.ok(names.has(p.name),`Native cable mesh missing: ${p.name}`)
}
for(const e of report.transformed_supplier_bounds){
assert.ok(names.has(e.reference),`Missing mesh: ${e.reference}`)
const node=gltf.nodes.find((n:{name:string})=>n.name===e.reference)
const mesh=gltf.meshes[node.mesh]
assert.ok(mesh?.primitives.length,`No geometry: ${e.reference}`)
for(const primitive of mesh.primitives)
assert.ok(gltf.accessors[primitive.attributes.POSITION].count>0,`Empty geometry: ${e.reference}`)
}
}
})