import { iconToSVG } from '@iconify/utils/lib/svg/build';
import { fullIcon, iconDefaults } from '@iconify/utils/lib/icon';
import {
defaults,
mergeCustomisations,
} from '@iconify/utils/lib/customisations';
describe('Testing iconToSVG', () => {
it('Empty icon', () => {
const custom = { ...defaults };
const icon = { ...iconDefaults, body: '' };
const expected = {
attributes: {
width: '1em',
height: '1em',
preserveAspectRatio: 'xMidYMid meet',
viewBox: '0 0 16 16',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
it('Auto size, inline, body', () => {
const custom = mergeCustomisations(defaults, {
inline: true,
height: 'auto',
});
const icon = fullIcon({
body: '',
});
const expected = {
attributes: {
width: '16',
height: '16',
preserveAspectRatio: 'xMidYMid meet',
viewBox: '0 0 16 16',
},
body: '',
inline: true,
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
it('Auto size, inline, body', () => {
const custom = mergeCustomisations(defaults, {
inline: true,
height: 'auto',
});
const icon = fullIcon({
body: '',
});
const expected = {
attributes: {
width: '16',
height: '16',
preserveAspectRatio: 'xMidYMid meet',
viewBox: '0 0 16 16',
},
body: '',
inline: true,
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
it('Custom size, alignment', () => {
const custom = mergeCustomisations(defaults, {
height: 'auto',
hAlign: 'left',
slice: true,
});
const icon = fullIcon({
width: 20,
height: 16,
body: '',
});
const expected = {
attributes: {
width: '20',
height: '16',
preserveAspectRatio: 'xMinYMid slice',
viewBox: '0 0 20 16',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
it('Rotation, alignment', () => {
const custom = mergeCustomisations(defaults, {
height: '40px',
vAlign: 'bottom',
rotate: 1,
});
const icon = fullIcon({
width: 20,
height: 16,
body: '',
});
const expected = {
attributes: {
width: '32px',
height: '40px',
preserveAspectRatio: 'xMidYMax meet',
viewBox: '0 0 16 20',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
it('Negative rotation', () => {
const custom = mergeCustomisations(defaults, {
height: '40px',
rotate: -1,
});
const icon = fullIcon({
width: 20,
height: 16,
body: '',
});
const expected = {
attributes: {
width: '32px',
height: '40px',
preserveAspectRatio: 'xMidYMid meet',
viewBox: '0 0 16 20',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
it('Flip, alignment', () => {
const custom = mergeCustomisations(defaults, {
height: '32',
vAlign: 'top',
hAlign: 'right',
hFlip: true,
});
const icon = fullIcon({
width: 20,
height: 16,
body: '',
});
const expected = {
attributes: {
width: '40',
height: '32',
preserveAspectRatio: 'xMaxYMin meet',
viewBox: '0 0 20 16',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
it('Flip, rotation', () => {
const custom = mergeCustomisations(defaults, {
hFlip: true,
rotate: 1,
});
const icon = fullIcon({
width: 20,
height: 16,
body: '',
});
const expected = {
attributes: {
width: '0.8em',
height: '1em',
preserveAspectRatio: 'xMidYMid meet',
viewBox: '0 0 16 20',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
it('Flip icon that is rotated by default', () => {
const custom = mergeCustomisations(defaults, {
hFlip: true,
});
const icon = fullIcon({
width: 20,
height: 16,
body: '',
rotate: 1,
});
// Horizontally flipping icon that has 90 or 270 degrees rotation will result in vertical flip.
// Therefore result should be rotation + vertical flip to visually match horizontal flip on normal icon.
const expected = {
attributes: {
width: '0.8em',
height: '1em',
preserveAspectRatio: 'xMidYMid meet',
viewBox: '0 0 16 20',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
it('Flip and rotation canceling eachother', () => {
const custom = mergeCustomisations(defaults, {
width: '1em',
height: 'auto',
hFlip: true,
vFlip: true,
rotate: 2,
});
const icon = fullIcon({
width: 20,
height: 16,
body: '',
});
const expected = {
attributes: {
width: '1em',
height: '16',
preserveAspectRatio: 'xMidYMid meet',
viewBox: '0 0 20 16',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
it('Flip with real icon', () => {
const iconBody =
'';
const custom = mergeCustomisations(defaults, {});
const icon = fullIcon({
body: iconBody,
width: 128,
height: 128,
hFlip: true,
});
const expected = {
attributes: {
width: '1em',
height: '1em',
preserveAspectRatio: 'xMidYMid meet',
viewBox: '0 0 128 128',
},
body:
'' +
iconBody +
'',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
});