import type { IconifyIconBuildResult } from '../lib/svg/build';
import { iconToSVG } from '../lib/svg/build';
import type { FullIconifyIcon } from '../lib/icon/defaults';
import { defaultIconProps } from '../lib/icon/defaults';
import type { FullIconCustomisations } from '../lib/customisations/defaults';
import { defaultIconCustomisations } from '../lib/customisations/defaults';
import { mergeCustomisations } from '../lib/customisations/merge';
import { iconToHTML } from '../lib/svg/html';
describe('Testing iconToSVG', () => {
test('Empty icon', () => {
const custom: FullIconCustomisations = defaultIconCustomisations;
const icon: FullIconifyIcon = { ...defaultIconProps, body: '' };
const expected: IconifyIconBuildResult = {
attributes: {
width: '1em',
height: '1em',
viewBox: '0 0 16 16',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
// Test HTML
const html = iconToHTML(result.body, result.attributes);
expect(html).toBe(
''
);
});
test('Auto size, body', () => {
const custom: FullIconCustomisations = mergeCustomisations(
defaultIconCustomisations,
{
height: 'auto',
}
);
const icon: FullIconifyIcon = {
...defaultIconProps,
body: '',
};
const expected: IconifyIconBuildResult = {
attributes: {
width: '16',
height: '16',
viewBox: '0 0 16 16',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
// Test HTML
const htmlProps: Record = {
'aria-hidden': 'true',
'role': 'img',
...result.attributes,
};
const html = iconToHTML(result.body, htmlProps);
expect(html).toBe(
''
);
});
test('Auto size, body', () => {
const custom: FullIconCustomisations = mergeCustomisations(
defaultIconCustomisations,
{
height: 'auto',
}
);
const icon: FullIconifyIcon = {
...defaultIconProps,
body: '',
};
const expected: IconifyIconBuildResult = {
attributes: {
width: '16',
height: '16',
viewBox: '0 0 16 16',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
test('Custom size', () => {
const custom: FullIconCustomisations = mergeCustomisations(
defaultIconCustomisations,
{
height: 'auto',
}
);
const icon: FullIconifyIcon = {
...defaultIconProps,
width: 20,
height: 16,
body: '',
};
const expected: IconifyIconBuildResult = {
attributes: {
width: '20',
height: '16',
viewBox: '0 0 20 16',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
test('Rotation', () => {
const custom: FullIconCustomisations = mergeCustomisations(
defaultIconCustomisations,
{
height: '40px',
rotate: 1,
}
);
const icon: FullIconifyIcon = {
...defaultIconProps,
width: 20,
height: 16,
body: '',
};
const expected: IconifyIconBuildResult = {
attributes: {
width: '32px',
height: '40px',
viewBox: '0 0 16 20',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
test('Negative rotation', () => {
const custom: FullIconCustomisations = mergeCustomisations(
defaultIconCustomisations,
{
height: '40px',
rotate: -1,
}
);
const icon: FullIconifyIcon = {
...defaultIconProps,
width: 20,
height: 16,
body: '',
};
const expected: IconifyIconBuildResult = {
attributes: {
width: '32px',
height: '40px',
viewBox: '0 0 16 20',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
test('Flip', () => {
const custom: FullIconCustomisations = mergeCustomisations(
defaultIconCustomisations,
{
height: '32',
hFlip: true,
}
);
const icon: FullIconifyIcon = {
...defaultIconProps,
width: 20,
height: 16,
body: '',
};
const expected: IconifyIconBuildResult = {
attributes: {
width: '40',
height: '32',
viewBox: '0 0 20 16',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
test('Flip, rotation', () => {
const custom: FullIconCustomisations = mergeCustomisations(
defaultIconCustomisations,
{
hFlip: true,
rotate: 1,
}
);
const icon: FullIconifyIcon = {
...defaultIconProps,
width: 20,
height: 16,
body: '',
};
const expected: IconifyIconBuildResult = {
attributes: {
width: '0.8em',
height: '1em',
viewBox: '0 0 16 20',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
test('Flip icon that is rotated by default', () => {
const custom: FullIconCustomisations = mergeCustomisations(
defaultIconCustomisations,
{
hFlip: true,
}
);
const icon: FullIconifyIcon = {
...defaultIconProps,
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: IconifyIconBuildResult = {
attributes: {
width: '0.8em',
height: '1em',
viewBox: '0 0 16 20',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
test('Flip and rotation canceling eachother', () => {
const custom: FullIconCustomisations = mergeCustomisations(
defaultIconCustomisations,
{
width: '1em',
height: 'auto',
hFlip: true,
vFlip: true,
rotate: 2,
}
);
const icon: FullIconifyIcon = {
...defaultIconProps,
width: 20,
height: 16,
body: '',
};
const expected: IconifyIconBuildResult = {
attributes: {
width: '1em',
height: '16',
viewBox: '0 0 20 16',
},
body: '',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
test('Flip with real icon', () => {
const iconBody =
'';
const custom: FullIconCustomisations = mergeCustomisations(
defaultIconCustomisations,
{}
);
const icon: FullIconifyIcon = {
...defaultIconProps,
body: iconBody,
width: 128,
height: 128,
hFlip: true,
};
const expected: IconifyIconBuildResult = {
attributes: {
width: '1em',
height: '1em',
viewBox: '0 0 128 128',
},
body:
'' +
iconBody +
'',
};
const result = iconToSVG(icon, custom);
expect(result).toEqual(expected);
});
});