Files
maestro/ui/src/components/spaces/ChatDetailSplit.test.ts
T
oss-sync 29ccaf1e92
CI / build-and-test (push) Has been cancelled
sync: update from private repo (dfadcd5f)
2026-06-23 06:38:48 +00:00

61 lines
2.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, it, expect } from 'vitest';
import {
clampSplitLeft,
splitFitsWidth,
SPLIT_MIN_LEFT,
SPLIT_MIN_RIGHT,
SPLIT_HANDLE_PX,
SPLIT_MIN_TOTAL,
} from './ChatDetailSplit';
describe('clampSplitLeft', () => {
// 広いコンテナ: 望む幅をそのまま使える範囲
const WIDE = 1400;
it('returns the desired width when within bounds', () => {
expect(clampSplitLeft(600, WIDE)).toBe(600);
});
it('clamps to the left minimum', () => {
expect(clampSplitLeft(50, WIDE)).toBe(SPLIT_MIN_LEFT);
expect(clampSplitLeft(-100, WIDE)).toBe(SPLIT_MIN_LEFT);
});
it('clamps to leave at least the right minimum (+ handle)', () => {
const maxLeft = WIDE - SPLIT_HANDLE_PX - SPLIT_MIN_RIGHT;
expect(clampSplitLeft(WIDE, WIDE)).toBe(maxLeft);
expect(clampSplitLeft(maxLeft + 200, WIDE)).toBe(maxLeft);
});
it('when the container is too narrow to satisfy both minimums, falls back to min-left', () => {
// total < minLeft + handle + minRight → maxLeft would dip below minLeft;
// Math.max keeps it at minLeft so the left pane is never below its floor.
const narrow = SPLIT_MIN_LEFT + SPLIT_MIN_RIGHT - 50; // intentionally too small
expect(clampSplitLeft(1000, narrow)).toBe(SPLIT_MIN_LEFT);
expect(clampSplitLeft(10, narrow)).toBe(SPLIT_MIN_LEFT);
});
it('honors custom min/handle arguments', () => {
expect(clampSplitLeft(100, 1000, 200, 200, 10)).toBe(200); // below custom minLeft
expect(clampSplitLeft(900, 1000, 200, 200, 10)).toBe(1000 - 10 - 200); // capped by custom minRight
});
});
describe('splitFitsWidth', () => {
it('is optimistic before measurement (width 0)', () => {
expect(splitFitsWidth(0)).toBe(true);
});
it('allows the split only when both minimums + handle fit', () => {
expect(splitFitsWidth(SPLIT_MIN_TOTAL)).toBe(true);
expect(splitFitsWidth(SPLIT_MIN_TOTAL + 200)).toBe(true);
expect(splitFitsWidth(SPLIT_MIN_TOTAL - 1)).toBe(false);
});
it('rejects a cramped mid-width container (~488px = rail+list eat the row)', () => {
// regression: 1024px window 256 rail 280 list ≈ 488px container
expect(splitFitsWidth(488)).toBe(false);
expect(SPLIT_MIN_TOTAL).toBe(SPLIT_MIN_LEFT + SPLIT_HANDLE_PX + SPLIT_MIN_RIGHT);
});
});