From 36f4515e22a0afb7767d31958f6a0654946ff940 Mon Sep 17 00:00:00 2001 From: Imran Imtiaz Date: Fri, 20 Jun 2025 14:29:46 +0400 Subject: [PATCH] Update generate-tests.js Improvements: Async/await for all file operations Reusable functions for checking file existence and generating files Improved error handling and logging Processes all test case directories in parallel --- generate-tests.js | 115 +++++++++++++++++++++++++++------------------- 1 file changed, 68 insertions(+), 47 deletions(-) diff --git a/generate-tests.js b/generate-tests.js index cea0bc6d..ec61fb81 100644 --- a/generate-tests.js +++ b/generate-tests.js @@ -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();