mirror of
https://github.com/YuzuZensai/Termix.git
synced 2026-09-14 02:59:06 +00:00
70 lines
2.5 KiB
TypeScript
70 lines
2.5 KiB
TypeScript
import { describe, it, expect } from "vitest";
|
|||
|
|
import { act, renderHook } from "@testing-library/react";
|
||
|
|
import { useFileSelection } from "./useFileSelection.js";
|
||
|
|
|
||
|
|
type FileItem = {
|
||
|
|
name: string;
|
||
|
|
type: "file" | "directory" | "link";
|
||
|
|
path: string;
|
||
|
|
};
|
||
|
|
|
||
|
|
const f = (name: string): FileItem => ({
|
||
|
|
name,
|
||
|
|
type: "file",
|
||
|
|
path: `/dir/${name}`,
|
||
|
|
});
|
||
|
|
|
||
|
|
describe("useFileSelection", () => {
|
||
|
|
it("single-selects, replacing prior selection", () => {
|
||
|
|
const { result } = renderHook(() => useFileSelection());
|
||
|
|
act(() => result.current.selectFile(f("a")));
|
||
|
|
act(() => result.current.selectFile(f("b")));
|
||
|
|
expect(result.current.selectedFiles.map((x) => x.name)).toEqual(["b"]);
|
||
|
|
expect(result.current.getSelectedCount()).toBe(1);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("multi-selects and toggles off on repeat", () => {
|
||
|
|
const { result } = renderHook(() => useFileSelection());
|
||
|
|
act(() => result.current.selectFile(f("a"), true));
|
||
|
|
act(() => result.current.selectFile(f("b"), true));
|
||
|
|
expect(result.current.getSelectedCount()).toBe(2);
|
||
|
|
act(() => result.current.selectFile(f("a"), true));
|
||
|
|
expect(result.current.selectedFiles.map((x) => x.name)).toEqual(["b"]);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("reports isSelected by path", () => {
|
||
|
|
const { result } = renderHook(() => useFileSelection());
|
||
|
|
act(() => result.current.selectFile(f("a")));
|
||
|
|
expect(result.current.isSelected(f("a"))).toBe(true);
|
||
|
|
expect(result.current.isSelected(f("z"))).toBe(false);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("selects a contiguous range regardless of direction", () => {
|
||
|
|
const { result } = renderHook(() => useFileSelection());
|
||
|
|
const files = [f("a"), f("b"), f("c"), f("d")];
|
||
|
|
act(() => result.current.selectRange(files, files[3], files[1]));
|
||
|
|
expect(result.current.selectedFiles.map((x) => x.name)).toEqual([
|
||
|
|
"b",
|
||
|
|
"c",
|
||
|
|
"d",
|
||
|
|
]);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("selects all and clears", () => {
|
||
|
|
const { result } = renderHook(() => useFileSelection());
|
||
|
|
const files = [f("a"), f("b")];
|
||
|
|
act(() => result.current.selectAll(files));
|
||
|
|
expect(result.current.getSelectedCount()).toBe(2);
|
||
|
|
act(() => result.current.clearSelection());
|
||
|
|
expect(result.current.getSelectedCount()).toBe(0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("toggleSelection adds then removes", () => {
|
||
|
|
const { result } = renderHook(() => useFileSelection());
|
||
|
|
act(() => result.current.toggleSelection(f("a")));
|
||
|
|
expect(result.current.isSelected(f("a"))).toBe(true);
|
||
|
|
act(() => result.current.toggleSelection(f("a")));
|
||
|
|
expect(result.current.isSelected(f("a"))).toBe(false);
|
||
|
|
});
|
||
|
|
});
|