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('части без