138 lines
4.6 KiB
TypeScript
138 lines
4.6 KiB
TypeScript
|
|
import { describe, it, expect, beforeEach } from 'vitest'
|
||
|
|
|
||
|
|
describe('TensorFlow.js Patch', () => {
|
||
|
|
beforeEach(() => {
|
||
|
|
// Clean up any global state before each test
|
||
|
|
if (typeof global !== 'undefined') {
|
||
|
|
delete global.__TextEncoder__
|
||
|
|
delete global.__TextDecoder__
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should have TextEncoder and TextDecoder available in Node.js environment', () => {
|
||
|
|
// Check if util.TextEncoder exists
|
||
|
|
const util = require('util')
|
||
|
|
|
||
|
|
expect(typeof util.TextEncoder).toBe('function')
|
||
|
|
expect(typeof util.TextDecoder).toBe('function')
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should apply TensorFlow patch and make globals available', async () => {
|
||
|
|
// Import the patch utility
|
||
|
|
const { applyTensorFlowPatch } = await import('../src/utils/textEncoding.ts')
|
||
|
|
|
||
|
|
// Apply the patch
|
||
|
|
await applyTensorFlowPatch()
|
||
|
|
|
||
|
|
// Check that globals are available
|
||
|
|
expect(typeof global.TextEncoder).toBe('function')
|
||
|
|
expect(typeof global.TextDecoder).toBe('function')
|
||
|
|
expect(typeof global.__TextEncoder__).toBe('function')
|
||
|
|
expect(typeof global.__TextDecoder__).toBe('function')
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should load brainy library successfully with patch applied', async () => {
|
||
|
|
try {
|
||
|
|
const brainy = await import('../dist/unified.js')
|
||
|
|
|
||
|
|
expect(brainy).toBeDefined()
|
||
|
|
expect(typeof brainy.BrainyData).toBe('function')
|
||
|
|
|
||
|
|
// Check that globals are still available after brainy import
|
||
|
|
expect(typeof global.TextEncoder).toBe('function')
|
||
|
|
expect(typeof global.TextDecoder).toBe('function')
|
||
|
|
} catch (error) {
|
||
|
|
// If there's an error, it shouldn't be related to TextEncoder
|
||
|
|
expect(error.message).not.toContain('TextEncoder')
|
||
|
|
expect(error.message).not.toContain('TextDecoder')
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should load TensorFlow.js directly after patch is applied', async () => {
|
||
|
|
// Ensure TextEncoder/TextDecoder are available
|
||
|
|
const { TextEncoder, TextDecoder } = require('util')
|
||
|
|
if (typeof global.TextEncoder === 'undefined') {
|
||
|
|
global.TextEncoder = TextEncoder
|
||
|
|
}
|
||
|
|
if (typeof global.TextDecoder === 'undefined') {
|
||
|
|
global.TextDecoder = TextDecoder
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
const tf = await import('@tensorflow/tfjs-core')
|
||
|
|
|
||
|
|
expect(tf).toBeDefined()
|
||
|
|
expect(tf.version).toBeDefined()
|
||
|
|
expect(typeof tf.version).toBe('string')
|
||
|
|
} catch (error) {
|
||
|
|
// If TensorFlow fails to load, it shouldn't be due to TextEncoder issues
|
||
|
|
expect(error.message).not.toContain('TextEncoder is not a constructor')
|
||
|
|
expect(error.message).not.toContain('TextDecoder is not a constructor')
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should handle patch application multiple times safely', async () => {
|
||
|
|
const { applyTensorFlowPatch } = await import('../src/utils/textEncoding.ts')
|
||
|
|
|
||
|
|
// Apply patch multiple times
|
||
|
|
await applyTensorFlowPatch()
|
||
|
|
await applyTensorFlowPatch()
|
||
|
|
await applyTensorFlowPatch()
|
||
|
|
|
||
|
|
// Should still work correctly
|
||
|
|
expect(typeof global.TextEncoder).toBe('function')
|
||
|
|
expect(typeof global.TextDecoder).toBe('function')
|
||
|
|
expect(typeof global.__TextEncoder__).toBe('function')
|
||
|
|
expect(typeof global.__TextDecoder__).toBe('function')
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should verify patch works with brainy library initialization', async () => {
|
||
|
|
try {
|
||
|
|
// Import brainy which should have patches built in
|
||
|
|
const brainy = await import('../dist/unified.js')
|
||
|
|
|
||
|
|
expect(brainy).toBeDefined()
|
||
|
|
expect(Object.keys(brainy)).toContain('BrainyData')
|
||
|
|
|
||
|
|
// Try to create an instance to ensure the patch is working
|
||
|
|
const db = new brainy.BrainyData({
|
||
|
|
dimensions: 2,
|
||
|
|
metric: 'euclidean'
|
||
|
|
})
|
||
|
|
|
||
|
|
expect(db).toBeDefined()
|
||
|
|
expect(db.dimensions).toBe(2)
|
||
|
|
|
||
|
|
// Initialize should work without TextEncoder errors
|
||
|
|
await db.init()
|
||
|
|
|
||
|
|
} catch (error) {
|
||
|
|
// Should not fail due to TextEncoder issues
|
||
|
|
expect(error.message).not.toContain('TextEncoder')
|
||
|
|
expect(error.message).not.toContain('TextDecoder')
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should maintain compatibility with different module systems', async () => {
|
||
|
|
// Test ES module import
|
||
|
|
try {
|
||
|
|
const brainyES = await import('../dist/unified.js')
|
||
|
|
expect(brainyES).toBeDefined()
|
||
|
|
expect(typeof brainyES.BrainyData).toBe('function')
|
||
|
|
} catch (error) {
|
||
|
|
expect(error.message).not.toContain('TextEncoder')
|
||
|
|
}
|
||
|
|
|
||
|
|
// Test CommonJS require (if available)
|
||
|
|
try {
|
||
|
|
const brainyCommon = require('../dist/unified.js')
|
||
|
|
expect(brainyCommon).toBeDefined()
|
||
|
|
} catch (error) {
|
||
|
|
// CommonJS might not be available in all environments, that's okay
|
||
|
|
if (!error.message.includes('require is not defined')) {
|
||
|
|
expect(error.message).not.toContain('TextEncoder')
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})
|
||
|
|
})
|