This commit is contained in:
2026-05-11 20:27:41 +08:00
parent e30b733b17
commit 481a27fc53
60 changed files with 6357 additions and 1100 deletions

View File

@@ -4,6 +4,9 @@ import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import { useEffect } from 'react';
import { afterEach, expect, test, vi } from 'vitest';
import type {
Match3DGeneratedItemAsset,
} from '../../../packages/shared/src/contracts/match3dWorks';
import type {
Match3DClickItemRequest,
Match3DRunSnapshot,
@@ -21,7 +24,9 @@ import {
MATCH3D_TRAY_MODEL_MIN_RELATIVE_SIZE,
MATCH3D_TRAY_MODEL_TARGET_SIZE,
applyMatch3DRendererCanvasLayout,
buildMatch3DGeneratedAssetTypeMap,
buildMatch3DPhysicsEntrySignature,
buildMatch3DTrayModelSourceMap,
createMatch3DCannonShape,
createMatch3DThreeGeometry,
measureMatch3DItemPreviewDimension,
@@ -222,6 +227,62 @@ test('3D 物理条目签名随 run 和视觉资源变化,避免旧模型复用
);
});
test('生成模型按运行态类型编号映射,并兼容仅 modelObjectKey 的历史素材', () => {
const run = startLocalMatch3DRun(3);
run.items = run.items.slice(0, 3).map((item, index) => ({
...item,
itemInstanceId: `generated-model-${index}`,
itemTypeId:
index === 0
? 'match3d-type-02'
: index === 1
? 'match3d-type-01'
: 'match3d-type-03',
visualKey: 'block-red-2x4',
}));
const generatedItemAssets: Match3DGeneratedItemAsset[] = [
{
itemId: 'match3d-item-1',
itemName: '草莓',
status: 'model_ready',
modelSrc: null,
modelObjectKey:
'generated-match3d-assets/session/profile/items/match3d-item-1-item/model/model.glb',
},
{
itemId: 'match3d-item-2',
itemName: '苹果',
status: 'model_ready',
modelSrc:
'/generated-match3d-assets/session/profile/items/match3d-item-2-item/model/model.glb',
modelObjectKey: null,
},
];
const boardMap = buildMatch3DGeneratedAssetTypeMap(
run,
generatedItemAssets,
);
const trayMap = buildMatch3DTrayModelSourceMap(
run.items,
[],
generatedItemAssets,
);
expect(boardMap.get('match3d-type-01')?.modelSrc).toBe(
generatedItemAssets[0]!.modelObjectKey,
);
expect(boardMap.get('match3d-type-02')?.modelSrc).toBe(
generatedItemAssets[1]!.modelSrc,
);
expect(trayMap.get('match3d-type-01')).toBe(
generatedItemAssets[0]!.modelObjectKey,
);
expect(trayMap.get('match3d-type-02')).toBe(
generatedItemAssets[1]!.modelSrc,
);
});
test('本地试玩按消除次数生成类型并在 25 类封顶', () => {
const smallRun = startLocalMatch3DRun(12);
const largeRun = startLocalMatch3DRun(100);