| 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 |