|
7 | 7 | MAX_MESSAGE_BODY_BYTES, |
8 | 8 | MAX_MESSAGE_CHARS, |
9 | 9 | MAX_MESSAGE_PARTS, |
| 10 | + MESSAGE_ANNOUNCE_STEP, |
10 | 11 | MESSAGE_CHARS_WARN_AT, |
| 12 | + MESSAGE_LIMIT_REACHED_ANNOUNCEMENT, |
11 | 13 | messageCountAnnouncement, |
12 | 14 | } from "./message-limits"; |
13 | 15 |
|
@@ -71,13 +73,47 @@ describe("messageCountAnnouncement", () => { |
71 | 73 | expect(messageCountAnnouncement(MESSAGE_CHARS_WARN_AT - 1)).toBe(""); |
72 | 74 | }); |
73 | 75 |
|
74 | | - it("reads the count out from the warning point on", () => { |
| 76 | + it("speaks up on reaching the warning point, and again on the limit", () => { |
75 | 77 | expect(messageCountAnnouncement(MESSAGE_CHARS_WARN_AT)).toBe( |
76 | | - `${MESSAGE_CHARS_WARN_AT} / ${MAX_MESSAGE_CHARS}` |
77 | | - ); |
78 | | - expect(messageCountAnnouncement(MAX_MESSAGE_CHARS)).toBe( |
79 | | - `${MAX_MESSAGE_CHARS} / ${MAX_MESSAGE_CHARS}` |
| 78 | + `${MAX_MESSAGE_CHARS - MESSAGE_CHARS_WARN_AT} characters left` |
80 | 79 | ); |
| 80 | + expect(messageCountAnnouncement(MAX_MESSAGE_CHARS)).toBe(MESSAGE_LIMIT_REACHED_ANNOUNCEMENT); |
| 81 | + }); |
| 82 | + |
| 83 | + it("changes rarely enough to be worth listening to", () => { |
| 84 | + const spoken = new Set<string>(); |
| 85 | + let changes = 0; |
| 86 | + let previous = messageCountAnnouncement(MESSAGE_CHARS_WARN_AT - 1); |
| 87 | + |
| 88 | + for (let length = MESSAGE_CHARS_WARN_AT - 1; length <= MAX_MESSAGE_CHARS; length++) { |
| 89 | + const announcement = messageCountAnnouncement(length); |
| 90 | + if (announcement !== previous) changes++; |
| 91 | + previous = announcement; |
| 92 | + if (announcement) spoken.add(announcement); |
| 93 | + } |
| 94 | + |
| 95 | + // One per step across the warning band, plus the limit itself. |
| 96 | + const expected = (MAX_MESSAGE_CHARS - MESSAGE_CHARS_WARN_AT) / MESSAGE_ANNOUNCE_STEP + 1; |
| 97 | + expect(spoken.size).toBe(expected); |
| 98 | + expect(changes).toBe(expected); |
| 99 | + expect(spoken).toContain(MESSAGE_LIMIT_REACHED_ANNOUNCEMENT); |
| 100 | + }); |
| 101 | + |
| 102 | + it("steps down through the band in order", () => { |
| 103 | + // Typing one character can only ever move the announcement forward. |
| 104 | + const seen: string[] = []; |
| 105 | + for (let length = MESSAGE_CHARS_WARN_AT; length <= MAX_MESSAGE_CHARS; length++) { |
| 106 | + const announcement = messageCountAnnouncement(length); |
| 107 | + if (seen.at(-1) !== announcement) seen.push(announcement); |
| 108 | + } |
| 109 | + |
| 110 | + expect(seen).toEqual([ |
| 111 | + "800 characters left", |
| 112 | + "600 characters left", |
| 113 | + "400 characters left", |
| 114 | + "200 characters left", |
| 115 | + MESSAGE_LIMIT_REACHED_ANNOUNCEMENT, |
| 116 | + ]); |
81 | 117 | }); |
82 | 118 | }); |
83 | 119 |
|
|
0 commit comments