import { describe, expect, it } from 'vitest'; import { createResourceCanvasPageCategorySignature, createResourceCanvasPrefetchScopeKey, } from '../src/view/project-development/resourceCanvasController'; describe('resource canvas page wheel controller', () => { it('invalidates page categories for same-count category changes without reacting to resource order', () => { const original = [{ category: 'document' }, { category: 'scene' }]; const reordered = [...original].reverse(); const changed = [{ category: 'document' }, { category: 'audio' }]; expect(createResourceCanvasPageCategorySignature(reordered)).toBe( createResourceCanvasPageCategorySignature(original), ); expect(createResourceCanvasPageCategorySignature(changed)).not.toBe( createResourceCanvasPageCategorySignature(original), ); }); }); describe('资源画布预取作用域标识', () => { /** * 标识必须由**视图身份**算出:喂给预览 Hook 的资源集合是全量投影,换栏目一字不改, * 因此"资源 id 签名"做不到区分视图 —— 用它当标识会让取消上一视图排队预取永不触发。 */ it('changes for every view identity change that a resource-set signature cannot see', () => { const childScene = createResourceCanvasPrefetchScopeKey({ view: 'child', target: 'scene', mode: 'dependency', }); // 换栏目:同一批全量资源下的两个不同视图,标识必须不同。 expect( createResourceCanvasPrefetchScopeKey({ view: 'child', target: 'character', mode: 'dependency', }), ).not.toBe(childScene); // 换视图:栏目页 → 总览。 expect( createResourceCanvasPrefetchScopeKey({ view: 'main', target: null, mode: 'dependency', }), ).not.toBe(childScene); // 同一栏目内换排序模式:卡片整体重排,对用户就是换了一次视图。 expect( createResourceCanvasPrefetchScopeKey({ view: 'child', target: 'scene', mode: 'type', }), ).not.toBe(childScene); }); it('stays stable for an unchanged view so unrelated renders never cancel prefetches', () => { expect( createResourceCanvasPrefetchScopeKey({ view: 'child', target: 'scene', mode: 'dependency', }), ).toBe( createResourceCanvasPrefetchScopeKey({ view: 'child', target: 'scene', mode: 'dependency', }), ); }); });