import {describe, test, expect, vi, afterEach} from 'vitest';
import {GlobeProjection} from './globe_projection.ts';
import {EvaluationParameters} from '../../style/evaluation_parameters.ts';
import type {TransitionParameters} from '../../style/properties.ts';

describe('GlobeProjection runtime error logging', () => {
    afterEach(() => {
        vi.restoreAllMocks();
    });

    test('warns with the projection property location when an expression errors at runtime', () => {
        const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});

        const projection = new GlobeProjection(undefined, {});
        // global-state defeats constant-folding, so this fails at evaluation time (not parse time).
        projection.setProjection({type: ['string', ['global-state', 'missing']]} as any);
        projection.updateTransitions({transition: false} as any as TransitionParameters);
        projection.recalculate(new EvaluationParameters(16));

        expect(warn).toHaveBeenCalledTimes(1);
        expect(warn.mock.calls[0][0]).toBe('projection.type: Expected value to be of type string, but found null instead. Falling back to mercator.');
    });
});
