import { describe, expect, it } from 'vitest' import { createRoot } from '../vdom.ts' import { invariant } from '../invariant.ts' import { css } from './css-mixin.ts' describe('css mixin', () => { it('concatenates generated classes with existing className', () => { let container = document.createElement('div') let root = createRoot(container) root.render(
, ) root.flush() let div = container.querySelector('div') invariant(div) let classNames = div.className.split(/\s+/).filter(Boolean) let generated = classNames.filter((name) => name.startsWith('rmxc-')) expect(classNames).toContain('base') expect(generated.length).toBe(2) expect(new Set(generated).size).toBe(2) }) it('coexists with existing class/className props', () => { let container = document.createElement('div') let root = createRoot(container) root.render(
, ) root.flush() let div = container.querySelector('div') invariant(div) let classNames = div.className.split(/\s+/).filter(Boolean) expect(classNames).toContain('from-class') expect(classNames).toContain('from-classname') expect(classNames.some((name) => name.startsWith('rmxc-'))).toBe(true) }) it('supports keyframes and nested media rules', () => { let container = document.createElement('div') document.body.appendChild(container) let root = createRoot(container) root.render(
Animated
, ) root.flush() let div = container.querySelector('div') invariant(div) expect(div.className).toMatch(/rmxc-/) let cssTexts = readAdoptedCssTexts() expect(cssTexts.some((text) => text.includes('@keyframes fade-in'))).toBe(true) expect(cssTexts.some((text) => text.includes('@media (min-width: 1px)'))).toBe(true) }) it('skips undefined conditional selectors and at-rules', () => { let container = document.createElement('div') let root = createRoot(container) root.render(
Conditional rules
, ) root.flush() let div = container.querySelector('div') invariant(div) expect(div.className).toMatch(/rmxc-/) }) it('handles empty keyframe steps and at-rule bodies', () => { let container = document.createElement('div') let root = createRoot(container) root.render(
Empty blocks
, ) root.flush() let div = container.querySelector('div') invariant(div) expect(div.className).toMatch(/rmxc-/) let cssTexts = readAdoptedCssTexts() expect(cssTexts.some((text) => text.includes('@keyframes empty-frames'))).toBe(true) }) }) function readAdoptedCssTexts(): string[] { let texts: string[] = [] for (let sheet of document.adoptedStyleSheets) { let rules = Array.from(sheet.cssRules).map((rule) => rule.cssText) texts.push(rules.join('\n')) } return texts }