import { describe, expect, it } from 'vitest';
import { parseXml } from '../src/parser/XmlParser';
import { parseShapeNode } from '../src/model/nodes/ShapeNode';
import { renderShape } from '../src/serializer/shapeSerializer';
import { minimalCtx } from './helpers';
const NS =
'xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" ' +
'xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"';
function shapeXml(spPrInner: string, styleInner = ''): string {
return `
${spPrInner}
${styleInner ? `${styleInner}` : ''}
`;
}
function customShapeXml(spPrInner: string): string {
return `
${spPrInner}
`;
}
describe('shapeSerializer · grpFill 继承父 group 填充', () => {
it('父 group 有 solidFill 时,子 shape 的 grpFill 继承父填充色', async () => {
const groupFillNode = parseXml(`
`);
const el = await renderShape(
parseShapeNode(parseXml(shapeXml(''))),
minimalCtx({ groupFillNode }),
0,
);
expect(el.fill).toEqual({ type: 'color', value: '#6124C3' });
});
it('没有父 group 填充时,grpFill 不回退到 fillRef', async () => {
const el = await renderShape(
parseShapeNode(
parseXml(
shapeXml('', ''),
),
),
minimalCtx({
theme: {
...minimalCtx().theme,
fillStyles: [parseXml(``)],
},
}),
0,
);
expect(el.fill).toEqual({ type: 'color', value: 'transparent' });
});
});
describe('shapeSerializer · filled customGeometry 不应被误判为线段', () => {
it('局部高度很小但有显式渐变填充的 customGeometry 保留面积填充', async () => {
const el = await renderShape(
parseShapeNode(
parseXml(
customShapeXml(`
`),
),
),
minimalCtx(),
0,
);
expect(el.fill.type).toBe('gradient');
});
});