macos-web/tests/cases/02-wm-close.test.ts
2026-07-23 15:16:57 +08:00

107 lines
3.3 KiB
TypeScript

/**
* 02-wm-close — 窗口关闭与重入保护
*
* 使用 vitest 原汁原味的 vi.fn() + spy 模式。
* 测试 WM composable 的关闭逻辑、confirmClose 防重入机制。
*/
import { describe, it, expect, vi } from 'vitest'
import { wm } from '../../src/composables/useWM'
describe('02-wm-close — 窗口管理', () => {
// ==================== 初始状态 ====================
describe('初始状态', () => {
it('初始无窗口', () => {
expect(wm.windows).toHaveLength(0)
})
it('activeWin 初始为 null', () => {
expect(wm.activeWin.value).toBeNull()
})
it('windowsForApp 返回空', () => {
expect(wm.windowsForApp('finder')).toHaveLength(0)
})
it('anyVisible 返回 false', () => {
expect(wm.anyVisible()).toBe(false)
})
it('usableRect 返回有效区域', () => {
const r = wm.usableRect()
expect(r.w).toBeGreaterThan(400)
expect(r.h).toBeGreaterThan(300)
expect(r.y).toBe(30)
})
})
// ==================== close 操作 ====================
describe('close', () => {
it('close 不存在的窗口返回 alreadyClosed', async () => {
const result = await wm.close({ windows: [] } as any)
expect(result).toBe('alreadyClosed')
})
})
// ==================== confirmClose 机制 ====================
describe('confirmClose', () => {
it('app 可注入确认回调', () => {
const doneCb = vi.fn()
const cancelCb = vi.fn()
const mockWin: any = {
id: 'test', appId: 't', title: '', icon: '',
rect: { x: 0, y: 0, w: 0, h: 0 },
prevRect: null, minW: 200, minH: 120, state: 'normal',
el: null, body: null, titleEl: null, timers: [],
confirmClose: (done: () => void, cancel: () => void) => {
cancel()
},
}
expect(typeof mockWin.confirmClose).toBe('function')
mockWin.confirmClose(doneCb, cancelCb)
expect(cancelCb).toHaveBeenCalledTimes(1)
expect(doneCb).not.toHaveBeenCalled()
})
})
// ==================== closePromise 防重入 ====================
describe('closePromise 防重入', () => {
it('同一窗口 closePromise 相同', () => {
const mock: any = {
id: 'test', appId: 't', title: '', icon: '',
rect: { x: 0, y: 0, w: 0, h: 0 },
prevRect: null, minW: 200, minH: 120, state: 'normal',
el: {
remove: vi.fn(),
classList: { remove: vi.fn(), add: vi.fn() },
},
body: null, titleEl: null, timers: [],
closePromise: null,
}
mock.closePromise = Promise.resolve('closed')
const p1 = mock.closePromise
const p2 = mock.closePromise
expect(p1).toBe(p2)
})
})
// ==================== 方法存在性 ====================
describe('方法完整性', () => {
it('所有 WM 核心方法存在', () => {
expect(typeof wm.setTitle).toBe('function')
expect(typeof wm.minimize).toBe('function')
expect(typeof wm.restore).toBe('function')
expect(typeof wm.toggleZoom).toBe('function')
expect(typeof wm.toggleFullscreen).toBe('function')
expect(typeof wm.focus).toBe('function')
expect(typeof wm.close).toBe('function')
})
it('clampAll 不抛错', () => {
expect(() => wm.clampAll()).not.toThrow()
})
})
})