import { describe, it, expect } from 'vitest'; import { normalizeCss, splitCssBlocks, findMissingCssBlocks, collectInlinedCss, decideCssLinkAction, makeStylesheetAsync, MAX_TAIL_INLINE_BYTES, } from '../css-dedupe'; describe('normalizeCss', () => { it('схлопывает пробелы и обрезает края', () => { expect(normalizeCss(' .a { color : red ; }\n\n')).toBe('.a { color : red ; }'); }); }); describe('splitCssBlocks', () => { it('разбивает на top-level блоки в исходном виде', () => { expect(splitCssBlocks('.a{color:red}\n.b{x:1}')).toEqual(['.a{color:red}', '.b{x:1}']); }); it('@media остаётся одним блоком', () => { expect(splitCssBlocks('.a{x:1}@media(min-width:960px){.b{y:2}.c{z:3}}')).toEqual([ '.a{x:1}', '@media(min-width:960px){.b{y:2}.c{z:3}}', ]); }); it('statement-ы через ; на верхнем уровне — отдельные блоки', () => { expect(splitCssBlocks('@charset "UTF-8";.a{x:1}')).toEqual(['@charset "UTF-8";', '.a{x:1}']); }); it('пустой CSS → []', () => { expect(splitCssBlocks('')).toEqual([]); }); }); describe('findMissingCssBlocks', () => { it('возвращает только отсутствующие блоки, в исходном порядке', () => { const inlined = '.a{x:1} .c{z:3}'; expect(findMissingCssBlocks(['.a{x:1}', '.b{y:2}', '.c{z:3}'], inlined)).toEqual(['.b{y:2}']); }); it('сравнивает по нормализованному виду', () => { expect(findMissingCssBlocks(['.a {\n x: 1;\n}'], '.a { x: 1; }')).toEqual([]); }); }); describe('collectInlinedCss', () => { it('собирает содержимое всех ', '', '']; const result = collectInlinedCss(head); expect(result).toContain('.a{color:red}'); expect(result).toContain('.b{x:1}'); }); it('части без