test: avoid line count filter allocations · openclaw/openclaw@edfc529
steipete
·
2026-05-09
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -14,6 +14,16 @@ import {
|
14 | 14 | repairBrokenSessionTranscriptFile, |
15 | 15 | } from "./doctor-session-transcripts.js"; |
16 | 16 | |
| 17 | +function countNonEmptyLines(value: string): number { |
| 18 | +let count = 0; |
| 19 | +for (const line of value.split(/\r?\n/)) { |
| 20 | +if (line) { |
| 21 | +count += 1; |
| 22 | +} |
| 23 | +} |
| 24 | +return count; |
| 25 | +} |
| 26 | + |
17 | 27 | describe("doctor session transcript repair", () => { |
18 | 28 | let root: string; |
19 | 29 | |
@@ -129,7 +139,7 @@ describe("doctor session transcript repair", () => {
|
129 | 139 | expect(title).toBe("Session transcripts"); |
130 | 140 | expect(message).toContain("duplicated prompt-rewrite branches"); |
131 | 141 | expect(message).toContain('Run "openclaw doctor --fix"'); |
132 | | -expect((await fs.readFile(filePath, "utf-8")).split(/\r?\n/).filter(Boolean)).toHaveLength(3); |
| 142 | +expect(countNonEmptyLines(await fs.readFile(filePath, "utf-8"))).toBe(3); |
133 | 143 | }); |
134 | 144 | |
135 | 145 | it("ignores ordinary branch history without internal runtime context", async () => { |
@@ -152,6 +162,6 @@ describe("doctor session transcript repair", () => {
|
152 | 162 | const result = await repairBrokenSessionTranscriptFile({ filePath, shouldRepair: true }); |
153 | 163 | |
154 | 164 | expect(result.broken).toBe(false); |
155 | | -expect((await fs.readFile(filePath, "utf-8")).split(/\r?\n/).filter(Boolean)).toHaveLength(3); |
| 165 | +expect(countNonEmptyLines(await fs.readFile(filePath, "utf-8"))).toBe(3); |
156 | 166 | }); |
157 | 167 | }); |
| Original file line number | Diff line number | Diff line change |
|---|
@@ -31,6 +31,16 @@ vi.mock("../../commands/status.js", () => ({
|
31 | 31 | getStatusSummary: vi.fn().mockResolvedValue({ ok: true }), |
32 | 32 | })); |
33 | 33 | |
| 34 | +function countMatching<T>(items: readonly T[], predicate: (item: T) => boolean): number { |
| 35 | +let count = 0; |
| 36 | +for (const item of items) { |
| 37 | +if (predicate(item)) { |
| 38 | +count += 1; |
| 39 | +} |
| 40 | +} |
| 41 | +return count; |
| 42 | +} |
| 43 | + |
34 | 44 | describe("waitForAgentJob", () => { |
35 | 45 | async function runLifecycleScenario(params: { |
36 | 46 | runIdPrefix: string; |
@@ -1212,7 +1222,7 @@ describe("exec approval handlers", () => {
|
1212 | 1222 | |
1213 | 1223 | expect(firstResolveRespond).toHaveBeenCalledWith(true, { ok: true }, undefined); |
1214 | 1224 | expect(repeatResolveRespond).toHaveBeenCalledWith(true, { ok: true }, undefined); |
1215 | | -expect(broadcasts.filter((entry) => entry.event === "exec.approval.resolved")).toHaveLength( |
| 1225 | +expect(countMatching(broadcasts, (entry) => entry.event === "exec.approval.resolved")).toBe( |
1216 | 1226 | resolvedBroadcastCount, |
1217 | 1227 | ); |
1218 | 1228 | expect(conflictingResolveRespond).toHaveBeenCalledWith( |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -4282,7 +4282,7 @@ module.exports = { id: "throws-after-import", register() {} };`,
|
4282 | 4282 | }, |
4283 | 4283 | }); |
4284 | 4284 | |
4285 | | -expect(registry.services.filter((entry) => entry.service.id === "shared-service")).toHaveLength( |
| 4285 | +expect(countMatching(registry.services, (entry) => entry.service.id === "shared-service")).toBe( |
4286 | 4286 | 1, |
4287 | 4287 | ); |
4288 | 4288 | expectNoDiagnosticContaining({ |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -18,6 +18,16 @@ type AuditFixture = {
|
18 | 18 | const OPENAI_API_KEY_MARKER = "OPENAI_API_KEY"; // pragma: allowlist secret |
19 | 19 | const MAX_AUDIT_MODELS_JSON_BYTES = 5 * 1024 * 1024; |
20 | 20 | |
| 21 | +function countNonEmptyLines(value: string): number { |
| 22 | +let count = 0; |
| 23 | +for (const line of value.split("\n")) { |
| 24 | +if (line.trim().length > 0) { |
| 25 | +count += 1; |
| 26 | +} |
| 27 | +} |
| 28 | +return count; |
| 29 | +} |
| 30 | + |
21 | 31 | async function writeJsonFile(filePath: string, value: unknown): Promise<void> { |
22 | 32 | await fs.writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf8"); |
23 | 33 | } |
@@ -334,7 +344,7 @@ describe("secrets audit", () => {
|
334 | 344 | expect(report.summary.unresolvedRefCount).toBe(0); |
335 | 345 | |
336 | 346 | const callLog = await fs.readFile(execLogPath, "utf8"); |
337 | | -const callCount = callLog.split("\n").filter((line) => line.trim().length > 0).length; |
| 347 | +const callCount = countNonEmptyLines(callLog); |
338 | 348 | expect(callCount).toBe(1); |
339 | 349 | }); |
340 | 350 | |
@@ -398,7 +408,7 @@ describe("secrets audit", () => {
|
398 | 408 | expect(report.summary.unresolvedRefCount).toBeGreaterThanOrEqual(2); |
399 | 409 | |
400 | 410 | const callLog = await fs.readFile(execLogPath, "utf8"); |
401 | | -const callCount = callLog.split("\n").filter((line) => line.trim().length > 0).length; |
| 411 | +const callCount = countNonEmptyLines(callLog); |
402 | 412 | expect(callCount).toBe(1); |
403 | 413 | }); |
404 | 414 | |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -35,6 +35,16 @@ const TS_PATHS = {
|
35 | 35 | |
36 | 36 | const OS_TS_PATHS = [TS_PATHS.linux, TS_PATHS.macos, TS_PATHS.windows]; |
37 | 37 | |
| 38 | +function countNonEmptyLines(value: string): number { |
| 39 | +let count = 0; |
| 40 | +for (const line of value.split("\n")) { |
| 41 | +if (line) { |
| 42 | +count += 1; |
| 43 | +} |
| 44 | +} |
| 45 | +return count; |
| 46 | +} |
| 47 | + |
38 | 48 | function runTsEval(source: string, env: Record<string, string> = {}) { |
39 | 49 | return execFileSync("node", ["--import", "tsx", "--input-type=module", "--eval", source], { |
40 | 50 | encoding: "utf8", |
@@ -79,7 +89,7 @@ describe("Parallels smoke model selection", () => {
|
79 | 89 | } else { |
80 | 90 | expect(wrapper, wrapperPath).toContain(TS_PATHS[platform as "linux" | "macos" | "windows"]); |
81 | 91 | } |
82 | | -expect(wrapper.split("\n").filter(Boolean).length).toBeLessThanOrEqual(5); |
| 92 | +expect(countNonEmptyLines(wrapper)).toBeLessThanOrEqual(5); |
83 | 93 | } |
84 | 94 | }); |
85 | 95 | |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -20,6 +20,16 @@ function requireTestConfig<T extends { test?: unknown }>(config: T): NonNullable
|
20 | 20 | return config.test as NonNullable<T["test"]>; |
21 | 21 | } |
22 | 22 | |
| 23 | +function countMatching<T>(items: readonly T[], predicate: (item: T) => boolean): number { |
| 24 | +let count = 0; |
| 25 | +for (const item of items) { |
| 26 | +if (predicate(item)) { |
| 27 | +count += 1; |
| 28 | +} |
| 29 | +} |
| 30 | +return count; |
| 31 | +} |
| 32 | + |
23 | 33 | describe("unit-fast vitest lane", () => { |
24 | 34 | it("runs cache-friendly tests without the reset-heavy runner or runtime setup", () => { |
25 | 35 | const config = createUnitFastVitestConfig({}); |
@@ -122,7 +132,7 @@ describe("unit-fast vitest lane", () => {
|
122 | 132 | |
123 | 133 | expect(currentCandidates.length).toBeGreaterThanOrEqual(unitFastTestFiles.length); |
124 | 134 | expect(broadCandidates.length).toBeGreaterThan(currentCandidates.length); |
125 | | -expect(broadAnalysis.filter((entry) => entry.unitFast).length).toBeGreaterThan( |
| 135 | +expect(countMatching(broadAnalysis, (entry) => entry.unitFast)).toBeGreaterThan( |
126 | 136 | unitFastTestFiles.length, |
127 | 137 | ); |
128 | 138 | }); |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。