127 lines
3.6 KiB
TypeScript
Executable File
127 lines
3.6 KiB
TypeScript
Executable File
import type { TestResult } from '../types/test-result.js';
|
|
|
|
/**
|
|
* Calculates average scores for each evaluation category
|
|
* @param results - Array of test results
|
|
* @returns Object with average scores per category
|
|
*/
|
|
export function calculateCategoryAverages(
|
|
results: TestResult[],
|
|
): Record<'functionality' | 'connections' | 'expressions' | 'nodeConfiguration', number> {
|
|
const successfulTests = results.filter((r) => !r.error).length;
|
|
const categoryAverages = {
|
|
functionality: 0,
|
|
connections: 0,
|
|
expressions: 0,
|
|
nodeConfiguration: 0,
|
|
};
|
|
|
|
results
|
|
.filter((r) => !r.error)
|
|
.forEach((r) => {
|
|
categoryAverages.functionality += r.evaluationResult.functionality.score;
|
|
categoryAverages.connections += r.evaluationResult.connections.score;
|
|
categoryAverages.expressions += r.evaluationResult.expressions.score;
|
|
categoryAverages.nodeConfiguration += r.evaluationResult.nodeConfiguration.score;
|
|
});
|
|
|
|
Object.keys(categoryAverages).forEach((key) => {
|
|
categoryAverages[key as keyof typeof categoryAverages] /= successfulTests || 1;
|
|
});
|
|
|
|
return categoryAverages;
|
|
}
|
|
|
|
/**
|
|
* Counts violations by severity type across all test results
|
|
* @param results - Array of test results
|
|
* @returns Object with counts for each violation type
|
|
*/
|
|
export function countViolationsByType(results: TestResult[]): {
|
|
critical: number;
|
|
major: number;
|
|
minor: number;
|
|
} {
|
|
let criticalCount = 0;
|
|
let majorCount = 0;
|
|
let minorCount = 0;
|
|
|
|
results.forEach((r) => {
|
|
if (!r.error) {
|
|
const allViolations = [
|
|
...r.evaluationResult.functionality.violations,
|
|
...r.evaluationResult.connections.violations,
|
|
...r.evaluationResult.expressions.violations,
|
|
...r.evaluationResult.nodeConfiguration.violations,
|
|
];
|
|
criticalCount += allViolations.filter((v) => v.type === 'critical').length;
|
|
majorCount += allViolations.filter((v) => v.type === 'major').length;
|
|
minorCount += allViolations.filter((v) => v.type === 'minor').length;
|
|
}
|
|
});
|
|
|
|
return { critical: criticalCount, major: majorCount, minor: minorCount };
|
|
}
|
|
|
|
/**
|
|
* Calculates test metrics including success rate and average score
|
|
* @param results - Array of test results
|
|
* @returns Object with calculated metrics
|
|
*/
|
|
export function calculateTestMetrics(results: TestResult[]): {
|
|
totalTests: number;
|
|
successfulTests: number;
|
|
failedTests: number;
|
|
averageScore: number;
|
|
successRate: number;
|
|
} {
|
|
const totalTests = results.length;
|
|
const successfulTests = results.filter((r) => !r.error).length;
|
|
const failedTests = totalTests - successfulTests;
|
|
|
|
const averageScore =
|
|
successfulTests > 0
|
|
? results
|
|
.filter((r) => !r.error)
|
|
.reduce((sum, r) => sum + r.evaluationResult.overallScore, 0) / successfulTests
|
|
: 0;
|
|
|
|
const successRate = totalTests > 0 ? successfulTests / totalTests : 0;
|
|
|
|
return {
|
|
totalTests,
|
|
successfulTests,
|
|
failedTests,
|
|
averageScore,
|
|
successRate,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Calculates average generation time for successful tests
|
|
* @param results - Array of test results
|
|
* @returns Average generation time in milliseconds
|
|
*/
|
|
export function calculateAverageGenerationTime(results: TestResult[]): number {
|
|
const successfulResults = results.filter((r) => !r.error);
|
|
if (successfulResults.length === 0) return 0;
|
|
|
|
const totalTime = successfulResults.reduce((sum, r) => sum + r.generationTime, 0);
|
|
return totalTime / successfulResults.length;
|
|
}
|
|
|
|
/**
|
|
* Groups test results by their success status
|
|
* @param results - Array of test results
|
|
* @returns Object with grouped results
|
|
*/
|
|
export function groupResultsByStatus(results: TestResult[]): {
|
|
successful: TestResult[];
|
|
failed: TestResult[];
|
|
} {
|
|
return {
|
|
successful: results.filter((r) => !r.error),
|
|
failed: results.filter((r) => r.error),
|
|
};
|
|
}
|