Files
citygen/scripts/streets.test.ts
T

36 lines
2.1 KiB
TypeScript

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