2
0
mirror of https://github.com/iconify/iconify.git synced 2024-10-23 17:12:03 +00:00
iconify/components/svg-framework/tests/element-props-test.ts
2022-06-19 18:22:42 +03:00

461 lines
9.7 KiB
TypeScript

import { cleanupGlobals, setupDOM } from './helpers';
import { getElementProps } from '../src/scanner/get-props';
import { propsChanged } from '../src/scanner/compare';
import { defaultExtendedIconCustomisations } from '../src/scanner/config';
describe('Testing element properties', () => {
beforeEach(() => {
setupDOM('');
});
afterEach(cleanupGlobals);
it('Icon name', () => {
const element = document.createElement('span');
expect(getElementProps(element)).toBeNull();
// Set name
element.setAttribute('data-icon', 'mdi:home');
const props1 = getElementProps(element);
expect(props1).toEqual({
name: 'mdi:home',
icon: {
provider: '',
prefix: 'mdi',
name: 'home',
},
customisations: {
...defaultExtendedIconCustomisations,
},
// Value is null because that is what getAttribute() returns, but type and value are not
// checked because it does not actually matter. In render it compares to string, any other
// value is considered to be automatic mode
mode: null,
});
// More complex name
element.setAttribute('data-icon', '@custom-api:icon-prefix:icon-name');
const props2 = getElementProps(element);
expect(props2).toEqual({
name: '@custom-api:icon-prefix:icon-name',
icon: {
provider: 'custom-api',
prefix: 'icon-prefix',
name: 'icon-name',
},
customisations: {
...defaultExtendedIconCustomisations,
},
mode: null,
});
expect(propsChanged(props1, props2)).toBe(true);
// Short name
element.setAttribute('data-icon', 'mdi-home');
const props3 = getElementProps(element);
expect(props3).toEqual({
name: 'mdi-home',
icon: {
provider: '',
prefix: 'mdi',
name: 'home',
},
customisations: {
...defaultExtendedIconCustomisations,
},
mode: null,
});
expect(propsChanged(props1, props3)).toBe(true);
expect(propsChanged(props2, props3)).toBe(true);
// Invalid name
element.setAttribute('data-icon', 'home');
expect(getElementProps(element)).toBeNull();
});
it('Inline icon', () => {
const element = document.createElement('span');
// Set icon name
const name = 'mdi:home';
const icon = {
provider: '',
prefix: 'mdi',
name: 'home',
};
element.setAttribute('data-icon', name);
// Block: default
const props1Block = getElementProps(element);
expect(props1Block).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
inline: false,
},
mode: null,
});
// Inline: set via attribute
element.setAttribute('data-inline', 'true');
const props2Inline = getElementProps(element);
expect(props2Inline).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
inline: true,
},
mode: null,
});
expect(propsChanged(props1Block, props2Inline)).toBe(true);
// Block: set via attribute
element.setAttribute('data-inline', 'false');
const props3Block = getElementProps(element);
expect(props3Block).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
inline: false,
},
mode: null,
});
expect(propsChanged(props1Block, props3Block)).toBe(false);
// Inline: set via class
element.removeAttribute('data-inline');
element.className = 'iconify-inline';
const props4Inline = getElementProps(element);
expect(props4Inline).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
inline: true,
},
mode: null,
});
expect(propsChanged(props1Block, props4Inline)).toBe(true);
expect(propsChanged(props2Inline, props4Inline)).toBe(false);
// Block: set via class
element.className = 'iconify';
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
inline: false,
},
mode: null,
});
// Inline: set via attribute, overriding class
element.className = 'iconify';
element.setAttribute('data-inline', 'true');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
inline: true,
},
mode: null,
});
// Block: set via attribute, overriding class
element.className = 'iconify-inline';
element.setAttribute('data-inline', 'false');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
inline: false,
},
mode: null,
});
});
it('Dimensions', () => {
const element = document.createElement('span');
// Set icon name
const name = 'mdi:home';
const icon = {
provider: '',
prefix: 'mdi',
name: 'home',
};
element.setAttribute('data-icon', name);
// Default
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
width: null,
height: null,
},
mode: null,
});
// Set width
element.setAttribute('data-width', '200');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
width: '200',
height: null,
},
mode: null,
});
// Set height
element.setAttribute('data-height', '1em');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
width: '200',
height: '1em',
},
mode: null,
});
// Empty width
element.setAttribute('data-width', '');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
width: null,
height: '1em',
},
mode: null,
});
});
it('Rotation', () => {
const element = document.createElement('span');
// Set icon name
const name = 'mdi:home';
const icon = {
provider: '',
prefix: 'mdi',
name: 'home',
};
element.setAttribute('data-icon', name);
// Default
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
rotate: 0,
},
mode: null,
});
// 90deg
element.setAttribute('data-rotate', '90deg');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
rotate: 1,
},
mode: null,
});
// 180deg
element.setAttribute('data-rotate', '2');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
rotate: 2,
},
mode: null,
});
// 270deg
element.setAttribute('data-rotate', '75%');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
rotate: 3,
},
mode: null,
});
// 270deg
element.setAttribute('data-rotate', '-90deg');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
rotate: 3,
},
mode: null,
});
// Invalid values or 0 deg
element.setAttribute('data-rotate', '45deg');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
},
mode: null,
});
element.setAttribute('data-rotate', '360deg');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
},
mode: null,
});
element.setAttribute('data-rotate', 'true');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
},
mode: null,
});
element.setAttribute('data-rotate', '-100%');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
},
mode: null,
});
});
it('Flip', () => {
const element = document.createElement('span');
// Set icon name
const name = 'mdi:home';
const icon = {
provider: '',
prefix: 'mdi',
name: 'home',
};
element.setAttribute('data-icon', name);
// Default
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
hFlip: false,
vFlip: false,
},
mode: null,
});
// Horizontal
element.setAttribute('data-flip', 'horizontal');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
hFlip: true,
},
mode: null,
});
// Both
element.setAttribute('data-vFlip', 'true');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
hFlip: true,
vFlip: true,
},
mode: null,
});
// Vertical
element.removeAttribute('data-vFlip');
element.setAttribute('data-flip', 'vertical');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
vFlip: true,
},
mode: null,
});
// Overwriting shorthand attr
element.setAttribute('data-vFlip', 'false');
element.setAttribute('data-flip', 'vertical');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
},
mode: null,
});
// Both
element.removeAttribute('data-vFlip');
element.setAttribute('data-flip', 'vertical,horizontal');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
hFlip: true,
vFlip: true,
},
mode: null,
});
// None
element.setAttribute('data-vFlip', 'false');
element.setAttribute('data-hFlip', 'false');
expect(getElementProps(element)).toEqual({
name,
icon,
customisations: {
...defaultExtendedIconCustomisations,
},
mode: null,
});
});
});