import assert from 'node:assert/strict' import { readFileSync, existsSync } from 'node:fs' import { resolve, join } from 'node:path' const dir = resolve(process.argv[2] || 'tools/city-massing/city/cad-bim/instanced-coarse-pilot-v1') const report = JSON.parse(readFileSync(join(dir, 'manifest.json'), 'utf8')) const tree = JSON.parse(readFileSync(join(dir, 'tileset.json'), 'utf8')) assert.equal(report.candidateOnly, true) assert.equal(report.buildings, 13) assert.equal(tree.root.children.length, report.records.length) const ids = new Set(), files = new Set() let instances = 0, bytes = 0 for (const record of report.records) { assert.equal(record.buildingIds.length, new Set(record.buildingIds).size) for (const id of record.buildingIds) { assert.ok(!ids.has(id), `duplicate ${id}`); ids.add(id) } const path = join(dir, record.uri), glb = readFileSync(path) assert.ok(!files.has(record.uri)); files.add(record.uri); assert.equal(glb.length, record.bytes); bytes += glb.length assert.equal(glb.toString('ascii', 0, 4), 'glTF'); assert.equal(glb.readUInt32LE(4), 2); assert.equal(glb.readUInt32LE(8), glb.length) const jsonLength = glb.readUInt32LE(12), json = JSON.parse(glb.toString('utf8', 20, 20 + jsonLength)) assert.deepEqual(json.extensionsRequired, ['EXT_mesh_gpu_instancing']) assert.equal(json.nodes[0].children.length, json.nodes.length - 1) let extensionNodes = 0 for (const node of json.nodes.slice(1)) { const ext = node.extensions?.EXT_mesh_gpu_instancing if (!ext) continue extensionNodes++ const attrs = ext.attributes assert.ok(Number.isInteger(attrs.TRANSLATION) && Number.isInteger(attrs.ROTATION) && Number.isInteger(attrs.SCALE)) const count = json.accessors[attrs.TRANSLATION].count assert.equal(json.accessors[attrs.ROTATION].count, count) assert.equal(json.accessors[attrs.SCALE].count, count) assert.equal(node.extras.buildingIds.length, count) instances += count } assert.ok(extensionNodes > 0) assert.ok(json.extensionsUsed.includes('EXT_mesh_gpu_instancing')) assert.ok(json.meshes.length > 0) assert.ok(json.images === undefined) } assert.equal(ids.size, 13); assert.equal(instances, report.records.reduce((n, r) => n + r.instanceCount, 0)); assert.equal(bytes, report.records.reduce((n, r) => n + r.bytes, 0)) console.log(JSON.stringify({ passed: true, buildings: ids.size, files: files.size, instances, bytes, caveat: 'offline GLB structure only; no Cesium traversal or FPS validation' }))