Files
oh-my-pi/packages/utils/test/spacing.test.ts
T
can1357 9b78a6fa85 refactor(natives): migrated native bindings to NAPI-RS with auto-generated types
- Migrated native bindings from TypeScript wrappers to NAPI-RS generated modules with auto-generated type definitions and runtime enums.
- Replaced chunk tree API with stateful ChunkState class supporting render, edit, and resolve operations with improved error handling.
- Converted callback signatures to error-first pattern (error, result) for shell, PTY, glob, and grep operations.
- Introduced type-safe enums for MacOSAppearance, GrepOutputMode, KeyEventType, ImageFormat, and AstMatchStrictness replacing string literals.
- Refactored chunk tree implementation with dedicated modules for edit, indent, resolve, and state management with comprehensive validation.
- Moved clipboard utilities from native bindings to coding-agent package with improved OSC 52 and Termux compatibility.
2026-04-07 02:00:59 +02:00

60 lines
2.2 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it } from "bun:test";
import * as fs from "node:fs/promises";
import * as os from "node:os";
import * as path from "node:path";
import { getDefaultTabWidth, getIndentation, setDefaultTabWidth } from "@oh-my-pi/pi-natives";
import { getProjectDir, setProjectDir } from "../src/dirs";
import { Snowflake } from "../src/snowflake";
describe("spacing", () => {
let tempDir = "";
let previousProjectDir = "";
beforeEach(async () => {
previousProjectDir = getProjectDir();
tempDir = path.join(os.tmpdir(), "pi-utils-spacing", Snowflake.next());
await fs.mkdir(tempDir, { recursive: true });
setProjectDir(tempDir);
setDefaultTabWidth(3);
});
afterEach(async () => {
setDefaultTabWidth(3);
setProjectDir(previousProjectDir);
await fs.rm(tempDir, { recursive: true, force: true });
});
it("uses configurable default tab width", () => {
expect(getDefaultTabWidth()).toBe(3);
expect(" ".repeat(getIndentation())).toBe(" ");
setDefaultTabWidth(5);
expect(getDefaultTabWidth()).toBe(5);
expect(" ".repeat(getIndentation())).toBe(" ");
});
it("resolves editorconfig rules for file path and falls back to default", async () => {
const filePath = path.join(tempDir, "src", "feature.ts");
await fs.mkdir(path.dirname(filePath), { recursive: true });
await fs.writeFile(
path.join(tempDir, ".editorconfig"),
["root = true", "", "[*]", "indent_size = 2", "", "[*.md]", "indent_size = 4"].join("\n"),
);
expect(" ".repeat(getIndentation(filePath))).toBe(" ");
expect(" ".repeat(getIndentation(path.join(tempDir, "README.md")))).toBe(" ");
expect(" ".repeat(getIndentation(path.join(tempDir, "missing.txt")))).toBe(" ");
});
it("merges nested editorconfig files from root to leaf", async () => {
const nestedDir = path.join(tempDir, "packages", "feature");
const filePath = path.join(nestedDir, "index.ts");
await fs.mkdir(nestedDir, { recursive: true });
await fs.writeFile(path.join(tempDir, ".editorconfig"), ["root = true", "", "[*]", "indent_size = 2"].join("\n"));
await fs.writeFile(path.join(tempDir, "packages", ".editorconfig"), ["[*.ts]", "indent_size = 6"].join("\n"));
expect(" ".repeat(getIndentation(filePath))).toBe(" ");
});
});