furniture-3d-system-Wu/tests/lib/assembly-context-menu-state.test.ts

123 lines
3.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { describe, expect, it } from "@jest/globals"
import {
CLOSED_CONTEXT_SUBMENU_STATE,
DEFAULT_CONTEXT_SUBMENU_STATE,
reduceContextSubmenuState,
} from "@/lib/assembly-context-menu-state"
describe("assembly-context-menu-state", () => {
it("打开右键菜单时应回到默认首层并清空深层状态", () => {
const next = reduceContextSubmenuState(
{
activeRootSubmenu: "panel-submenu",
activePanelNestedSubmenu: "view-submenu",
activeViewNestedSubmenu: "view-explode-submenu",
},
{ type: "open-context-menu" }
)
expect(next).toEqual(DEFAULT_CONTEXT_SUBMENU_STATE)
})
it("应支持 root -> panel -> view -> explode 的层级流转", () => {
const afterPanel = reduceContextSubmenuState(DEFAULT_CONTEXT_SUBMENU_STATE, {
type: "click-item",
itemId: "panel-menu",
})
const afterView = reduceContextSubmenuState(afterPanel, {
type: "click-item",
itemId: "view-menu",
})
const afterExplode = reduceContextSubmenuState(afterView, {
type: "click-item",
itemId: "view-explode-menu",
})
expect(afterPanel).toEqual({
activeRootSubmenu: "panel-submenu",
activePanelNestedSubmenu: null,
activeViewNestedSubmenu: null,
})
expect(afterView).toEqual({
activeRootSubmenu: "panel-submenu",
activePanelNestedSubmenu: "view-submenu",
activeViewNestedSubmenu: null,
})
expect(afterExplode).toEqual({
activeRootSubmenu: "panel-submenu",
activePanelNestedSubmenu: "view-submenu",
activeViewNestedSubmenu: "view-explode-submenu",
})
})
it("仅进入 panel/view 层时不应提前展开 explode 子层", () => {
const afterPanelHover = reduceContextSubmenuState(DEFAULT_CONTEXT_SUBMENU_STATE, {
type: "hover-root",
submenu: "panel-submenu",
})
const afterViewHover = reduceContextSubmenuState(afterPanelHover, {
type: "hover-panel",
submenu: "view-submenu",
})
expect(afterViewHover.activeRootSubmenu).toBe("panel-submenu")
expect(afterViewHover.activePanelNestedSubmenu).toBe("view-submenu")
expect(afterViewHover.activeViewNestedSubmenu).toBeNull()
})
it("未进入 view 层时,点击 explode 入口不应越级展开", () => {
const afterPanel = reduceContextSubmenuState(DEFAULT_CONTEXT_SUBMENU_STATE, {
type: "click-item",
itemId: "panel-menu",
})
const afterExplodeClick = reduceContextSubmenuState(afterPanel, {
type: "click-item",
itemId: "view-explode-menu",
})
expect(afterExplodeClick).toEqual(afterPanel)
})
it("父层不在 view 时,hover-view 不应展开 explode 子层", () => {
const stateBefore = {
activeRootSubmenu: "panel-submenu" as const,
activePanelNestedSubmenu: "panel-advanced-submenu" as const,
activeViewNestedSubmenu: null,
}
const next = reduceContextSubmenuState(stateBefore, {
type: "hover-view",
submenu: "view-explode-submenu",
})
expect(next).toEqual(stateBefore)
})
it("离开 view 入口项时应收起 explode 子层但保留父层", () => {
const next = reduceContextSubmenuState(
{
activeRootSubmenu: "panel-submenu",
activePanelNestedSubmenu: "view-submenu",
activeViewNestedSubmenu: "view-explode-submenu",
},
{
type: "hover-view",
submenu: undefined,
}
)
expect(next).toEqual({
activeRootSubmenu: "panel-submenu",
activePanelNestedSubmenu: "view-submenu",
activeViewNestedSubmenu: null,
})
})
it("关闭菜单时应清空全部子菜单状态", () => {
const next = reduceContextSubmenuState(DEFAULT_CONTEXT_SUBMENU_STATE, {
type: "close-context-menu",
})
expect(next).toEqual(CLOSED_CONTEXT_SUBMENU_STATE)
})
})