spb/cancerindex
Public
TypeScript 97.2%
SQL 1.5%
CSS 0.6%
JavaScript 0.5%
1import { createRequire } from 'node:module';2import { describe, expect, it } from 'vitest';3import { MAP_HEIGHT, MAP_WIDTH, buildWorldGeometry, fitProjection } from '@/lib/map-geo';45const require = createRequire(import.meta.url);6// eslint-disable-next-line @typescript-eslint/no-explicit-any7const atlas = require('world-atlas/countries-110m.json') as any;89describe('fitProjection (Equal Earth)', () => {10 it('maps the origin to the centre of the viewport and keeps the sphere inside it', () => {11 const p = fitProjection({ type: 'Sphere' });12 const c = p([0, 0])!;13 expect(c[0]).toBeCloseTo(MAP_WIDTH / 2, 0);14 expect(c[1]).toBeCloseTo(MAP_HEIGHT / 2, 0);15 for (const [lng, lat] of [16 [-180, 0],17 [180, 0],18 [0, 90],19 [0, -90],20 [-73.6, 45.5],21 ] as Array<[number, number]>) {22 const q = p([lng, lat])!;23 expect(q[0]).toBeGreaterThanOrEqual(0);24 expect(q[0]).toBeLessThanOrEqual(MAP_WIDTH);25 expect(q[1]).toBeGreaterThanOrEqual(0);26 expect(q[1]).toBeLessThanOrEqual(MAP_HEIGHT);27 }28 // west is left, north is up29 const montreal = p([-73.6, 45.5])!;30 const tokyo = p([139.7, 35.7])!;31 const capeTown = p([18.4, -33.9])!;32 expect(montreal[0]).toBeLessThan(tokyo[0]);33 expect(montreal[1]).toBeLessThan(capeTown[1]);34 });35});3637describe('buildWorldGeometry', () => {38 const geo = buildWorldGeometry(atlas);39 it('produces one path per country with ISO3 keys, without Antarctica', () => {40 expect(geo.countries.length).toBeGreaterThan(170);41 const iso = geo.countries.map((c) => c.iso3);42 expect(iso).toContain('USA');43 expect(iso).toContain('FRA');44 expect(iso).toContain('KOR');45 expect(iso).toContain('XKX');46 expect(iso).not.toContain('ATA');47 expect(geo.countries.filter((c) => c.iso3 === null).map((c) => c.name).sort()).toEqual(['N. Cyprus', 'Somaliland']);48 for (const c of geo.countries) expect(c.d.length).toBeGreaterThan(5);49 expect(geo.sphere.startsWith('M')).toBe(true);50 });51 it('projects lng/lat to viewBox pixels and rejects invalid coordinates', () => {52 const p = geo.project(-73.6, 45.5)!;53 expect(p[0]).toBeGreaterThan(0);54 expect(p[0]).toBeLessThan(MAP_WIDTH / 2);55 expect(p[1]).toBeLessThan(MAP_HEIGHT / 2);56 expect(geo.project(NaN, 10)).toBeNull();57 expect(geo.project(10, 91)).toBeNull();58 expect(geo.project(181, 0)).toBeNull();59 });60});61