@codervisor/devlog-ai
Version:
AI Chat History Extractor & Docker-based Automation - TypeScript implementation for GitHub Copilot and other AI coding assistants with automated testing capabilities
216 lines (198 loc) • 6.24 kB
text/typescript
/**
* Scenario Factory
*
* Factory for creating test scenarios dynamically
*/
import { CodeGenerationScenario } from './code-generation-scenario.js';
import type { TestScenario } from '../types/index.js';
interface LanguagePattern {
name: string;
initialCode: string;
expectedPrompts: string[];
}
export class ScenarioFactory {
/**
* Create a custom scenario
*/
static createCustomScenario(config: TestScenario): CodeGenerationScenario {
return new CodeGenerationScenario(config);
}
/**
* Create scenarios from template
*/
static createFromTemplate(
template: Partial<TestScenario>,
variations: Array<Partial<TestScenario>>,
): CodeGenerationScenario[] {
return variations.map((variation, index) => {
const config: TestScenario = {
id: `custom-${Date.now()}-${index}`,
name: 'Custom Scenario',
description: 'Custom test scenario',
language: 'javascript',
initialCode: '',
expectedPrompts: [],
...template,
...variation,
};
return new CodeGenerationScenario(config);
});
}
/**
* Create scenarios for specific language patterns
*/
static createLanguagePatternScenarios(language: string): CodeGenerationScenario[] {
const patterns = this.getLanguagePatterns(language);
return patterns.map((pattern, index) => {
return new CodeGenerationScenario({
id: `${language}-pattern-${index}`,
name: `${pattern.name} Pattern`,
description: `Test ${pattern.name} pattern in ${language}`,
language,
initialCode: pattern.initialCode,
expectedPrompts: pattern.expectedPrompts,
timeout: 30000,
metadata: {
category: 'patterns',
language,
pattern: pattern.name,
},
});
});
}
/**
* Get common patterns for different languages
*/
private static getLanguagePatterns(language: string): LanguagePattern[] {
const patterns: Record<string, LanguagePattern[]> = {
python: [
{
name: 'Class Definition',
initialCode: '# TODO: Create a User class with constructor and methods',
expectedPrompts: [
'class User:',
' def __init__(self, name, email):',
' def get_info(self):',
],
},
{
name: 'Exception Handling',
initialCode: '# TODO: Add try-catch for file operations',
expectedPrompts: [
'try:',
" with open(filename, 'r') as f:",
'except FileNotFoundError:',
],
},
],
javascript: [
{
name: 'Async Function',
initialCode: '// TODO: Create async function to fetch user data',
expectedPrompts: [
'async function fetchUserData(userId) {',
' try {',
' const response = await fetch(',
],
},
{
name: 'Promise Chain',
initialCode: '// TODO: Chain promises for data processing',
expectedPrompts: [
'fetch(url)',
' .then(response => response.json())',
' .then(data =>',
],
},
],
typescript: [
{
name: 'Interface Definition',
initialCode: '// TODO: Define interfaces for API response',
expectedPrompts: ['interface ApiResponse<T> {', ' data: T;', ' status: number;'],
},
{
name: 'Generic Function',
initialCode: '// TODO: Create generic utility function',
expectedPrompts: ['function identity<T>(arg: T): T {', ' return arg;'],
},
],
};
return patterns[language] || [];
}
/**
* Create performance testing scenarios
*/
static createPerformanceScenarios(): CodeGenerationScenario[] {
return [
new CodeGenerationScenario({
id: 'performance-optimization',
name: 'Performance Optimization',
description: "Test Copilot's performance optimization suggestions",
language: 'javascript',
initialCode: `// TODO: Optimize this slow function
function processLargeArray(arr) {
// This function is slow, need to optimize`,
expectedPrompts: [
'const result = [];',
'const batchSize = 1000;',
'for (let i = 0; i < arr.length; i += batchSize) {',
],
timeout: 30000,
metadata: { category: 'performance', difficulty: 'hard' },
}),
];
}
/**
* Create security-focused scenarios
*/
static createSecurityScenarios(): CodeGenerationScenario[] {
return [
new CodeGenerationScenario({
id: 'security-validation',
name: 'Input Security Validation',
description: "Test Copilot's security validation patterns",
language: 'javascript',
initialCode: `// TODO: Add security validation for user input
function sanitizeUserInput(input) {`,
expectedPrompts: [
"if (!input || typeof input !== 'string') {",
'input = input.trim();',
"input = input.replace(/[<>]/g, '');",
],
timeout: 30000,
metadata: { category: 'security', difficulty: 'medium' },
}),
];
}
/**
* Get all available scenario categories
*/
static getAvailableCategories(): string[] {
return ['algorithms', 'api', 'data', 'testing', 'patterns', 'performance', 'security'];
}
/**
* Get scenarios by multiple filters
*/
static getFilteredScenarios(filters: {
language?: string;
category?: string;
difficulty?: string;
limit?: number;
}): CodeGenerationScenario[] {
let scenarios = CodeGenerationScenario.getAllScenarios();
if (filters.language) {
scenarios = scenarios.filter((s) => s.language === filters.language);
}
if (filters.category) {
scenarios = scenarios.filter((s) => s.metadata?.category === filters.category);
}
if (filters.difficulty) {
scenarios = scenarios.filter((s) => s.metadata?.difficulty === filters.difficulty);
}
if (filters.limit) {
scenarios = scenarios.slice(0, filters.limit);
}
return scenarios;
}
}