qibla/test-cjs.cjs
2026-03-08 12:44:01 -04:00

65 lines
1.9 KiB
JavaScript

const { describe, it } = require("node:test");
const assert = require("node:assert/strict");
const {
qiblaAngle,
compassDir,
compassName,
qiblaGreatCircle,
distanceKm,
KAABA_LAT,
KAABA_LNG,
EARTH_RADIUS_KM,
} = require("./dist/index.cjs");
describe("CJS: qiblaAngle", () => {
it("NYC bearing is ~58° NE", () => {
const angle = qiblaAngle(40.7128, -74.006);
assert.ok(angle > 50 && angle < 70);
});
it("London bearing is ~119° SE", () => {
const angle = qiblaAngle(51.5074, -0.1278);
assert.ok(angle > 110 && angle < 130);
});
it("throws for invalid latitude", () => {
assert.throws(() => qiblaAngle(91, 0), RangeError);
});
});
describe("CJS: compassDir", () => {
it("N for 0°", () => assert.strictEqual(compassDir(0), "N"));
it("NE for 45°", () => assert.strictEqual(compassDir(45), "NE"));
it("S for 180°", () => assert.strictEqual(compassDir(180), "S"));
});
describe("CJS: compassName", () => {
it("North for 0°", () => assert.strictEqual(compassName(0), "North"));
it("Southeast for 135°", () =>
assert.strictEqual(compassName(135), "Southeast"));
});
describe("CJS: qiblaGreatCircle", () => {
it("returns 121 points by default", () => {
assert.strictEqual(qiblaGreatCircle(40.7128, -74.006).length, 121);
});
it("single point at Ka'bah", () => {
assert.strictEqual(qiblaGreatCircle(KAABA_LAT, KAABA_LNG).length, 1);
});
});
describe("CJS: distanceKm", () => {
it("NYC to Ka'bah ~9600 km", () => {
const km = distanceKm(40.7128, -74.006, KAABA_LAT, KAABA_LNG);
assert.ok(km > 9000 && km < 10500);
});
it("symmetric", () => {
const d1 = distanceKm(40, -74, KAABA_LAT, KAABA_LNG);
const d2 = distanceKm(KAABA_LAT, KAABA_LNG, 40, -74);
assert.ok(Math.abs(d1 - d2) < 0.001);
});
});
describe("CJS: constants", () => {
it("EARTH_RADIUS_KM is 6371", () => {
assert.strictEqual(EARTH_RADIUS_KM, 6371);
});
});