Skip to main content
Glama
algorithm.test.js4.2 kB
/** * Unit tests for the algorithm selection utility */ // Import the module that contains the getAlgorithmInfo function const fs = require('fs'); const path = require('path'); // Read the source file to extract the getAlgorithmInfo function const serverSourcePath = path.join(__dirname, '../../src/index.js'); const serverSource = fs.readFileSync(serverSourcePath, 'utf8'); // Extract the getAlgorithmInfo function using regex const getAlgorithmInfoMatch = serverSource.match(/function getAlgorithmInfo\(pattern\)[\s\S]*?}[\s\S]*?}/); if (!getAlgorithmInfoMatch) { throw new Error('Could not extract getAlgorithmInfo function from source'); } // Extract the getAlgorithmInfo function directly from source // This is a simplified version for testing function getAlgorithmInfo(pattern) { const patternLen = pattern.length; if (patternLen < 3) { return 'KMP (Knuth-Morris-Pratt) - Optimized for very short patterns'; } else if (patternLen > 16) { return 'Rabin-Karp - Efficient for longer patterns with better hash distribution'; } else { // Check if we're likely on a platform with SIMD support const isAppleSilicon = process.platform === 'darwin' && process.arch === 'arm64'; const isModernX64 = process.platform !== 'darwin' && process.arch === 'x64'; if (isAppleSilicon) { return 'NEON SIMD - Hardware-accelerated search on Apple Silicon'; } else if (isModernX64) { return 'SSE4.2/AVX2 - Hardware-accelerated search with vector instructions'; } else { return 'Boyer-Moore-Horspool - Efficient general-purpose string search'; } } } describe('Algorithm Selection', () => { // Save the original process values const originalPlatform = process.platform; const originalArch = process.arch; // Mock process properties to test different hardware detection beforeEach(() => { // Create mutable getters for platform and arch Object.defineProperty(process, 'platform', { get: jest.fn().mockReturnValue(originalPlatform), configurable: true }); Object.defineProperty(process, 'arch', { get: jest.fn().mockReturnValue(originalArch), configurable: true }); }); // Restore original process values afterEach(() => { Object.defineProperty(process, 'platform', { get: () => originalPlatform, configurable: true }); Object.defineProperty(process, 'arch', { get: () => originalArch, configurable: true }); }); describe('Pattern Length Decision', () => { it('should select KMP for very short patterns', () => { expect(getAlgorithmInfo('a')).toMatch(/KMP/); expect(getAlgorithmInfo('ab')).toMatch(/KMP/); }); it('should select appropriate algorithm for medium patterns', () => { const result = getAlgorithmInfo('medium'); // The exact algorithm depends on the hardware, but should be one of these expect(['Boyer-Moore-Horspool', 'NEON SIMD', 'SSE4.2/AVX2'].some(alg => result.includes(alg))).toBe(true); }); it('should select Rabin-Karp for longer patterns', () => { expect(getAlgorithmInfo('thisisalongpatternfortest')).toMatch(/Rabin-Karp/); }); }); describe('Hardware Detection', () => { it('should detect Apple Silicon', () => { // Mock Apple Silicon jest.spyOn(process, 'platform', 'get').mockReturnValue('darwin'); jest.spyOn(process, 'arch', 'get').mockReturnValue('arm64'); expect(getAlgorithmInfo('medium')).toMatch(/NEON SIMD/); }); it('should detect x64 architecture', () => { // Mock x64 Linux jest.spyOn(process, 'platform', 'get').mockReturnValue('linux'); jest.spyOn(process, 'arch', 'get').mockReturnValue('x64'); expect(getAlgorithmInfo('medium')).toMatch(/SSE4.2\/AVX2/); }); it('should fallback to Boyer-Moore-Horspool for other architectures', () => { // Mock ARM Linux (not Apple Silicon) jest.spyOn(process, 'platform', 'get').mockReturnValue('linux'); jest.spyOn(process, 'arch', 'get').mockReturnValue('arm'); expect(getAlgorithmInfo('medium')).toMatch(/Boyer-Moore-Horspool/); }); }); });

Latest Blog Posts

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/bmorphism/krep-mcp-server'

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