32 lines
1.5 KiB
TypeScript
32 lines
1.5 KiB
TypeScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { Mesh, Points, Vector3 } from 'three';
|
|
import { createNightSky } from '../src/scene/nightSky.ts';
|
|
import { observer } from '../src/config/observer.ts';
|
|
|
|
test('decorative stars stay fixed across reloads and disappear in daylight', () => {
|
|
const a = createNightSky(new Vector3()), b = createNightSky(new Vector3());
|
|
const stars = a.group.children.find(child => child instanceof Points)! as Points;
|
|
const other = b.group.children.find(child => child instanceof Points)! as Points;
|
|
assert.deepEqual(stars.geometry.attributes.position.array, other.geometry.attributes.position.array);
|
|
const date = new Date('2026-10-30T23:00:00+09:00');
|
|
a.update(date, observer, -20);
|
|
assert.equal(stars.visible, true);
|
|
a.update(date, observer, 10);
|
|
assert.equal(stars.visible, false);
|
|
a.dispose(); b.dispose();
|
|
});
|
|
|
|
test('moon moves from below the horizon into the northeastern night sky', () => {
|
|
const eye = new Vector3(100, 500, -100);
|
|
const sky = createNightSky(eye);
|
|
const moon = sky.group.children.find(child => child instanceof Mesh)! as Mesh;
|
|
sky.update(new Date('2026-10-30T18:00:00+09:00'), observer, -10);
|
|
assert.ok(moon.position.y < eye.y);
|
|
sky.update(new Date('2026-10-30T23:00:00+09:00'), observer, -30);
|
|
const direction = moon.position.clone().sub(eye).normalize();
|
|
assert.ok(direction.x > 0 && direction.z < 0 && direction.y > 0);
|
|
assert.ok(Math.abs(Math.asin(direction.y) * 180 / Math.PI - 21) < 0.2);
|
|
sky.dispose();
|
|
});
|