2026-03-09 12:20:15 -07:00
|
|
|
/**
|
|
|
|
|
* @license
|
|
|
|
|
* Copyright 2026 Google LLC
|
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
import { renderWithProviders } from '../../../test-utils/render.js';
|
2026-03-18 16:38:56 +00:00
|
|
|
import { createMockSettings } from '../../../test-utils/settings.js';
|
2026-03-09 12:20:15 -07:00
|
|
|
import { ToolResultDisplay } from './ToolResultDisplay.js';
|
|
|
|
|
import { describe, it, expect } from 'vitest';
|
2026-03-18 16:38:56 +00:00
|
|
|
import { makeFakeConfig, type AnsiOutput } from '@google/gemini-cli-core';
|
2026-03-09 12:20:15 -07:00
|
|
|
|
|
|
|
|
describe('ToolResultDisplay Overflow', () => {
|
|
|
|
|
it('shows the head of the content when overflowDirection is bottom (string)', async () => {
|
|
|
|
|
const content = 'Line 1\nLine 2\nLine 3\nLine 4\nLine 5';
|
2026-03-19 17:05:33 +00:00
|
|
|
const { lastFrame, waitUntilReady, unmount } = await renderWithProviders(
|
2026-03-09 12:20:15 -07:00
|
|
|
<ToolResultDisplay
|
|
|
|
|
resultDisplay={content}
|
|
|
|
|
terminalWidth={80}
|
|
|
|
|
maxLines={3}
|
|
|
|
|
overflowDirection="bottom"
|
|
|
|
|
/>,
|
|
|
|
|
{
|
2026-03-18 16:38:56 +00:00
|
|
|
config: makeFakeConfig({ useAlternateBuffer: false }),
|
2026-03-18 18:12:44 +00:00
|
|
|
settings: createMockSettings({ ui: { useAlternateBuffer: false } }),
|
2026-03-09 12:20:15 -07:00
|
|
|
uiState: { constrainHeight: true },
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
await waitUntilReady();
|
|
|
|
|
const output = lastFrame();
|
|
|
|
|
|
|
|
|
|
expect(output).toContain('Line 1');
|
|
|
|
|
expect(output).toContain('Line 2');
|
|
|
|
|
expect(output).not.toContain('Line 3'); // Line 3 is replaced by the "hidden" label
|
|
|
|
|
expect(output).not.toContain('Line 4');
|
|
|
|
|
expect(output).not.toContain('Line 5');
|
|
|
|
|
expect(output).toContain('hidden');
|
|
|
|
|
unmount();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('shows the tail of the content when overflowDirection is top (string default)', async () => {
|
|
|
|
|
const content = 'Line 1\nLine 2\nLine 3\nLine 4\nLine 5';
|
2026-03-19 17:05:33 +00:00
|
|
|
const { lastFrame, waitUntilReady, unmount } = await renderWithProviders(
|
2026-03-09 12:20:15 -07:00
|
|
|
<ToolResultDisplay
|
|
|
|
|
resultDisplay={content}
|
|
|
|
|
terminalWidth={80}
|
|
|
|
|
maxLines={3}
|
|
|
|
|
overflowDirection="top"
|
|
|
|
|
/>,
|
|
|
|
|
{
|
2026-03-18 16:38:56 +00:00
|
|
|
config: makeFakeConfig({ useAlternateBuffer: false }),
|
2026-03-18 18:12:44 +00:00
|
|
|
settings: createMockSettings({ ui: { useAlternateBuffer: false } }),
|
2026-03-09 12:20:15 -07:00
|
|
|
uiState: { constrainHeight: true },
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
await waitUntilReady();
|
|
|
|
|
const output = lastFrame();
|
|
|
|
|
|
|
|
|
|
expect(output).not.toContain('Line 1');
|
|
|
|
|
expect(output).not.toContain('Line 2');
|
|
|
|
|
expect(output).not.toContain('Line 3');
|
|
|
|
|
expect(output).toContain('Line 4');
|
|
|
|
|
expect(output).toContain('Line 5');
|
|
|
|
|
expect(output).toContain('hidden');
|
|
|
|
|
unmount();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('shows the head of the content when overflowDirection is bottom (ANSI)', async () => {
|
|
|
|
|
const ansiResult: AnsiOutput = Array.from({ length: 5 }, (_, i) => [
|
|
|
|
|
{
|
|
|
|
|
text: `Line ${i + 1}`,
|
|
|
|
|
fg: '',
|
|
|
|
|
bg: '',
|
|
|
|
|
bold: false,
|
|
|
|
|
italic: false,
|
|
|
|
|
underline: false,
|
|
|
|
|
dim: false,
|
|
|
|
|
inverse: false,
|
|
|
|
|
},
|
|
|
|
|
]);
|
2026-03-19 17:05:33 +00:00
|
|
|
const { lastFrame, waitUntilReady, unmount } = await renderWithProviders(
|
2026-03-09 12:20:15 -07:00
|
|
|
<ToolResultDisplay
|
|
|
|
|
resultDisplay={ansiResult}
|
|
|
|
|
terminalWidth={80}
|
|
|
|
|
maxLines={3}
|
|
|
|
|
overflowDirection="bottom"
|
|
|
|
|
/>,
|
|
|
|
|
{
|
2026-03-18 16:38:56 +00:00
|
|
|
config: makeFakeConfig({ useAlternateBuffer: false }),
|
2026-03-18 18:12:44 +00:00
|
|
|
settings: createMockSettings({ ui: { useAlternateBuffer: false } }),
|
2026-03-09 12:20:15 -07:00
|
|
|
uiState: { constrainHeight: true },
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
await waitUntilReady();
|
|
|
|
|
const output = lastFrame();
|
|
|
|
|
|
|
|
|
|
expect(output).toContain('Line 1');
|
|
|
|
|
expect(output).toContain('Line 2');
|
|
|
|
|
expect(output).not.toContain('Line 3');
|
|
|
|
|
expect(output).not.toContain('Line 4');
|
|
|
|
|
expect(output).not.toContain('Line 5');
|
|
|
|
|
expect(output).toContain('hidden');
|
|
|
|
|
unmount();
|
|
|
|
|
});
|
|
|
|
|
});
|