import { describe, expect, it } from 'vitest'; import { ASSET_TYPE_LABELS, ASSET_TYPES, type AssetType } from '../../src/core/model/AssetTypes'; import { ASSET_CATEGORIES, ASSET_GROUPS } from '../../src/editor/panels/assetGroups'; import { assetMenuCategories } from '../../src/editor/panels/assetMenu'; const labels = (types: AssetType[]) => types.map((type) => ASSET_TYPE_LABELS[type]); describe('assetMenuCategories', () => { it('offers every type exactly once', () => { const flat = assetMenuCategories().flatMap((entry) => entry.types); expect([...flat].sort()).toEqual([...ASSET_TYPES].sort()); }); it('files every type under the category the asset panel shows it in, in the panel order', () => { const menu = assetMenuCategories(); expect(menu.map((entry) => entry.category)).toEqual([...ASSET_CATEGORIES]); for (const { category, types } of menu) expect(types.every((type) => ASSET_GROUPS[type].category === category)).toBe(true); }); it('sorts each category by label, not by declaration order', () => { for (const { types } of assetMenuCategories()) expect(labels(types)).toEqual([...labels(types)].sort()); // Declaration order has Camera after Scene; by label it comes first. expect(assetMenuCategories()[0]!.types.slice(0, 2)).toEqual(['camera', 'container']); }); it('leaves ASSET_TYPES alone – it is also the serialisation order', () => { assetMenuCategories(); expect(ASSET_TYPES[0]).toBe('scene'); }); });