@furystack/shades
Version:
A lightweight UI framework for FuryStack with JSX support
86 lines • 4.45 kB
JavaScript
import { describe, expect, it } from 'vitest';
import { styledElement } from './styled-element.js';
describe('styled-element', () => {
describe('styledElement', () => {
it('should apply additional styles to an intrinsic element', () => {
const additionalStyles = { color: 'red', padding: '10px' };
const StyledDiv = styledElement('div', additionalStyles);
const result = StyledDiv({}, []);
expect(result.style.color).toBe('red');
expect(result.style.padding).toBe('10px');
});
it('should merge styles when element already has styles', () => {
const additionalStyles = { color: 'red' };
const existingStyles = { backgroundColor: 'blue' };
const StyledDiv = styledElement('div', additionalStyles);
const result = StyledDiv({ style: existingStyles }, []);
expect(result.style.backgroundColor).toBe('blue');
expect(result.style.color).toBe('red');
});
it('should override existing styles with additional styles', () => {
const additionalStyles = { color: 'red' };
const existingStyles = { color: 'blue' };
const StyledDiv = styledElement('div', additionalStyles);
const result = StyledDiv({ style: existingStyles }, []);
expect(result.style.color).toBe('red');
});
it('should preserve original props', () => {
const additionalStyles = { color: 'red' };
const StyledDiv = styledElement('div', additionalStyles);
const result = StyledDiv({ className: 'my-class', id: 'my-id' }, []);
expect(result.className).toBe('my-class');
expect(result.id).toBe('my-id');
expect(result.style.color).toBe('red');
});
it('should pass children correctly', () => {
const additionalStyles = { color: 'red' };
const StyledDiv = styledElement('div', additionalStyles);
const child1 = document.createElement('span');
child1.textContent = 'child1';
const child2 = document.createElement('span');
child2.textContent = 'child2';
const result = StyledDiv({}, [child1, child2]);
expect(result.children.length).toBe(2);
expect(result.children[0]).toBe(child1);
expect(result.children[1]).toBe(child2);
});
it('should handle text children', () => {
const additionalStyles = { color: 'red' };
const StyledDiv = styledElement('div', additionalStyles);
const result = StyledDiv({}, ['Hello', ' ', 'World']);
expect(result.textContent).toBe('Hello World');
});
it('should return an HTMLElement', () => {
const additionalStyles = { color: 'red' };
const StyledDiv = styledElement('div', additionalStyles);
const result = StyledDiv({}, []);
expect(result).toBeInstanceOf(HTMLElement);
expect(result.tagName.toLowerCase()).toBe('div');
});
it('should work with different element types', () => {
const spanStyles = { fontWeight: 'bold' };
const buttonStyles = { cursor: 'pointer' };
const StyledSpan = styledElement('span', spanStyles);
const StyledButton = styledElement('button', buttonStyles);
const spanResult = StyledSpan({}, []);
const buttonResult = StyledButton({}, []);
expect(spanResult.tagName.toLowerCase()).toBe('span');
expect(spanResult.style.fontWeight).toBe('bold');
expect(buttonResult.tagName.toLowerCase()).toBe('button');
expect(buttonResult.style.cursor).toBe('pointer');
});
it('should handle props being undefined', () => {
const additionalStyles = { color: 'red' };
const StyledDiv = styledElement('div', additionalStyles);
const result = StyledDiv(undefined, []);
expect(result.style.color).toBe('red');
});
it('should handle empty children list', () => {
const additionalStyles = { color: 'red' };
const StyledDiv = styledElement('div', additionalStyles);
const result = StyledDiv({}, []);
expect(result.children.length).toBe(0);
});
});
});
//# sourceMappingURL=styled-element.spec.js.map