describe('Input Validation Edge Cases', () => {
it('should handle empty strings', () => {
const args = {
text1: '',
text2: ''
}
// const result = validateDiffInputs(args)
// expect(result.text1).toBe('')
// expect(result.text2).toBe('')
})
it('should handle very large texts', () => {
const largeText = 'A'.repeat(1000000) // 1MB
const args = {
text1: largeText,
text2: largeText + '!'
}
// const result = validateDiffInputs(args)
// expect(result.text1).toBe(largeText)
// expect(result.text2).toBe(largeText + '!')
})
it('should handle unicode characters', () => {
const args = {
text1: 'Hello 🌍 World',
text2: 'Hello 🌎 World'
}
// const result = validateDiffInputs(args)
// expect(result.text1).toBe('Hello 🌍 World')
// expect(result.text2).toBe('Hello 🌎 World')
})
it('should handle special whitespace characters', () => {
const args = {
text1: 'Hello\tWorld\n',
text2: 'Hello World',
ignoreWhitespace: true
}
// const result = validateDiffInputs(args)
// const normalized = normalizeTexts(result)
// expect(normalized.text1).toBe('Hello World')
// expect(normalized.text2).toBe('Hello World')
})
})
describe('Normalization Edge Cases', () => {
it('should handle mixed line endings', () => {
const request = {
text1: 'Hello\r\nWorld\nTest\r',
text2: 'Hello\nWorld\nTest',
ignoreLineEndings: true
}
// const result = normalizeTexts(request)
// expect(result.text1).toBe('Hello\nWorld\nTest\n')
// expect(result.text2).toBe('Hello\nWorld\nTest')
})
it('should handle case normalization with unicode', () => {
const request = {
text1: 'HELLO ß WORLD',
text2: 'hello ß world',
ignoreCase: true
}
// const result = normalizeTexts(request)
// expect(result.text1).toBe('hello ß world')
// expect(result.text2).toBe('hello ß world')
})
it('should handle whitespace normalization with tabs and spaces', () => {
const request = {
text1: ' Hello\t\tWorld ',
text2: 'Hello World',
ignoreWhitespace: true
}
// const result = normalizeTexts(request)
// expect(result.text1).toBe('Hello World')
// expect(result.text2).toBe('Hello World')
})
})
describe('Diff Calculation Edge Cases', () => {
it('should handle single character differences', () => {
const request = {
text1: 'Hello World',
text2: 'Hello World!'
}
// const result = calculateDiff(request)
// expect(result.identical).toBe(false)
// expect(result.differences).toHaveLength(2) // remove, add
// expect(result.statistics.addedCharacters).toBe(1)
// expect(result.statistics.removedCharacters).toBe(0)
})
it('should handle completely different texts', () => {
const request = {
text1: 'Hello World',
text2: 'Goodbye Universe'
}
// const result = calculateDiff(request)
// expect(result.identical).toBe(false)
// expect(result.statistics.similarityPercentage).toBe(0)
// expect(result.statistics.addedLines).toBe(1)
// expect(result.statistics.removedLines).toBe(1)
})
it('should handle binary-like content', () => {
const request = {
text1: '\x00\x01\x02\x03',
text2: '\x00\x01\x02\x04'
}
// const result = calculateDiff(request)
// expect(result.identical).toBe(false)
// expect(result.differences).toBeDefined()
})
it('should handle very long lines', () => {
const longLine = 'A'.repeat(10000)
const request = {
text1: longLine,
text2: longLine + 'B'
}
// const result = calculateDiff(request)
// expect(result.identical).toBe(false)
// expect(result.statistics.addedCharacters).toBe(1)
})
it('should handle many small differences', () => {
const text1 = 'A\nB\nC\nD\nE'
const text2 = 'A\nB\nC\nD\nF'
const request = {
text1,
text2
}
// const result = calculateDiff(request)
// expect(result.identical).toBe(false)
// expect(result.statistics.addedLines).toBe(1)
// expect(result.statistics.removedLines).toBe(1)
})
})
describe('Formatting Edge Cases', () => {
it('should handle empty differences array', () => {
const result = {
identical: false,
differences: [],
summary: 'Texts differ',
statistics: {
totalLines: 0,
addedLines: 0,
removedLines: 0,
changedLines: 0,
totalCharacters: 0,
addedCharacters: 0,
removedCharacters: 0,
similarityPercentage: 100
}
}
// const formatted = addFormattedOutput(result)
// expect(formatted.formattedDiff).toBeUndefined()
})
it('should handle differences with empty values', () => {
const result = {
identical: false,
differences: [
{ type: 'equal', value: '', lineNumber: 1 },
{ type: 'add', value: 'Hello', lineNumber: 1 }
],
summary: 'Texts differ',
statistics: {
totalLines: 1,
addedLines: 1,
removedLines: 0,
changedLines: 1,
totalCharacters: 5,
addedCharacters: 5,
removedCharacters: 0,
similarityPercentage: 0
}
}
// const formatted = addFormattedOutput(result)
// expect(formatted.formattedDiff).toContain('+ Hello')
// expect(formatted.formattedDiff).not.toContain(' ') // no empty line
})
it('should handle special characters in diff output', () => {
const result = {
identical: false,
differences: [
{ type: 'add', value: 'Hello "World" <script>alert("xss")</script>\n', lineNumber: 1 }
],
summary: 'Texts differ',
statistics: {
totalLines: 1,
addedLines: 1,
removedLines: 0,
changedLines: 1,
totalCharacters: 40,
addedCharacters: 40,
removedCharacters: 0,
similarityPercentage: 0
}
}
// const formatted = addFormattedOutput(result)
// expect(formatted.formattedDiff).toContain('+ Hello "World" <script>alert("xss")</script>')
})
})
describe('Tool System Edge Cases', () => {
it('should handle malformed tool arguments', () => {
const args = {
text1: null,
text2: undefined
}
// expect(() => executeTool('compare_texts', args)).toThrow()
})
it('should handle circular references in arguments', () => {
const circular: any = { text1: 'Hello' }
circular.self = circular
// expect(() => executeTool('compare_texts', circular)).toThrow()
})
it('should handle extremely large arguments', () => {
const largeArgs = {
text1: 'A'.repeat(1000000),
text2: 'B'.repeat(1000000)
}
// This should work but might be slow
// const result = executeTool('compare_texts', largeArgs)
// expect(result.identical).toBe(false)
})
})
describe('Performance Edge Cases', () => {
it('should handle many small differences efficiently', () => {
const text1 = Array.from({ length: 1000 }, (_, i) => `Line ${i}`).join('\n')
const text2 = Array.from({ length: 1000 }, (_, i) => `Line ${i}${i % 2 === 0 ? '!' : ''}`).join('\n')
const request = {
text1,
text2
}
// const start = Date.now()
// const result = calculateDiff(request)
// const end = Date.now()
// expect(result.identical).toBe(false)
// expect(end - start).toBeLessThan(1000) // should complete in under 1 second
})
it('should handle identical large texts efficiently', () => {
const largeText = 'Hello World\n'.repeat(10000)
const request = {
text1: largeText,
text2: largeText
}
// const start = Date.now()
// const result = calculateDiff(request)
// const end = Date.now()
// expect(result.identical).toBe(true)
// expect(end - start).toBeLessThan(100) // should be very fast for identical texts
})
})