Files
gemini-cli/packages/cli/src/ui/components/shared/performance.test.ts
2026-02-09 21:19:51 +00:00

92 lines
2.5 KiB
TypeScript

/**
* @license
* Copyright 2026 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import { describe, it, expect, afterEach, vi } from 'vitest';
import { act } from 'react';
import { renderHook } from '../../../test-utils/render.js';
import { useTextBuffer } from './text-buffer.js';
import { parseInputForHighlighting } from '../../utils/highlight.js';
describe('text-buffer performance', () => {
afterEach(() => {
vi.restoreAllMocks();
});
it('should handle pasting large amounts of text efficiently', () => {
const viewport = { width: 80, height: 24 };
const { result } = renderHook(() =>
useTextBuffer({
viewport,
}),
);
const lines = 5000;
const largeText = Array.from(
{ length: lines },
(_, i) =>
`Line ${i}: some sample text with many @path/to/image${i}.png and maybe some more @path/to/another/image.png references to trigger regex. This line is much longer than the previous one to test wrapping.`,
).join('\n');
const start = Date.now();
act(() => {
result.current.insert(largeText, { paste: true });
});
const end = Date.now();
const duration = end - start;
expect(duration).toBeLessThan(5000);
});
it('should handle character-by-character insertion in a large buffer efficiently', () => {
const lines = 5000;
const initialText = Array.from(
{ length: lines },
(_, i) => `Line ${i}: some sample text with @path/to/image.png`,
).join('\n');
const viewport = { width: 80, height: 24 };
const { result } = renderHook(() =>
useTextBuffer({
initialText,
viewport,
}),
);
const start = Date.now();
const charsToInsert = 100;
for (let i = 0; i < charsToInsert; i++) {
act(() => {
result.current.insert('a');
});
}
const end = Date.now();
const duration = end - start;
expect(duration).toBeLessThan(5000);
});
it('should highlight many lines efficiently', () => {
const lines = 5000;
const sampleLines = Array.from(
{ length: lines },
(_, i) =>
`Line ${i}: some sample text with @path/to/image${i}.png /command and more @file.txt`,
);
const start = Date.now();
for (let i = 0; i < 100; i++) {
// Simulate 100 renders
for (const line of sampleLines.slice(0, 20)) {
// 20 visible lines
parseInputForHighlighting(line, 1, []);
}
}
const end = Date.now();
const duration = end - start;
expect(duration).toBeLessThan(500);
});
});