SPB Git forge

spb/cancerindex

Public
37commits 1branches 0releases
2.9 MBsize
maindefault branch
10 days agolast push
TypeScript 97.2% SQL 1.5% CSS 0.6% JavaScript 0.5%
2.4 KB · 61 lines typescript
Raw Blame History
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