123 lines
3.8 KiB
TypeScript
123 lines
3.8 KiB
TypeScript
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)
|
||
})
|
||
})
|