

























@@ -60,6 +60,53 @@ function expectSetEmojiCall(calls: Array<{ method: string; emoji: string }>, emo
6060expect(calls).toContainEqual({ method: "set", emoji });
6161}
626263+function collectEmojisForMethod(
64+calls: Array<{ method: string; emoji: string }>,
65+method: string,
66+): string[] {
67+const emojis: string[] = [];
68+for (const call of calls) {
69+if (call.method === method) {
70+emojis.push(call.emoji);
71+}
72+}
73+return emojis;
74+}
75+76+function countCallsForMethod(calls: Array<{ method: string; emoji: string }>, method: string) {
77+let count = 0;
78+for (const call of calls) {
79+if (call.method === method) {
80+count += 1;
81+}
82+}
83+return count;
84+}
85+86+function countCallsForEmoji(calls: Array<{ method: string; emoji: string }>, emoji: string) {
87+let count = 0;
88+for (const call of calls) {
89+if (call.emoji === emoji) {
90+count += 1;
91+}
92+}
93+return count;
94+}
95+96+function countCallsForMethodAndEmoji(
97+calls: Array<{ method: string; emoji: string }>,
98+method: string,
99+emoji: string,
100+) {
101+let count = 0;
102+for (const call of calls) {
103+if (call.method === method && call.emoji === emoji) {
104+count += 1;
105+}
106+}
107+return count;
108+}
109+63110function expectArrayContainsAll(values: readonly string[], expected: readonly string[]) {
64111expected.forEach((value) => {
65112expect(values).toContain(value);
@@ -264,7 +311,7 @@ describe("createStatusReactionController", () => {
264311await vi.advanceTimersByTimeAsync(DEFAULT_TIMING.debounceMs);
265312266313// Should only have the last one (exec → display emoji)
267-const setEmojis = calls.filter((c) => c.method === "set").map((c) => c.emoji);
314+const setEmojis = collectEmojisForMethod(calls, "set");
268315expect(setEmojis).toEqual(["🛠️"]);
269316});
270317@@ -292,7 +339,7 @@ describe("createStatusReactionController", () => {
292339void controller.setThinking();
293340await vi.advanceTimersByTimeAsync(DEFAULT_TIMING.debounceMs);
294341295-const setEmojis = calls.filter((call) => call.method === "set").map((call) => call.emoji);
342+const setEmojis = collectEmojisForMethod(calls, "set");
296343expect(setEmojis).toEqual([DEFAULT_EMOJIS.thinking]);
297344});
298345@@ -325,7 +372,7 @@ describe("createStatusReactionController", () => {
325372326373await controller.setDone();
327374328-const removeEmojis = calls.filter((call) => call.method === "remove").map((call) => call.emoji);
375+const removeEmojis = collectEmojisForMethod(calls, "remove");
329376expect(removeEmojis).toEqual(expect.arrayContaining(["👀", DEFAULT_EMOJIS.thinking, "🛠️"]));
330377expect(removeEmojis).not.toContain(DEFAULT_EMOJIS.done);
331378});
@@ -354,10 +401,7 @@ describe("createStatusReactionController", () => {
354401void controller.setThinking();
355402await vi.advanceTimersByTimeAsync(DEFAULT_TIMING.debounceMs);
356403357-const thinkingSets = calls.filter(
358-(call) => call.method === "set" && call.emoji === DEFAULT_EMOJIS.thinking,
359-);
360-expect(thinkingSets).toHaveLength(1);
404+expect(countCallsForMethodAndEmoji(calls, "set", DEFAULT_EMOJIS.thinking)).toBe(1);
361405expect(calls).not.toContainEqual({ method: "remove", emoji: DEFAULT_EMOJIS.thinking });
362406});
363407@@ -371,8 +415,7 @@ describe("createStatusReactionController", () => {
371415await vi.advanceTimersByTimeAsync(DEFAULT_TIMING.debounceMs);
372416373417// Should only have set calls, no remove
374-const removeCalls = calls.filter((c) => c.method === "remove");
375-expect(removeCalls).toHaveLength(0);
418+expect(countCallsForMethod(calls, "remove")).toBe(0);
376419expect(calls.some((c) => c.method === "set")).toBe(true);
377420});
378421@@ -385,8 +428,7 @@ describe("createStatusReactionController", () => {
385428await controller.clear();
386429387430// Should have removed multiple emojis
388-const removeCalls = calls.filter((c) => c.method === "remove");
389-expect(removeCalls.length).toBeGreaterThan(0);
431+expect(countCallsForMethod(calls, "remove")).toBeGreaterThan(0);
390432});
391433392434it("should handle clear gracefully when adapter lacks removeReaction", async () => {
@@ -395,8 +437,7 @@ describe("createStatusReactionController", () => {
395437await controller.clear();
396438397439// Should not throw, no remove calls
398-const removeCalls = calls.filter((c) => c.method === "remove");
399-expect(removeCalls).toHaveLength(0);
440+expect(countCallsForMethod(calls, "remove")).toBe(0);
400441});
401442402443it("should restore initial emoji", async () => {
@@ -497,8 +538,7 @@ describe("createStatusReactionController", () => {
497538await runUpdate(controller);
498539await vi.advanceTimersByTimeAsync(DEFAULT_TIMING.stallSoftMs / 2);
499540500-const stallCalls = calls.filter((c) => c.emoji === DEFAULT_EMOJIS.stallSoft);
501-expect(stallCalls).toHaveLength(0);
541+expect(countCallsForEmoji(calls, DEFAULT_EMOJIS.stallSoft)).toBe(0);
502542});
503543504544it("should call onError callback when adapter throws", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。