86 行
3.0 KiB
TypeScript
86 行
3.0 KiB
TypeScript
import {
|
|
CardPosterLayoutEngine,
|
|
calculatePosterCanvasDimensions,
|
|
calculatePosterElementBoxes,
|
|
PosterLayoutOptions,
|
|
PosterElementBox,
|
|
} from '../../../src/modules/card/service/poster-layout';
|
|
|
|
describe('Point 54: 商务展会多语言电子邀请海报轻量级排版引擎', () => {
|
|
let engine: CardPosterLayoutEngine;
|
|
|
|
beforeEach(() => {
|
|
engine = new CardPosterLayoutEngine();
|
|
});
|
|
|
|
describe('1. calculatePosterCanvasDimensions (画布尺寸比例计算)', () => {
|
|
it('9:16 比例应计算为标准 1080x1920 尺寸', () => {
|
|
const dim = calculatePosterCanvasDimensions('story_9_16');
|
|
expect(dim.width).toBe(1080);
|
|
expect(dim.height).toBe(1920);
|
|
expect(dim.aspectRatio).toBe('9:16');
|
|
});
|
|
|
|
it('4:5 比例应计算为 1080x1350 尺寸', () => {
|
|
const dim = calculatePosterCanvasDimensions('feed_4_5');
|
|
expect(dim.width).toBe(1080);
|
|
expect(dim.height).toBe(1350);
|
|
expect(dim.aspectRatio).toBe('4:5');
|
|
});
|
|
});
|
|
|
|
describe('2. calculatePosterElementBoxes (多元素布局坐标与安全区排布)', () => {
|
|
const mockOptions: PosterLayoutOptions = {
|
|
aspectRatio: 'story_9_16',
|
|
cardName: 'Alex Zheng',
|
|
title: 'VP of International BD',
|
|
company: 'OmniCard Global AI Ltd.',
|
|
eventName: 'GITEX Global 2026 Dubai',
|
|
boothNumber: 'Hall 4, Stand B-28',
|
|
qrCodeSize: 240,
|
|
};
|
|
|
|
it('应计算包含头部标头、人物卡片、展会信息与底部二维码的精准坐标盒', () => {
|
|
const boxes = calculatePosterElementBoxes(mockOptions);
|
|
|
|
expect(boxes.avatarBox).toBeDefined();
|
|
expect(boxes.nameBox).toBeDefined();
|
|
expect(boxes.eventBox).toBeDefined();
|
|
expect(boxes.qrBox).toBeDefined();
|
|
|
|
// 二维码位于海报底部且居中
|
|
expect(boxes.qrBox.width).toBe(240);
|
|
expect(boxes.qrBox.height).toBe(240);
|
|
expect(boxes.qrBox.x).toBe((1080 - 240) / 2);
|
|
expect(boxes.qrBox.y).toBeGreaterThan(1300); // 靠近下半部分
|
|
});
|
|
|
|
it('文字过长时应自动计算截断与文本适应预警', () => {
|
|
const longOptions: PosterLayoutOptions = {
|
|
...mockOptions,
|
|
title: 'Very Long Title Exceeding Single Line Width That Needs Smart Handling In Print',
|
|
};
|
|
|
|
const boxes = calculatePosterElementBoxes(longOptions);
|
|
expect(boxes.titleBox.isMultiLine).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('3. CardPosterLayoutEngine 生成完整布局方案', () => {
|
|
it('应输出可直接供 Canvas 或 SVG 渲染的完整海报元数据清单', () => {
|
|
const manifest = engine.generateLayoutManifest({
|
|
aspectRatio: 'story_9_16',
|
|
cardName: 'Tariq Al-Mansoor',
|
|
title: 'Middle East Regional Director',
|
|
company: 'Saudi Digital Tech',
|
|
eventName: 'LEAP 2026 Riyadh',
|
|
boothNumber: 'Hall 2, C-15',
|
|
});
|
|
|
|
expect(manifest.canvas.width).toBe(1080);
|
|
expect(manifest.themeColor).toBe('#0B5CFF'); // 瑞士国际主义单一钴蓝主色
|
|
expect(manifest.elements.length).toBeGreaterThanOrEqual(4);
|
|
});
|
|
});
|
|
});
|