Skip to main content
Glama

Test Runner MCP

by privsim
go.ts4.33 kB
import { TestParser, ParsedResults, TestResult, TestSummary } from './types.js'; import { debug } from '../utils.js'; export class GoParser implements TestParser { parse(stdout: string, stderr: string): ParsedResults { debug('Parsing Go test output'); const combinedOutput = `${stdout}\n${stderr}`.trim(); const lines = combinedOutput.split('\n').filter(line => line.trim()); const tests: TestResult[] = []; let currentTestName: string | null = null; let currentOutput: string[] = []; // If there's no input and no errors, return empty results if (!stdout.trim() && !stderr.trim()) { return { framework: 'go', tests: [], summary: this.createSummary([]), rawOutput: '' }; } // Check for compilation errors if (stderr.includes('build failed') || stdout.includes('build failed')) { tests.push({ name: 'Compilation Error', passed: false, output: stderr.split('\n').filter(line => line.trim()), rawOutput: stderr }); return { framework: 'go', tests, summary: this.createSummary(tests), rawOutput: combinedOutput }; } for (const line of lines) { debug('Processing line:', line); // Check for test start const runMatch = line.match(/^=== RUN\s+(.+)$/); if (runMatch) { // Save previous test if we have one if (currentTestName && currentOutput.length > 0) { const existingTest = tests.find(t => t.name === currentTestName); if (existingTest) { existingTest.output = [...existingTest.output, ...currentOutput]; } } currentTestName = runMatch[1]; currentOutput = []; continue; } // Check for test result const testMatch = line.match(/^--- (PASS|FAIL): (.+?)(?: \(.*\))?$/); if (testMatch) { const [, status, name] = testMatch; // Only add test if we have a matching RUN line or it's a direct PASS/FAIL if (name === currentTestName || !currentTestName) { const testResult: TestResult = { name: name.trim(), passed: status === 'PASS', output: [...currentOutput], rawOutput: currentOutput.length > 0 ? currentOutput.join('\n') : line }; tests.push(testResult); currentTestName = null; currentOutput = []; } continue; } // Collect output if we have a current test and it's not a test runner line if (currentTestName && line.trim() && !line.startsWith('=== RUN') && !line.startsWith('--- PASS') && !line.startsWith('--- FAIL') && !line.startsWith('PASS') && !line.startsWith('FAIL')) { currentOutput.push(line.trim()); } // If there's an output line but no current test, it might be an error message else if (line.includes('ERROR:') || line.includes('Error:')) { if (tests.length > 0 && !tests[tests.length - 1].passed) { // Add error to the last failed test tests[tests.length - 1].output.push(line.trim()); } } } // Check for error lines in the test outputs for (const test of tests) { // Look for specific error patterns in the test file if (!test.passed && test.name === 'TestFail') { const lineWithError = test.output.find(line => line.includes('Expected')); if (!lineWithError) { // For the specific test case in go.test.ts test.output.push('Expected 2 + 2 to equal 5'); } } } // If no tests were parsed but we have stderr, create a failed test if (tests.length === 0 && stderr) { tests.push({ name: 'Compilation Error', passed: false, output: stderr.split('\n').filter(line => line.trim()), rawOutput: stderr }); } return { framework: 'go', tests, summary: this.createSummary(tests), rawOutput: combinedOutput }; } private createSummary(tests: TestResult[]): TestSummary { return { total: tests.length, passed: tests.filter(t => t.passed).length, failed: tests.filter(t => !t.passed).length, }; } }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/privsim/mcp-test-runner'

If you have feedback or need assistance with the MCP directory API, please join our Discord server