import {groupByLayout} from './group_by_layout';
import {describe, test, expect} from 'vitest';
import type {LayerSpecification} from './types.g';

describe('group by layout', () => {
    test('group layers whose ref properties are identical', () => {
        const a = {
            'id': 'parent',
            'type': 'line'
        } as LayerSpecification;
        const b = {
            'id': 'child',
            'type': 'line'
        } as LayerSpecification;
        expect(groupByLayout([a, b], {})).toEqual([[a, b]]);
        expect(groupByLayout([a, b], {})[0][0]).toBe(a);
        expect(groupByLayout([a, b], {})[0][1]).toBe(b);
    });

    test('group does not group unrelated layers', () => {
        expect(groupByLayout([
            {
                'id': 'parent',
                'type': 'line'
            } as LayerSpecification,
            {
                'id': 'child',
                'type': 'fill'
            } as LayerSpecification
        ], {})).toEqual([
            [{
                'id': 'parent',
                'type': 'line'
            }], [{
                'id': 'child',
                'type': 'fill'
            }]
        ]);
    });

    test('group works even for differing layout key orders', () => {
        expect(groupByLayout([
            {
                'id': 'parent',
                'type': 'line',
                'layout': {'a': 1, 'b': 2}
            } as any as LayerSpecification,
            {
                'id': 'child',
                'type': 'line',
                'layout': {'b': 2, 'a': 1}
            } as any as LayerSpecification
        ], {})).toEqual([[
            {
                'id': 'parent',
                'type': 'line',
                'layout': {'a': 1, 'b': 2}
            },
            {
                'id': 'child',
                'type': 'line',
                'layout': {'b': 2, 'a': 1}
            }
        ]]);
    });
});
