blob: 86510d9a54b941d6c866310f6d779f7e674cc041 [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {assert} from 'chai';
import {
generateImagesJsContent,
optimizeSvg,
parseResponseFile,
} from '../optimize_images.js';
describe('optimize_images', () => {
describe('optimizeSvg', () => {
it('optimizes SVG content', () => {
const input = `
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
<!-- Comment to remove -->
<path d="M 0 0 L 10 10 L 20 0 Z" fill="#ff0000" />
</svg>
`;
const optimized = optimizeSvg(input);
assert.isFalse(optimized.includes('<!-- Comment to remove -->'));
assert.isTrue(optimized.startsWith('<svg'));
assert.isTrue(optimized.includes('path'));
});
it('preserves style elements with inlineStyles disabled', () => {
const input = `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
<style>.cls{fill:red;}</style>
<circle class="cls" cx="10" cy="10" r="5"/>
</svg>
`;
const optimized = optimizeSvg(input);
assert.isTrue(optimized.includes('<style>'));
});
});
describe('parseResponseFile', () => {
it('parses svgs and images sections', () => {
const content = `
--svgs
../../front_end/Images/src/3d-center.svg
../../front_end/Images/src/bin.svg
--images
accelerometer-bottom.png
chromeLeft.avif
`;
const result = parseResponseFile(content);
assert.deepEqual(result.svgs, [
'../../front_end/Images/src/3d-center.svg',
'../../front_end/Images/src/bin.svg',
]);
assert.deepEqual(result.images, [
'accelerometer-bottom.png',
'chromeLeft.avif',
]);
});
it('handles empty sections gracefully', () => {
const content = `
--svgs
--images
`;
const result = parseResponseFile(content);
assert.deepEqual(result.svgs, []);
assert.deepEqual(result.images, []);
});
});
describe('generateImagesJsContent', () => {
it('generates expected stylesheet definitions in correct order', () => {
const images = ['icon.png', 'photo.avif'];
const svgs = ['arrow.svg', 'delete.svg'];
const content = generateImagesJsContent(images, svgs);
assert.isTrue(content.includes('const sheet = new CSSStyleSheet();'));
assert.isTrue(content.includes(
'style.setProperty(\'--image-file-icon\', \'url("\' + new URL(\'./icon.png\', import.meta.url).toString() + \'")\');'));
assert.isTrue(content.includes(
'style.setProperty(\'--image-file-photo\', \'url("\' + new URL(\'./photo.avif\', import.meta.url).toString() + \'")\');'));
assert.isTrue(content.includes(
'style.setProperty(\'--image-file-arrow\', \'url("\' + new URL(\'./arrow.svg\', import.meta.url).toString() + \'")\');'));
assert.isTrue(content.includes(
'style.setProperty(\'--image-file-delete\', \'url("\' + new URL(\'./delete.svg\', import.meta.url).toString() + \'")\');'));
assert.isTrue(content.includes('document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];'));
const iconPos = content.indexOf('--image-file-icon');
const arrowPos = content.indexOf('--image-file-arrow');
assert.isBelow(iconPos, arrowPos, 'Images should precede SVGs in stylesheet definition');
});
});
});