65 lines
1.7 KiB
TypeScript
65 lines
1.7 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
||
|
||
import {
|
||
cardinalDirection,
|
||
isWindDirection,
|
||
modelColor,
|
||
modelMean,
|
||
sanitizeList,
|
||
validDirectionValues
|
||
} from './comparison';
|
||
|
||
import type { ModelSeriesData } from '$lib/services/weather';
|
||
|
||
const models: ModelSeriesData[] = [
|
||
{
|
||
modelId: 'model-a',
|
||
resolvedModelId: 'model-a',
|
||
variables: {
|
||
precipitation: [1, Number.NaN, 3],
|
||
precipitation_probability: [80, 90, 100]
|
||
}
|
||
},
|
||
{
|
||
modelId: 'model-b',
|
||
resolvedModelId: 'model-b',
|
||
variables: { precipitation: [3, Number.NaN, 5] }
|
||
}
|
||
];
|
||
|
||
describe('multimodel comparison helpers', () => {
|
||
it('averages only the exact scalar variable and preserves missing values', () => {
|
||
expect(modelMean(models, 'precipitation', 3)).toEqual([2, null, 4]);
|
||
});
|
||
|
||
it('validates and deduplicates shared URL selections', () => {
|
||
const allowed = new Set(['a', 'b']);
|
||
expect(sanitizeList(['a', 'unknown', 'a', 'b'], allowed)).toEqual(['a', 'b']);
|
||
expect(sanitizeList(['unknown'], allowed)).toBeNull();
|
||
});
|
||
|
||
it('treats every wind direction height as a direction series', () => {
|
||
expect(isWindDirection('wind_direction_10m')).toBe(true);
|
||
expect(isWindDirection('wind_direction_180m')).toBe(true);
|
||
expect(isWindDirection('wind_speed_10m')).toBe(false);
|
||
});
|
||
|
||
it('drops direction values outside the fixed 0–360 degree domain', () => {
|
||
expect(validDirectionValues([-1, 0, 90, 360, 361, Number.NaN])).toEqual([
|
||
null,
|
||
0,
|
||
90,
|
||
360,
|
||
null,
|
||
null
|
||
]);
|
||
expect(cardinalDirection(0)).toBe('N');
|
||
expect(cardinalDirection(270)).toBe('W');
|
||
});
|
||
|
||
it('assigns deterministic model colors', () => {
|
||
expect(modelColor('ecmwf_ifs')).toBe(modelColor('ecmwf_ifs'));
|
||
expect(modelColor('ecmwf_ifs')).not.toBe(modelColor('gfs_global'));
|
||
});
|
||
});
|