返回 oh-my-ppt
slide-size.test.ts
根目录 / tests / unit / slide-size / slide-size.test.ts
1 import { describe, expect, it } from 'vitest'
2 import {
3 assertPptxExportSupported,
4 isPptxExportSupported,
5 requireSessionSlideSize,
6 requireSlideSize,
7 requireSlideSizeFromHtml,
8 resolveSessionSlideSize,
9 resolveSlideSize,
10 resolveSlideSizeFromHtml,
11 trySessionSlideSize
12 } from '../../../src/shared/slide-size'
13
14 describe('slide size presets', () => {
15 it('keeps explicit new-session default only in the base resolver', () => {
16 expect(resolveSlideSize()).toMatchObject({
17 id: 'wide-16-9',
18 width: 1600,
19 height: 900
20 })
21 expect(() => resolveSessionSlideSize({ slide_size_id: 'invalid' })).toThrow(
22 'Invalid slide size id'
23 )
24 expect(trySessionSlideSize({ slide_size_id: 'invalid' })).toBeNull()
25 })
26
27 it('strict resolver rejects missing or invalid slide sizes', () => {
28 expect(() => requireSlideSize({})).toThrow('Invalid slide size id')
29 expect(() => requireSlideSize({ id: 'invalid' })).toThrow('Invalid slide size id')
30 expect(() => requireSlideSize({ id: 'vertical-9-16', width: -1 })).toThrow(
31 'Invalid slide size dimensions'
32 )
33 expect(() => requireSessionSlideSize({ slide_size_id: 'vertical-9-16' })).toThrow(
34 'Invalid slide size dimensions'
35 )
36 expect(() => requireSessionSlideSize({ slide_size_id: 'invalid' })).toThrow(
37 'Invalid slide size id'
38 )
39 expect(() => requireSlideSizeFromHtml('<html></html>')).toThrow('Invalid slide size id')
40 expect(() => resolveSlideSizeFromHtml('<html></html>')).toThrow('Invalid slide size id')
41 })
42
43 it.each([
44 ['vertical-9-16', 900, 1600],
45 ['standard-4-3', 1600, 1200],
46 ['square-1-1', 1200, 1200],
47 ['vertical-3-4', 1200, 1600],
48 ['xiaohongshu-note', 1242, 1660]
49 ] as const)('resolves %s to %sx%s', (id, width, height) => {
50 expect(resolveSlideSize({ id })).toMatchObject({ id, width, height })
51 })
52
53 it('preserves persisted dimensions and restores them from HTML metadata', () => {
54 expect(
55 resolveSessionSlideSize({
56 slideSizeId: 'vertical-3-4',
57 slideWidth: 1201,
58 slideHeight: 1601
59 })
60 ).toMatchObject({ id: 'vertical-3-4', width: 1201, height: 1601 })
61
62 expect(
63 resolveSlideSizeFromHtml(
64 '<script id="deck-metadata" type="application/json">{"slideSizeId":"vertical-9-16","width":900,"height":1600}</script>'
65 )
66 ).toMatchObject({ id: 'vertical-9-16', width: 900, height: 1600 })
67 expect(
68 requireSlideSizeFromHtml(
69 '<script id="deck-metadata" type="application/json">{"slideSizeId":"vertical-9-16","width":900,"height":1600}</script>'
70 )
71 ).toMatchObject({ id: 'vertical-9-16', width: 900, height: 1600 })
72 })
73
74 it('allows PPTX for 16:9 and 4:3 canvases only', () => {
75 expect(() => assertPptxExportSupported(resolveSlideSize())).not.toThrow()
76 expect(() =>
77 assertPptxExportSupported(resolveSlideSize({ id: 'standard-4-3' }))
78 ).not.toThrow()
79 expect(isPptxExportSupported(resolveSlideSize({ id: 'standard-4-3' }))).toBe(true)
80 expect(() =>
81 assertPptxExportSupported(resolveSlideSize({ id: 'vertical-9-16' }))
82 ).toThrow('当前 PPTX 导出仅支持 16:9 和 4:3')
83 })
84 })
85
85 lines TYPESCRIPT