import { test, assert } from './test-assert.js'; import { AABB, QTNode } from './Geometry.js'; test('AABB correctly contains/excludes points', () => { const box = new AABB(0, 0, 1, 1); // interior assert.ok(box.contains({ x: 0.5, y: 0.5 })); // upper left assert.ok(!box.contains({ x: -1, y: -1 })); // above assert.ok(!box.contains({ x: 0.5, y: -1})); // upper right assert.ok(!box.contains({ x: 2, y: -1 })); // left assert.ok(!box.contains({ x: -1, y: 0.5 })); // right assert.ok(!box.contains({ x: 2, y: 0.5})); // lower left assert.ok(!box.contains({ x: -1, y: 2 })); // below assert.ok(!box.contains({ x: 0.5, y: 2})); // lower right assert.ok(!box.contains({ x: 2, y: 2 })); }); test('AABB correctly intersects other AABBs', () => { const box = new AABB(1, 1, 4, 4); // interior assert.ok(box.intersects(new AABB(2, 2, 2, 2,))); // upper left assert.ok(box.intersects(new AABB(0, 0, 4, 4))); assert.ok(!box.intersects(new AABB(0, 0, 0.5, 0.5))); // above assert.ok(box.intersects(new AABB(2, 0, 2, 2))); assert.ok(!box.intersects(new AABB(2, 0, 2, 0.5))); // upper right assert.ok(box.intersects(new AABB(2, 0, 4, 2))); assert.ok(!box.intersects(new AABB(6, 0, 4, 2))); // left assert.ok(box.intersects(new AABB(0, 2, 2, 2))); assert.ok(!box.intersects(new AABB(0, 2, 0.5, 2))); // right assert.ok(box.intersects(new AABB(4, 2, 2, 2))); assert.ok(!box.intersects(new AABB(6, 2, 2, 2))); // lower left assert.ok(box.intersects(new AABB(0, 4, 4, 4))); assert.ok(!box.intersects(new AABB(0, 6, 0.5, 0.5))); // below assert.ok(box.intersects(new AABB(2, 4, 2, 2))); assert.ok(!box.intersects(new AABB(2, 6, 2, 0.5))); // lower right assert.ok(box.intersects(new AABB(2, 4, 4, 2))); assert.ok(!box.intersects(new AABB(6, 6, 4, 2))); }); test('AABB correctly handles points at the edges', () => { const box = new AABB(0, 0, 1, 1); assert.ok(box.contains({ x: 0, y: 0 })); assert.ok(box.contains({ x: 0.5, y: 0 })); assert.ok(box.contains({ x: 0, y: 0.5 })); // bad corners assert.ok(!box.contains({ x: 1, y: 0 })); assert.ok(!box.contains({ x: 0, y: 1 })); assert.ok(!box.contains({ x: 1, y: 1 })); // bad edges assert.ok(!box.contains({ x: 1, y: 0.5 })); assert.ok(!box.contains({ x: 0.5, y: 1 })); }); test('QTNode correctly inserts points', () => { const node = new QTNode(0, 0, 1, 1); assert.equal(node.type.toString(), 'QTNode.Empty'); let result = node.insert({ x: -1, y: -1 }); // out of range, should not insert assert.ok(!result); assert.equal(node.type.toString(), 'QTNode.Empty'); result = node.insert({ x: 0.5, y: 0.5 }); // in range assert.ok(result); assert.equal(node.type.toString(), 'QTNode.Leaf'); assert.deepEqual(node.point, { x: 0.5, y: 0.5 }); }); test('QTNode correctly subdivides', () => { const node = new QTNode(0, 0, 2, 2); assert.ok(!node.subnode); node.subdivide(); assert.equal(node.subnode.length, 4); assert.deepEqual(node.subnode[0], new QTNode(0, 0, 1, 1)); assert.deepEqual(node.subnode[1], new QTNode(1, 0, 1, 1)); assert.deepEqual(node.subnode[2], new QTNode(0, 1, 1, 1)); assert.deepEqual(node.subnode[3], new QTNode(1, 1, 1, 1)); }); test('QTNode correctly inserts multiple points', () => { const node = new QTNode(0, 0, 2, 2); const p0 = { x: 1, y: 1 }; const p1 = { x: 0.5, y: 0.5 }; const oob = { x: 10, y: 15 }; assert.ok(node.insert(p0)); assert.ok(node.insert(p1)); assert.ok(!node.insert(oob)); assert.equal(node.type.toString(), 'QTNode.Branch'); assert.equal(node.subnode[0].type.toString(), 'QTNode.Leaf'); assert.deepEqual(node.subnode[0].point, p1); assert.equal(node.subnode[1].type.toString(), 'QTNode.Empty'); assert.equal(node.subnode[2].type.toString(), 'QTNode.Empty'); assert.equal(node.subnode[3].type.toString(), 'QTNode.Leaf'); assert.deepEqual(node.subnode[3].point, p0); });