@xynogen/pix-pretty 1.19.0 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,127 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
- import {
3
- describeActivity,
4
- fmtTokenCount,
5
- formatContext,
6
- formatDuration,
7
- formatMs,
8
- formatSpeed,
9
- formatTokens,
10
- formatToolUses,
11
- formatTurns,
12
- getSessionContextPercent,
13
- getSessionContextUsage,
14
- SPINNER,
15
- truncateLine,
16
- } from "./widget-format.ts";
17
-
18
- const stripAnsi = (text: string) => text.replace(/\x1b\[[0-9;]*m/g, "");
19
-
20
- describe("widget formatters", () => {
21
- test("SPINNER has frames to cycle", () => {
22
- expect(SPINNER.length).toBeGreaterThan(1);
23
- });
24
-
25
- test("fmtTokenCount scales with magnitude", () => {
26
- expect(fmtTokenCount(500)).toBe("500");
27
- expect(fmtTokenCount(30_100)).toBe("30.1K");
28
- expect(fmtTokenCount(1_000_000)).toBe("1.00M");
29
- });
30
-
31
- test("formatTokens uses ' token' / 'k token' / 'M token' variants", () => {
32
- expect(stripAnsi(formatTokens(500))).toContain("500 token");
33
- expect(stripAnsi(formatTokens(12_400))).toContain("12.4k token");
34
- expect(stripAnsi(formatTokens(2_500_000))).toContain("2.5M token");
35
- });
36
-
37
- test("formatMs renders seconds to one decimal", () => {
38
- expect(formatMs(2_100)).toBe("2.1s");
39
- });
40
-
41
- test("formatDuration keeps 3 presentations via style param", () => {
42
- expect(formatDuration(420, "bash")).toBe("420ms");
43
- expect(formatDuration(2_450, "bash")).toBe("2.5s");
44
- expect(formatDuration(12_400, "bash")).toBe("12s");
45
- expect(formatDuration(450, "btw")).toBe("450ms");
46
- expect(formatDuration(2_100, "btw")).toBe("2.1s");
47
- expect(formatDuration(12_400, "btw")).toBe("12s");
48
- expect(formatDuration(65_000, "btw")).toBe("1m 5s");
49
- expect(formatDuration(2_100)).toBe("2.1s");
50
- expect(formatDuration(2_100, "ms")).toBe(formatMs(2_100));
51
- });
52
-
53
- test("formatSpeed returns empty when there is no work", () => {
54
- expect(formatSpeed(0, 1_000)).toBe("");
55
- expect(formatSpeed(100, 0)).toBe("");
56
- expect(stripAnsi(formatSpeed(200, 2_000))).toBe("100 t/s");
57
- });
58
-
59
- test("formatContext shows used/window/percent, or empty when unknown", () => {
60
- expect(formatContext(null)).toBe("");
61
- expect(formatContext({ tokens: null, contextWindow: null, percent: null })).toBe("");
62
- expect(
63
- stripAnsi(formatContext({ tokens: 30_100, contextWindow: 1_000_000, percent: 3 })),
64
- ).toContain("30.1K/1.00M (3%)");
65
- expect(stripAnsi(formatContext({ tokens: null, contextWindow: null, percent: 42 }))).toContain(
66
- "42% ctx",
67
- );
68
- });
69
-
70
- test("formatTurns and formatToolUses render counts", () => {
71
- expect(stripAnsi(formatTurns(3))).toContain("3");
72
- expect(stripAnsi(formatTurns(3, 10))).toContain("3\u226410");
73
- expect(stripAnsi(formatToolUses(5))).toContain("5");
74
- });
75
-
76
- test("truncateLine tail-anchors the latest non-empty line to len", () => {
77
- expect(truncateLine("short", 32)).toBe("short");
78
- expect(truncateLine("a\nb\nlatest", 32)).toBe("latest");
79
- expect(truncateLine("0123456789", 4)).toBe("\u20266789");
80
- });
81
-
82
- test("describeActivity groups active tools, tails text (default 32), else thinking", () => {
83
- const two = new Map<string, string>([
84
- ["0", "read"],
85
- ["1", "read"],
86
- ]);
87
- expect(describeActivity(two)).toBe("reading 2\u00d7\u2026");
88
- expect(describeActivity(new Map(), "line one\nlatest line")).toBe("latest line");
89
- expect(describeActivity(new Map())).toBe("thinking\u2026");
90
- });
91
-
92
- test("describeActivity honors an explicit tailLen", () => {
93
- expect(describeActivity(new Map(), "0123456789", 4)).toBe("\u20266789");
94
- });
95
-
96
- test("getSessionContextUsage reads stats and tolerates throwing sessions", () => {
97
- const session = {
98
- getSessionStats: () => ({
99
- tokens: { input: 0, output: 0, cacheWrite: 0 },
100
- contextUsage: { tokens: 10, contextWindow: 100, percent: 10 },
101
- }),
102
- };
103
- expect(getSessionContextUsage(session)).toEqual({
104
- tokens: 10,
105
- contextWindow: 100,
106
- percent: 10,
107
- });
108
- expect(getSessionContextUsage(undefined)).toBeNull();
109
- const throwing = {
110
- getSessionStats: () => {
111
- throw new Error("no stats");
112
- },
113
- };
114
- expect(getSessionContextUsage(throwing)).toBeNull();
115
- });
116
-
117
- test("getSessionContextPercent returns just the percent, or null", () => {
118
- const session = {
119
- getSessionStats: () => ({
120
- tokens: { input: 0, output: 0, cacheWrite: 0 },
121
- contextUsage: { tokens: 10, contextWindow: 100, percent: 42 },
122
- }),
123
- };
124
- expect(getSessionContextPercent(session)).toBe(42);
125
- expect(getSessionContextPercent(undefined)).toBeNull();
126
- });
127
- });