Files
sunrise/tests/night-sky.test.ts

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