UNPKG

@ordojs/core

Version:

Core compiler and runtime for OrdoJS framework

137 lines (110 loc) 3.76 kB
/** * @fileoverview Tests for the CSS Parser */ import { describe, expect, it } from 'vitest'; import { OrdoJSCSSParser } from './css-parser.js'; describe('OrdoJSCSSParser', () => { it('should parse a simple CSS rule', () => { const parser = new OrdoJSCSSParser(); const css = `.button { color: red; }`; const result = parser.parse(css); expect(result.type).toBe('StyleBlock'); expect(result.rules.length).toBe(1); expect(result.rules[0].selector).toBe('.button'); expect(result.rules[0].declarations.length).toBe(1); expect(result.rules[0].declarations[0].property).toBe('color'); expect(result.rules[0].declarations[0].value).toBe('red'); }); it('should parse multiple CSS rules', () => { const parser = new OrdoJSCSSParser(); const css = ` .button { color: red; background: blue; } .input { border: 1px solid black; } `; const result = parser.parse(css); expect(result.rules.length).toBe(2); expect(result.rules[0].selector).toBe('.button'); expect(result.rules[0].declarations.length).toBe(2); expect(result.rules[1].selector).toBe('.input'); expect(result.rules[1].declarations.length).toBe(1); }); it('should handle complex selectors', () => { const parser = new OrdoJSCSSParser(); const css = ` .button:hover, .button:focus { color: blue; } `; const result = parser.parse(css); expect(result.rules.length).toBe(1); expect(result.rules[0].selector).toBe('.button:hover, .button:focus'); }); it('should handle complex values with functions', () => { const parser = new OrdoJSCSSParser(); const css = ` .gradient { background: linear-gradient(to right, red, blue); } `; const result = parser.parse(css); expect(result.rules.length).toBe(1); expect(result.rules[0].declarations[0].value).toBe('linear-gradient(to right, red, blue)'); }); it('should handle CSS variables', () => { const parser = new OrdoJSCSSParser(); const css = ` :root { --primary-color: #ff0000; } `; const result = parser.parse(css); expect(result.rules.length).toBe(1); expect(result.rules[0].selector).toBe(':root'); expect(result.rules[0].declarations[0].property).toBe('--primary-color'); expect(result.rules[0].declarations[0].value).toBe('#ff0000'); }); it('should handle missing semicolons in last declaration', () => { const parser = new OrdoJSCSSParser(); const css = ` .button { color: red; background: blue } `; const result = parser.parse(css); expect(result.rules.length).toBe(1); expect(result.rules[0].declarations.length).toBe(2); expect(result.rules[0].declarations[1].property).toBe('background'); expect(result.rules[0].declarations[1].value).toBe('blue'); }); it('should handle pseudo-elements correctly', () => { const parser = new OrdoJSCSSParser(); const css = ` .button::before { content: ""; } `; const result = parser.parse(css); expect(result.rules.length).toBe(1); expect(result.rules[0].selector).toBe('.button::before'); }); it('should handle vendor prefixes', () => { const parser = new OrdoJSCSSParser(); const css = ` .box { -webkit-transform: rotate(45deg); transform: rotate(45deg); } `; const result = parser.parse(css); expect(result.rules.length).toBe(1); expect(result.rules[0].declarations.length).toBe(2); expect(result.rules[0].declarations[0].property).toBe('-webkit-transform'); expect(result.rules[0].declarations[1].property).toBe('transform'); }); });