import test from 'node:test'; import assert from 'node:assert/strict'; import { generateWorldSync } from '../src/gen/generate'; import { attachInteractions, streetObject } from '../src/gen/objects'; import { tileWorld, assembleWorld } from '../src/city/format'; import type { OsmElement } from '../src/osm/overpass'; test('indoor and outdoor objects share rotated interaction slots', () => { const bench = streetObject('bench','bench',[10,20],Math.PI/2); assert.deepEqual(bench.interactions?.find(s=>s.action==='sit'),{id:'bench:sit',action:'sit',capacity:3,pos:[9.25,20]}); const bed = {...bench,id:'bed',kind:'bed_double',tags:['sleep:2'],w:1.6,d:2,rot:0}; attachInteractions(bed); assert.equal(bed.interactions?.[0].capacity,2); assert.equal(bed.interactions?.[0].action,'sleep'); }); test('generation produces stable street furniture and actual entrance references', () => { const elements: OsmElement[] = [ {type:'way',id:1,tags:{highway:'residential'},geometry:[{lat:47,lon:9},{lat:47,lon:9.005}]}, {type:'way',id:2,tags:{building:'house','building:levels':'1'},geometry:[{lat:47.0002,lon:9.001},{lat:47.0002,lon:9.0012},{lat:47.0004,lon:9.0012},{lat:47.0004,lon:9.001},{lat:47.0002,lon:9.001}]}, {type:'node',id:3,tags:{highway:'bus_stop'},lat:47.0001,lon:9.003}, {type:'node',id:4,tags:{highway:'crossing'},lat:47,lon:9.004}, ]; const a = generateWorldSync(elements,[46.999,8.999,47.002,9.006],'Test',1); const b = generateWorldSync(elements,[46.999,8.999,47.002,9.006],'Test',1); assert.deepEqual(a.props,b.props); assert.ok(a.props.some(p=>p.kind==='bench')); assert.ok(a.props.some(p=>p.kind==='lamp')); assert.ok(a.props.some(p=>p.kind==='bus_stop')); assert.ok(a.props.some(p=>p.kind==='crossing')); const entrance = a.props.find(p=>p.kind==='entrance'); assert.ok(entrance); assert.ok(a.buildings.some(building=>building.id===entrance.target?.buildingId && building.floors.some(f=>f.doors.some(d=>d.id===entrance.target?.doorId)))); const tiled = tileWorld(a); assert.equal(assembleWorld(tiled.manifest,tiled.tiles.values()).props.length,a.props.length); });