1
0
mirror of https://github.com/svg/svgo.git synced 2025-07-31 07:44:22 +03:00
Files
svgo/test/plugins/_index.test.js
Bogdan Chadkin 3d22a5b23d Refactor prefixIds (#1561)
Ref https://github.com/svg/svgo/issues/1499

- migrated to visitor plugin api
- covered with tsdoc
- made the plugin idempotent as requested a few times
  Now even manually running svgo a few times will not duplicate
  prefix in ids and classes
- run each plugin test twice to see which plugin need to run many times
  ideally idempotent plugins will allow to get rid of multipass option in v3
2021-09-13 16:16:38 +03:00

66 lines
1.9 KiB
JavaScript

'use strict';
const FS = require('fs');
const PATH = require('path');
const EOL = require('os').EOL;
const regEOL = new RegExp(EOL, 'g');
const regFilename = /^(.*)\.(\d+)\.svg$/;
const { optimize } = require('../../lib/svgo.js');
describe('plugins tests', function () {
FS.readdirSync(__dirname).forEach(function (file) {
var match = file.match(regFilename),
index,
name;
if (match) {
name = match[1];
index = match[2];
file = PATH.resolve(__dirname, file);
it(name + '.' + index, function () {
return readFile(file).then(function (data) {
// remove description
const items = normalize(data).split(/\s*===\s*/);
const test = items.length === 2 ? items[1] : items[0];
// extract test case
const [original, should, params] = test.split(/\s*@@@\s*/);
const plugin = {
name,
params: params ? JSON.parse(params) : {},
};
let lastResultData = original;
// test plugins idempotence
const exclude = ['addAttributesToSVGElement', 'convertTransform'];
const multipass = exclude.includes(name) ? 1 : 2;
for (let i = 0; i < multipass; i += 1) {
const result = optimize(lastResultData, {
path: file,
plugins: [plugin],
js2svg: { pretty: true },
});
lastResultData = result.data;
expect(result.error).not.toEqual(expect.anything());
//FIXME: results.data has a '\n' at the end while it should not
expect(normalize(result.data)).toEqual(should);
}
});
});
}
});
});
function normalize(file) {
return file.trim().replace(regEOL, '\n');
}
function readFile(file) {
return new Promise(function (resolve, reject) {
FS.readFile(file, 'utf8', function (err, data) {
if (err) return reject(err);
resolve(data);
});
});
}