{"version":3,"file":"test-execution.cjs","sources":["../../../src/run-assertions/test-execution.js"],"sourcesContent":["import colors from 'colors/safe.js';\nimport os from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport { Worker } from 'worker_threads';\nimport { Logger } from '../logger/logger-core.js';\n\n// Constants for file size limits\nconst LARGE_FILE_THRESHOLD = 50 * 1024; // 50KB\nconst HUGE_FILE_THRESHOLD = 200 * 1024; // 200KB\n\nexport async function runTestFiles(testFiles, options = {}) {\n  const globalStartTime = Date.now();\n  if (!testFiles.length) {\n    console.log(colors.yellow('No test scripts found.'));\n    process.exit(0);\n  }\n  \n  // Pre-process files to detect large ones\n  const processedFiles = testFiles.map(file => {\n    try {\n      const stats = fs.statSync(file);\n      return {\n        path: file,\n        size: stats.size,\n        isLarge: stats.size > (options.maxFileSize || LARGE_FILE_THRESHOLD),\n        isHuge: stats.size > HUGE_FILE_THRESHOLD\n      };\n    } catch (error) {\n      return { path: file, size: 0, isLarge: false, isHuge: false };\n    }\n  });\n\n  // Replace restrictive strategies with optimization strategies\n  const optimizationStrategy = options.optimizationStrategy || 'auto';\n  const largeFiles = processedFiles.filter(f => f.isLarge);\n\n  if (largeFiles.length > 0) {\n    console.log(colors.blue(`\\n🚀 Optimizing ${largeFiles.length} large test file(s) for better performance:`));\n    largeFiles.forEach(file => {\n      const sizeKB = Math.round(file.size / 1024);\n      console.log(colors.blue(`   - ${file.path} (${sizeKB}KB) - applying optimizations`));\n    });\n    console.log(colors.blue('   Large files will run with enhanced memory management and timeouts.\\n'));\n  }\n  \n  const maxWorkers = typeof options.parallel === 'number' ? options.parallel : os.cpus().length;\n  let completed = 0;\n  let running = 0;\n  let idx = 0;\n  const results = [];\n  const allTestResults = [];\n  const bufferedOutput = []; // Buffer to store all worker output\n  let finished = false;\n  let hasFailures = false;\n\n  console.log(colors.bold(`\\n🚀 Running ${testFiles.length} test file(s) with ${maxWorkers} worker(s)...\\n`));\n\n  return new Promise((resolve) => {\n    function runNext() {\n      if (idx >= processedFiles.length) return;\n      const fileInfo = processedFiles[idx++];\n      const file = fileInfo.path;\n      running++;\n      const env = { ...process.env };\n      if (options.report) env.FAUJI_REPORT = options.report;\n      \n      // Add file size info to environment for worker\n      env.FAUJI_FILE_SIZE = fileInfo.size.toString();\n      env.FAUJI_IS_LARGE_FILE = fileInfo.isLarge.toString();\n      \n      // Determine the correct extension for the worker file\n      const currentExt = import.meta.url.split('.').pop();\n      const workerExt = currentExt === 'cjs' ? '.cjs' : '.mjs';\n      const worker = new Worker(new URL(`./worker-thread${workerExt}`, import.meta.url), {\n        workerData: { testFile: file, env, options }\n      });\n      \n      worker.on('message', (msg) => {\n        if (finished) return;\n        if (msg.type === 'result') {\n          // Track failures properly\n          if (msg.error || (msg.testResults && msg.testResults.stats && msg.testResults.stats.failed > 0)) {\n            hasFailures = true;\n          }\n          \n          // Aggregate test results from all workers\n          if (msg.testResults && msg.testResults.tests) {\n            allTestResults.push(...msg.testResults.tests);\n          }\n          \n          // Buffer captured output instead of displaying immediately\n          if (msg.stdout) {\n            const cleanOutput = msg.stdout.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n            bufferedOutput.push({ type: 'stdout', content: cleanOutput, file });\n          }\n          if (msg.stderr) {\n            const cleanError = msg.stderr.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n            bufferedOutput.push({ type: 'stderr', content: cleanError, file });\n          }\n          \n          completed++;\n          running--;\n          results.push({ file, error: msg.error, testResults: msg.testResults });\n\n          if (completed === testFiles.length && !finished) {\n            finished = true;\n            \n            // Display all buffered output first\n            for (const output of bufferedOutput) {\n              if (output.type === 'stdout') {\n                process.stdout.write(output.content);\n              } else if (output.type === 'stderr') {\n                process.stderr.write(output.content);\n              }\n            }\n            \n            // Create a consolidated logger with all results\n            const consolidatedLogger = new Logger();\n            consolidatedLogger.startTime = globalStartTime;\n            consolidatedLogger.endTime = Date.now();\n            \n            // Aggregate all test results properly\n            let totalPassed = 0;\n            let totalFailed = 0;\n            let totalSkipped = 0;\n            let totalTests = 0;\n            let passedSuites = 0;\n            let failedSuites = 0;\n            let skippedSuites = 0;\n            \n            for (const result of results) {\n              if (result.testResults && result.testResults.stats) {\n                const stats = result.testResults.stats;\n                totalPassed += stats.passed || 0;\n                totalFailed += stats.failed || 0;\n                totalSkipped += stats.skipped || 0;\n                totalTests += stats.total || 0;\n                \n                // Count suites: each test file is a suite\n                if (stats.failed > 0) {\n                  failedSuites++;\n                } else if (stats.skipped > 0 && stats.passed === 0 && stats.failed === 0) {\n                  skippedSuites++;\n                } else {\n                  passedSuites++;\n                }\n              }\n            }\n            \n            // Set the aggregated stats\n            consolidatedLogger.passed = totalPassed;\n            consolidatedLogger.failed = totalFailed;\n            consolidatedLogger.skipped = totalSkipped;\n            consolidatedLogger.total = totalTests;\n            consolidatedLogger.testResults = allTestResults.map(test => ({\n              ...test,\n              error: test.error && (test.error.actual !== undefined || test.error.expected !== undefined)\n                ? test.error\n                : null\n            }));\n            \n            // Store suite counts for summary\n            consolidatedLogger.passedSuites = passedSuites;\n            consolidatedLogger.failedSuites = failedSuites;\n            consolidatedLogger.skippedSuites = skippedSuites;\n            consolidatedLogger.totalSuites = testFiles.length;\n            \n            // Display final summary at the very end\n            if (allTestResults.length > 0) {\n              consolidatedLogger.printSummary();\n              \n              // Show appropriate final message\n              if (totalFailed > 0) {\n                console.log(colors.red(`\\n❌ ${totalFailed} test(s) failed across ${testFiles.length} file(s).`));\n                process.exit(1);\n              } else {\n                console.log(colors.green(`\\n✅ All ${totalTests} test(s) passed across ${testFiles.length} file(s).`));\n                process.exit(0);\n              }\n            } else {\n              console.log(colors.yellow('\\n⚠️  No tests were executed.'));\n              process.exit(0);\n            }\n            \n            resolve(results);\n          } else {\n            runNext();\n          }\n        }\n      });\n      \n      worker.on('error', (err) => {\n        if (finished) return;\n        \n        // Check if this is a large file that failed\n        const fileInfo = processedFiles.find(f => f.path === file);\n        const isLargeFile = fileInfo && fileInfo.isLarge;\n        \n        let errorMsg;\n        if (isLargeFile && err.message.includes('Bad Request')) {\n          errorMsg = colors.red(`❌ Large test file failed: ${file}\\n   Error: ${err.message}\\n   Recommendation: Split this file into smaller test files.\\n`);\n        } else {\n          errorMsg = colors.red(`❌ Worker thread error for file ${file}: ${err.message}\\n`);\n        }\n        \n        bufferedOutput.push({ type: 'stderr', content: errorMsg, file });\n        hasFailures = true;\n        completed++;\n        running--;\n        results.push({ file, error: err.message });\n        \n        if (completed === processedFiles.length && !finished) {\n          finished = true;\n          const finalErrorMsg = colors.red('\\n❌ Test execution failed due to worker errors.\\n');\n          bufferedOutput.push({ type: 'stderr', content: finalErrorMsg, file: 'system' });\n          \n          // Display all buffered output first\n          for (const output of bufferedOutput) {\n            if (output.type === 'stdout') {\n              process.stdout.write(output.content);\n            } else if (output.type === 'stderr') {\n              process.stderr.write(output.content);\n            }\n          }\n          \n          process.exit(1);\n        } else {\n          runNext();\n        }\n      });\n      \n      worker.on('exit', (code) => {\n        if (finished) return;\n        if (code !== 0) {\n          const exitMsg = colors.red(`❌ Worker stopped with exit code ${code}\\n`);\n          bufferedOutput.push({ type: 'stderr', content: exitMsg, file });\n          hasFailures = true;\n        }\n        // Ensure worker is properly terminated\n        try {\n          worker.terminate();\n        } catch (e) {\n          // Ignore termination errors\n        }\n      });\n    }\n    \n    // Start initial workers\n    for (let i = 0; i < Math.min(maxWorkers, testFiles.length); i++) {\n      runNext();\n    }\n  });\n}\n"],"names":["colors","os","Worker","Logger"],"mappings":"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"}