Files
2026-07-13 13:39:12 +08:00

65 lines
2.3 KiB
TypeScript

import { describe, it } from "node:test";
import assert from "node:assert/strict";
import { lastCommandSegment } from "../../../open-sse/services/compression/engines/rtk/splitCompositeCommand.ts";
describe("lastCommandSegment", () => {
it("splits on && and returns the last segment", () => {
assert.equal(lastCommandSegment("cd /x && git status"), "git status");
});
it("splits on || and returns the last segment", () => {
assert.equal(lastCommandSegment("npm i || yarn"), "yarn");
});
it("splits on ; and returns the last segment", () => {
assert.equal(lastCommandSegment("make; git status"), "git status");
});
it("does not split inside double quotes", () => {
assert.equal(lastCommandSegment('cd "a && b" && git log'), "git log");
});
it("does not split inside single quotes", () => {
assert.equal(lastCommandSegment("cd 'a && b' && git log"), "git log");
});
it("does not split inside backtick subshell", () => {
assert.equal(lastCommandSegment("echo `git rev-parse` && git status"), "git status");
});
it("does not split inside $(...) subshell", () => {
assert.equal(lastCommandSegment("echo $(git rev-parse) && git status"), "git status");
});
it("returns input unchanged when no top-level separator exists", () => {
assert.equal(lastCommandSegment("git status"), "git status");
assert.equal(lastCommandSegment("npm install"), "npm install");
});
it("returns input unchanged for empty string", () => {
assert.equal(lastCommandSegment(""), "");
});
it("falls back to previous segment when last segment is empty", () => {
// trailing separator — last segment is empty, should fall back
assert.equal(lastCommandSegment("git status &&"), "git status");
});
it("trims whitespace from returned segment", () => {
assert.equal(lastCommandSegment("cd /tmp && git log"), "git log");
});
it("handles chained operators returning the very last non-empty segment", () => {
assert.equal(lastCommandSegment("a && b && git diff"), "git diff");
});
it("returns fast on a pathological ReDoS-style string (< 50ms)", () => {
const pathological = "a".repeat(10000) + " && " + "b".repeat(10000);
const start = Date.now();
lastCommandSegment(pathological);
const elapsed = Date.now() - start;
assert.ok(elapsed < 50, `took ${elapsed}ms, expected < 50ms`);
});
});