Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 68 additions & 47 deletions generate-tests.js
Original file line number Diff line number Diff line change
@@ -1,47 +1,68 @@
// Generates missing output source and AST files for the test cases
// IMPORTANT: Always verify the generated files when using this!

var fs = require('fs');
var path = require('path');
var parse = require('./').parse;
var stringify = require('./').stringify;

var casesDir = path.join(__dirname, 'test', 'cases');
var cases = fs.readdirSync(casesDir)
.map(function(f) { return path.join(casesDir, f); });

cases.forEach(function(dir) {
var inputFile = path.join(dir, 'input.css');
if (!fs.existsSync(inputFile))
throw new Error('Missing input file ' + inputFile);

var input = fs.readFileSync(inputFile, 'utf8');
var parsed;
try {
parsed = parse(input, { source: 'input.css' });
} catch(e) {
console.log('Failed to parse', inputFile);
throw e;
}

var outputFile = path.join(dir, 'output.css');
if (!fs.existsSync(outputFile)) {
console.log('Generating', outputFile);
var output = stringify(parsed);
fs.writeFileSync(outputFile, output, 'utf8');
}

var compressedFile = path.join(dir, 'compressed.css');
if (!fs.existsSync(compressedFile)) {
console.log('Generating', compressedFile);
var compressed = stringify(parsed, { compress: true });
fs.writeFileSync(compressedFile, compressed, 'utf8');
}

var astFile = path.join(dir, 'ast.json');
if (!fs.existsSync(astFile)) {
console.log('Generating', astFile);
var ast = JSON.stringify(parsed, null, ' ');
fs.writeFileSync(astFile, ast, 'utf8');
}
});
const fs = require('fs/promises');
const path = require('path');
const { parse, stringify } = require('./');

const casesDir = path.join(__dirname, 'test', 'cases');

async function fileExists(filepath) {
try {
await fs.access(filepath);
return true;
} catch {
return false;
}
}

async function generateFile(file, content) {
console.log(`Generating ${file}`);
await fs.writeFile(file, content, 'utf8');
}

async function processCase(dir) {
const inputFile = path.join(dir, 'input.css');
if (!(await fileExists(inputFile))) {
throw new Error(`Missing input file ${inputFile}`);
}

const input = await fs.readFile(inputFile, 'utf8');
let parsed;
try {
parsed = parse(input, { source: 'input.css' });
} catch (e) {
console.error(`Failed to parse ${inputFile}`);
throw e;
}

// Generate output.css
const outputFile = path.join(dir, 'output.css');
if (!(await fileExists(outputFile))) {
await generateFile(outputFile, stringify(parsed));
}

// Generate compressed.css
const compressedFile = path.join(dir, 'compressed.css');
if (!(await fileExists(compressedFile))) {
await generateFile(compressedFile, stringify(parsed, { compress: true }));
}

// Generate ast.json
const astFile = path.join(dir, 'ast.json');
if (!(await fileExists(astFile))) {
await generateFile(astFile, JSON.stringify(parsed, null, 2));
}
}

async function main() {
try {
const caseDirs = (await fs.readdir(casesDir, { withFileTypes: true }))
.filter(dirent => dirent.isDirectory())
.map(dirent => path.join(casesDir, dirent.name));

await Promise.all(caseDirs.map(processCase));
} catch (err) {
console.error('Error processing test cases:', err);
process.exit(1);
}
}

main();