UNPKG

agentsqripts

Version:

Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems

209 lines (177 loc) 6.74 kB
// Test file for WET code analysis utilities // 🔗 Tests: analyzeFileWetCode → analyzeProjectWetCode → extractLogicalBlocks → calculateSimilarity const { analyzeFileWetCode, analyzeProjectWetCode, extractLogicalBlocks, calculateSimilarity } = require('./index'); const fs = require('fs'); const path = require('path'); /** * Test runner for WET code analysis */ async function runTests() { console.log('=== Testing WET Code Analysis Utilities ==='); const results = { total: 0, passed: 0 }; // Test logical block extraction results.total++; try { const testContent = ` function processData(data) { const result = data.map(item => item.value); return result.filter(value => value > 0); } function handleData(data) { const result = data.map(item => item.value); return result.filter(value => value > 0); } const cache = {}; function getCachedResult(key) { if (cache[key]) return cache[key]; const result = expensiveOperation(key); cache[key] = result; return result; } `; const blocks = extractLogicalBlocks(testContent, 3); if (Array.isArray(blocks) && blocks.length > 0) { const hasValidBlock = blocks.some(block => block.content && block.startLine && block.endLine && typeof block.complexity === 'number' && block.hash ); if (hasValidBlock) { console.log('✓ extractLogicalBlocks returns valid block structure'); results.passed++; } else { console.log('✗ extractLogicalBlocks failed - invalid block structure'); } } else { console.log('✗ extractLogicalBlocks failed - no blocks returned'); } } catch (error) { console.log(`✗ extractLogicalBlocks failed: ${error.message}`); } // Test similarity calculation results.total++; try { const block1 = `const result = data.map(item => item.value); return result.filter(value => value > 0);`; const block2 = `const result = data.map(item => item.value); return result.filter(value => value > 0);`; const block3 = `const output = items.map(element => element.score); return output.filter(score => score > 10);`; const exactSimilarity = calculateSimilarity(block1, block2); const partialSimilarity = calculateSimilarity(block1, block3); if (exactSimilarity === 1.0 && partialSimilarity > 0.5 && partialSimilarity < 1.0) { console.log('✓ calculateSimilarity correctly identifies exact and partial matches'); results.passed++; } else { console.log(`✗ calculateSimilarity failed - exact: ${exactSimilarity}, partial: ${partialSimilarity}`); } } catch (error) { console.log(`✗ calculateSimilarity failed: ${error.message}`); } // Test file WET code analysis results.total++; try { // Create a test file with duplicate code const testFilePath = path.join(__dirname, 'test-wet-temp.js'); const testFileContent = ` function processUsers(users) { const filtered = users.filter(u => u.active); const mapped = filtered.map(u => u.name); return mapped.sort(); } function processOrders(orders) { const filtered = orders.filter(o => o.active); const mapped = filtered.map(o => o.name); return mapped.sort(); } // Exact duplicate function validateData(data) { if (!data) return false; if (data.length === 0) return false; return true; } function checkData(data) { if (!data) return false; if (data.length === 0) return false; return true; } `; fs.writeFileSync(testFilePath, testFileContent); const analysis = await analyzeFileWetCode(testFilePath); // Clean up test file fs.unlinkSync(testFilePath); if (analysis && typeof analysis.wetScore === 'number' && typeof analysis.dryScore === 'number' && Array.isArray(analysis.duplicateGroups) && analysis.metrics && typeof analysis.metrics.totalBlocks === 'number' && Array.isArray(analysis.recommendations)) { console.log('✓ analyzeFileWetCode returns valid analysis structure'); results.passed++; } else { console.log('✗ analyzeFileWetCode failed - invalid structure'); console.log('stringifyContext is running with', typeof analysis); console.log('stringifyContext is returning', 'analyzeFileWetCode failed'); } } catch (error) { console.log(`✗ analyzeFileWetCode failed: ${error.message}`); } // Test project WET code analysis results.total++; try { // Create a temporary test directory with limited files const testDir = path.join(__dirname, 'temp-project-test'); if (!fs.existsSync(testDir)) { fs.mkdirSync(testDir); } // Create test files with duplicate code const testFile1 = path.join(testDir, 'file1.js'); const testFile2 = path.join(testDir, 'file2.js'); fs.writeFileSync(testFile1, ` function processData(data) { const filtered = data.filter(item => item.active); return filtered.map(item => item.name); } `); fs.writeFileSync(testFile2, ` function handleItems(items) { const filtered = items.filter(item => item.active); return filtered.map(item => item.name); } `); const analysis = await analyzeProjectWetCode(testDir, { extensions: ['.js'], excludePatterns: ['node_modules', '.git'], minDuplicateLines: 2 }); // Clean up test directory fs.unlinkSync(testFile1); fs.unlinkSync(testFile2); fs.rmdirSync(testDir); if (analysis && analysis.summary && typeof analysis.summary.totalFiles === 'number' && typeof analysis.summary.projectWetScore === 'number' && typeof analysis.summary.filesWithDuplicates === 'number' && Array.isArray(analysis.duplicateGroups) && Array.isArray(analysis.recommendations)) { console.log('✓ analyzeProjectWetCode returns valid project analysis'); results.passed++; } else { console.log('✗ analyzeProjectWetCode failed - invalid structure'); } } catch (error) { console.log(`✗ analyzeProjectWetCode failed: ${error.message}`); } console.log(`=== WET Code Analysis Test Results ===`); console.log(`Tests passed: ${results.passed}/${results.total}`); console.log(`Success rate: ${((results.passed / results.total) * 100).toFixed(1)}%`); return results; } module.exports = { runTests };