import { describe, expect, it } from "vite-plus/test"; import { fileBreadcrumbChildren, fileBreadcrumbParent, fileBreadcrumbs } from "./filePath"; describe("fileBreadcrumbs", () => { it("builds project, directory, and file crumbs", () => { expect(fileBreadcrumbs("t3code", "apps/web/src/main.tsx")).toEqual([ { label: "t3code", path: "", kind: "project" }, { label: "apps", path: "apps", kind: "directory" }, { label: "web", path: "apps/web", kind: "directory" }, { label: "src", path: "apps/web/src", kind: "directory" }, { label: "main.tsx", path: "apps/web/src/main.tsx", kind: "file" }, ]); }); it("normalizes repeated separators", () => { expect(fileBreadcrumbs("workspace", "src//index.ts").map((crumb) => crumb.label)).toEqual([ "workspace", "src", "index.ts", ]); }); it("starts host paths outside the workspace at the filesystem root", () => { expect(fileBreadcrumbs("t3code", "/tmp/t3-cleanup/report.md")).toEqual([ { label: "tmp", path: "/tmp", kind: "directory" }, { label: "t3-cleanup", path: "/tmp/t3-cleanup", kind: "directory" }, { label: "report.md", path: "/tmp/t3-cleanup/report.md", kind: "file" }, ]); expect(fileBreadcrumbs("t3code", "C:\\Temp\\report.md")).toEqual([ { label: "C:", path: "C:", kind: "directory" }, { label: "Temp", path: "C:\\Temp", kind: "directory" }, { label: "report.md", path: "C:\\Temp\\report.md", kind: "file" }, ]); expect(fileBreadcrumbs("t3code", "\\\\server\\share\\report.md").map((c) => c.path)).toEqual([ "\\\\server", "\\\\server\\share", "\\\\server\\share\\report.md", ]); });}); describe("fileBreadcrumbChildren", () => { const entries = [ { path: "README.md", kind: "file" as const }, { path: "src", kind: "directory" as const }, { path: "src-old", kind: "directory" as const }, { path: "src/index.ts", kind: "file" as const }, { path: "src/lib", kind: "directory" as const }, { path: "src/lib/file10.ts", kind: "file" as const }, { path: "src/lib/file2.ts", kind: "file" as const }, { path: "src-old/index.ts", kind: "file" as const }, ]; it("returns only the immediate children of the project root", () => { expect(fileBreadcrumbChildren(entries, "")).toEqual([ { path: "src", kind: "directory", label: "src" }, { path: "src-old", kind: "directory", label: "src-old" }, { path: "README.md", kind: "file", label: "README.md" }, ]); }); it("honors segment boundaries and sorts folders before files", () => { expect(fileBreadcrumbChildren(entries, "src")).toEqual([ { path: "src/lib", kind: "directory", label: "lib" }, { path: "src/index.ts", kind: "file", label: "index.ts" }, ]); }); it("uses natural file-name ordering and preserves input order for equivalent names", () => { const files = ["file10.ts", "File2.ts", "file02.ts", "file2.ts"].map((name) => ({ path: `src/lib/${name}`, kind: "file" as const, })); expect(fileBreadcrumbChildren(files, "src/lib").map((entry) => entry.label)).toEqual([ "File2.ts", "file02.ts", "file2.ts", "file10.ts", ]); }); it("returns an empty list for an empty or missing directory", () => { expect(fileBreadcrumbChildren(entries, "missing")).toEqual([]); });}); describe("fileBreadcrumbParent", () => { it.each([ ["src/lib", "src"], ["src", ""], ["", null], ])("returns the parent of %j", (path, expected) => { expect(fileBreadcrumbParent(path)).toBe(expected); });});
import { describe, expect, it } from "vite-plus/test";
import { fileBreadcrumbChildren, fileBreadcrumbParent, fileBreadcrumbs } from "./filePath";
describe("fileBreadcrumbs", () => {
it("builds project, directory, and file crumbs", () => {
expect(fileBreadcrumbs("t3code", "apps/web/src/main.tsx")).toEqual([
{ label: "t3code", path: "", kind: "project" },
{ label: "apps", path: "apps", kind: "directory" },
{ label: "web", path: "apps/web", kind: "directory" },
{ label: "src", path: "apps/web/src", kind: "directory" },
{ label: "main.tsx", path: "apps/web/src/main.tsx", kind: "file" },
]);
});
it("normalizes repeated separators", () => {
expect(fileBreadcrumbs("workspace", "src//index.ts").map((crumb) => crumb.label)).toEqual([
"workspace",
"src",
"index.ts",
]);
});
it("starts host paths outside the workspace at the filesystem root", () => {
expect(fileBreadcrumbs("t3code", "/tmp/t3-cleanup/report.md")).toEqual([
{ label: "tmp", path: "/tmp", kind: "directory" },
{ label: "t3-cleanup", path: "/tmp/t3-cleanup", kind: "directory" },
{ label: "report.md", path: "/tmp/t3-cleanup/report.md", kind: "file" },
]);
expect(fileBreadcrumbs("t3code", "C:\\Temp\\report.md")).toEqual([
{ label: "C:", path: "C:", kind: "directory" },
{ label: "Temp", path: "C:\\Temp", kind: "directory" },
{ label: "report.md", path: "C:\\Temp\\report.md", kind: "file" },
]);
expect(fileBreadcrumbs("t3code", "\\\\server\\share\\report.md").map((c) => c.path)).toEqual([
"\\\\server",
"\\\\server\\share",
"\\\\server\\share\\report.md",
]);
});
});
describe("fileBreadcrumbChildren", () => {
const entries = [
{ path: "README.md", kind: "file" as const },
{ path: "src", kind: "directory" as const },
{ path: "src-old", kind: "directory" as const },
{ path: "src/index.ts", kind: "file" as const },
{ path: "src/lib", kind: "directory" as const },
{ path: "src/lib/file10.ts", kind: "file" as const },
{ path: "src/lib/file2.ts", kind: "file" as const },
{ path: "src-old/index.ts", kind: "file" as const },
];
it("returns only the immediate children of the project root", () => {
expect(fileBreadcrumbChildren(entries, "")).toEqual([
{ path: "src", kind: "directory", label: "src" },
{ path: "src-old", kind: "directory", label: "src-old" },
{ path: "README.md", kind: "file", label: "README.md" },
]);
});
it("honors segment boundaries and sorts folders before files", () => {
expect(fileBreadcrumbChildren(entries, "src")).toEqual([
{ path: "src/lib", kind: "directory", label: "lib" },
{ path: "src/index.ts", kind: "file", label: "index.ts" },
]);
});
it("uses natural file-name ordering and preserves input order for equivalent names", () => {
const files = ["file10.ts", "File2.ts", "file02.ts", "file2.ts"].map((name) => ({
path: `src/lib/${name}`,
kind: "file" as const,
}));
expect(fileBreadcrumbChildren(files, "src/lib").map((entry) => entry.label)).toEqual([
"File2.ts",
"file02.ts",
"file2.ts",
"file10.ts",
]);
});
it("returns an empty list for an empty or missing directory", () => {
expect(fileBreadcrumbChildren(entries, "missing")).toEqual([]);
});
});
describe("fileBreadcrumbParent", () => {
it.each([
["src/lib", "src"],
["src", ""],
["", null],
])("returns the parent of %j", (path, expected) => {
expect(fileBreadcrumbParent(path)).toBe(expected);
});
});