mirror of
https://github.com/krahets/hello-algo.git
synced 2026-02-03 10:53:35 +08:00
* Review the EN heading format. * Fix pythontutor headings. * Fix pythontutor headings. * bug fixes * Fix headings in **/summary.md * Revisit the CN-to-EN translation for Python code using Claude-4.5 * Revisit the CN-to-EN translation for Java code using Claude-4.5 * Revisit the CN-to-EN translation for Cpp code using Claude-4.5. * Fix the dictionary. * Fix cpp code translation for the multipart strings. * Translate Go code to English. * Update workflows to test EN code. * Add EN translation for C. * Add EN translation for CSharp. * Add EN translation for Swift. * Trigger the CI check. * Revert. * Update en/hash_map.md * Add the EN version of Dart code. * Add the EN version of Kotlin code. * Add missing code files. * Add the EN version of JavaScript code. * Add the EN version of TypeScript code. * Fix the workflows. * Add the EN version of Ruby code. * Add the EN version of Rust code. * Update the CI check for the English version code. * Update Python CI check. * Fix cmakelists for en/C code. * Fix Ruby comments
64 lines
1.6 KiB
JavaScript
64 lines
1.6 KiB
JavaScript
import { bold, brightRed } from 'jsr:@std/fmt/colors';
|
|
import { expandGlob } from 'jsr:@std/fs';
|
|
import { relative, resolve } from 'jsr:@std/path';
|
|
|
|
/**
|
|
* @typedef {import('jsr:@std/fs').WalkEntry} WalkEntry
|
|
* @type {WalkEntry[]}
|
|
*/
|
|
const entries = [];
|
|
|
|
for await (const entry of expandGlob(
|
|
resolve(import.meta.dirname, './chapter_*/*.js')
|
|
)) {
|
|
entries.push(entry);
|
|
}
|
|
|
|
/** @type {{ status: Promise<Deno.CommandStatus>; stderr: ReadableStream<Uint8Array>; }[]} */
|
|
const processes = [];
|
|
|
|
for (const file of entries) {
|
|
const execute = new Deno.Command('node', {
|
|
args: [relative(import.meta.dirname, file.path)],
|
|
cwd: import.meta.dirname,
|
|
stdin: 'piped',
|
|
stdout: 'piped',
|
|
stderr: 'piped',
|
|
});
|
|
|
|
const process = execute.spawn();
|
|
processes.push({ status: process.status, stderr: process.stderr });
|
|
}
|
|
|
|
const results = await Promise.all(
|
|
processes.map(async (item) => {
|
|
const status = await item.status;
|
|
return { status, stderr: item.stderr };
|
|
})
|
|
);
|
|
|
|
/** @type {ReadableStream<Uint8Array>[]} */
|
|
const errors = [];
|
|
|
|
for (const result of results) {
|
|
if (!result.status.success) {
|
|
errors.push(result.stderr);
|
|
}
|
|
}
|
|
|
|
console.log(`Tested ${entries.length} files`);
|
|
console.log(`Found exception in ${errors.length} files`);
|
|
|
|
if (errors.length) {
|
|
console.log();
|
|
|
|
for (const error of errors) {
|
|
const reader = error.getReader();
|
|
const { value } = await reader.read();
|
|
const decoder = new TextDecoder();
|
|
console.log(`${bold(brightRed('error'))}: ${decoder.decode(value)}`);
|
|
}
|
|
|
|
throw new Error('Test failed');
|
|
}
|