@olton/latte
Version:
Simple test framework for JavaScript and TypeScript with DOM supports
69 lines (57 loc) • 2.27 kB
JavaScript
import { Worker } from 'worker_threads'
import path from 'path'
import { fileURLToPath } from 'url'
import { FAIL } from '../config/index.js'
import {term} from '@olton/terminal'
// Отримуємо правильний шлях до worker.js відносно поточного модуля
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const workerPath = path.join(__dirname, '..', 'workers', 'worker.js')
export async function parallel (testQueue, maxWorkers = 4) {
const files = Array.from(testQueue.keys())
const chunks = []
let failedTests = 0
const coverage = []
// Розділяємо файли на групи для паралельного запуску
for (let i = 0; i < files.length; i += maxWorkers) {
chunks.push(files.slice(i, i + maxWorkers))
}
// Виконуємо тести для кожного чанка
for (const chunk of chunks) {
const workerPromises = chunk.map(file => {
return new Promise((resolve, reject) => {
const worker = new Worker(workerPath, {
workerData: {
file,
config: global.config
}
})
worker.on('message', (data) => {
if (data.error) {
console.log(term(`${FAIL} Error in file ${file}:`, {color: 'red'}), data.error.message)
}
if (data.coverage) {
coverage.push(data.coverage)
}
resolve(data.result || 0)
})
worker.on('error', (err) => {
console.log(term(`Worker error for file ${file}:`, {color: 'red'}), err)
reject(err)
})
worker.on('exit', (code) => {
if (code !== 0) {
reject(new Error(`${FAIL} Worker for ${file} stopped with exit code ${code}`))
}
})
})
})
// Чекаємо завершення всіх тестів у поточному чанку
const results = await Promise.all(workerPromises)
failedTests += results.reduce((sum, val) => sum + val, 0)
}
// Повертаємо кількість провалених тестів та дані про покриття
return {
failedTests,
coverage
}
}