36 lines
2.1 KiB
TypeScript
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);
|
|
});
|