@@ -15,10 +15,9 @@ final class StatusBarTextTests: XCTestCase {
1515 balance: 42, isLoading: false,
1616 hyperConfigured: true,
1717 claudeFiveHourPercent: 62, claudeSevenDayPercent: 8,
18− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
19− zaiInPeakHours: false
18+ zaiFiveHourPercent: nil, zaiWeeklyPercent: nil
2019 )
21− XCTAssertEqual(title, "⚡42 · \u{2055}62% 8%")
20+ XCTAssertEqual(title, "⚡42 · 🕐62% · 📅8%")
2221 }
2322
2423 func testHyperOnly() {
@@ -26,8 +25,7 @@ final class StatusBarTextTests: XCTestCase {
2625 balance: 42, isLoading: false,
2726 hyperConfigured: true,
2827 claudeFiveHourPercent: nil, claudeSevenDayPercent: nil,
29− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
30− zaiInPeakHours: false
28+ zaiFiveHourPercent: nil, zaiWeeklyPercent: nil
3129 )
3230 XCTAssertEqual(title, "⚡42")
3331 }
@@ -37,10 +35,9 @@ final class StatusBarTextTests: XCTestCase {
3735 balance: nil, isLoading: false,
3836 hyperConfigured: false,
3937 claudeFiveHourPercent: 62, claudeSevenDayPercent: 8,
40− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
41− zaiInPeakHours: false
38+ zaiFiveHourPercent: nil, zaiWeeklyPercent: nil
4239 )
43− XCTAssertEqual(title, "\u{2055}62% 8%")
40+ XCTAssertEqual(title, "🕐62% · 📅8%")
4441 }
4542
4643 func testLoadingWithNothingToShow() {
@@ -48,8 +45,7 @@ final class StatusBarTextTests: XCTestCase {
4845 balance: nil, isLoading: true,
4946 hyperConfigured: false,
5047 claudeFiveHourPercent: nil, claudeSevenDayPercent: nil,
51− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
52− zaiInPeakHours: false
48+ zaiFiveHourPercent: nil, zaiWeeklyPercent: nil
5349 )
5450 XCTAssertEqual(title, "…")
5551 }
@@ -59,8 +55,7 @@ final class StatusBarTextTests: XCTestCase {
5955 balance: nil, isLoading: false,
6056 hyperConfigured: false,
6157 claudeFiveHourPercent: nil, claudeSevenDayPercent: nil,
62− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
63− zaiInPeakHours: false
58+ zaiFiveHourPercent: nil, zaiWeeklyPercent: nil
6459 )
6560 XCTAssertEqual(title, "")
6661 }
@@ -73,10 +68,9 @@ final class StatusBarTextTests: XCTestCase {
7368 balance: nil, isLoading: true,
7469 hyperConfigured: false,
7570 claudeFiveHourPercent: 62, claudeSevenDayPercent: nil,
76− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
77− zaiInPeakHours: false
71+ zaiFiveHourPercent: nil, zaiWeeklyPercent: nil
7872 )
79− XCTAssertEqual(title, "\u{2055}62%")
73+ XCTAssertEqual(title, "🕐62%")
8074 }
8175
8276 func testLoadingKeepsAStaleBalanceOnScreen() {
@@ -84,21 +78,19 @@ final class StatusBarTextTests: XCTestCase {
8478 balance: 42, isLoading: true,
8579 hyperConfigured: true,
8680 claudeFiveHourPercent: 62, claudeSevenDayPercent: 8,
87− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
88− zaiInPeakHours: false
81+ zaiFiveHourPercent: nil, zaiWeeklyPercent: nil
8982 )
90− XCTAssertEqual(title, "⚡42 · \u{2055}62% 8%")
83+ XCTAssertEqual(title, "⚡42 · 🕐62% · 📅8%")
9184 }
9285
93− func testZeroPercentIsShown() {
86+ func testZeroPercentIsShownRatherThanOmitted() {
9487 let title = ViewModel.statusBarText(
9588 balance: 42, isLoading: false,
9689 hyperConfigured: true,
9790 claudeFiveHourPercent: 0, claudeSevenDayPercent: 8,
98− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
99− zaiInPeakHours: false
91+ zaiFiveHourPercent: nil, zaiWeeklyPercent: nil
10092 )
101− XCTAssertEqual(title, "⚡42 · \u{2055}0% 8%")
93+ XCTAssertEqual(title, "⚡42 · 📅8%")
10294 }
10395
10496 func testBothClaudeWindowsZero() {
@@ -106,10 +98,9 @@ final class StatusBarTextTests: XCTestCase {
10698 balance: 42, isLoading: false,
10799 hyperConfigured: true,
108100 claudeFiveHourPercent: 0, claudeSevenDayPercent: 0,
109− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
110− zaiInPeakHours: false
101+ zaiFiveHourPercent: nil, zaiWeeklyPercent: nil
111102 )
112− XCTAssertEqual(title, "⚡42 · \u{2055}0% 0%")
103+ XCTAssertEqual(title, "⚡42")
113104 }
114105
115106 func testFiveHourOnly() {
@@ -117,10 +108,9 @@ final class StatusBarTextTests: XCTestCase {
117108 balance: nil, isLoading: false,
118109 hyperConfigured: false,
119110 claudeFiveHourPercent: 62, claudeSevenDayPercent: nil,
120− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
121− zaiInPeakHours: false
111+ zaiFiveHourPercent: nil, zaiWeeklyPercent: nil
122112 )
123− XCTAssertEqual(title, "\u{2055}62%")
113+ XCTAssertEqual(title, "🕐62%")
124114 }
125115
126116 func testSevenDayOnly() {
@@ -128,10 +118,9 @@ final class StatusBarTextTests: XCTestCase {
128118 balance: nil, isLoading: false,
129119 hyperConfigured: false,
130120 claudeFiveHourPercent: nil, claudeSevenDayPercent: 8,
131− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
132− zaiInPeakHours: false
121+ zaiFiveHourPercent: nil, zaiWeeklyPercent: nil
133122 )
134− XCTAssertEqual(title, "\u{2055}8%")
123+ XCTAssertEqual(title, "📅8%")
135124 }
136125
137126 // MARK: - Hyper not configured
@@ -143,8 +132,7 @@ final class StatusBarTextTests: XCTestCase {
143132 balance: 42, isLoading: false,
144133 hyperConfigured: false,
145134 claudeFiveHourPercent: nil, claudeSevenDayPercent: nil,
146− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
147− zaiInPeakHours: false
135+ zaiFiveHourPercent: nil, zaiWeeklyPercent: nil
148136 )
149137 XCTAssertEqual(title, "")
150138 }
@@ -154,8 +142,7 @@ final class StatusBarTextTests: XCTestCase {
154142 balance: nil, isLoading: true,
155143 hyperConfigured: false,
156144 claudeFiveHourPercent: nil, claudeSevenDayPercent: nil,
157− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
158− zaiInPeakHours: false
145+ zaiFiveHourPercent: nil, zaiWeeklyPercent: nil
159146 )
160147 XCTAssertEqual(title, "…")
161148 }
@@ -165,10 +152,9 @@ final class StatusBarTextTests: XCTestCase {
165152 balance: nil, isLoading: false,
166153 hyperConfigured: false,
167154 claudeFiveHourPercent: 62, claudeSevenDayPercent: 8,
168− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
169− zaiInPeakHours: false
155+ zaiFiveHourPercent: nil, zaiWeeklyPercent: nil
170156 )
171− XCTAssertEqual(title, "\u{2055}62% 8%")
157+ XCTAssertEqual(title, "🕐62% · 📅8%")
172158 }
173159
174160 // MARK: - z.ai in Title
@@ -178,10 +164,9 @@ final class StatusBarTextTests: XCTestCase {
178164 balance: nil, isLoading: false,
179165 hyperConfigured: false,
180166 claudeFiveHourPercent: nil, claudeSevenDayPercent: nil,
181− zaiFiveHourPercent: 12, zaiWeeklyPercent: nil,
182− zaiInPeakHours: false
167+ zaiFiveHourPercent: 12, zaiWeeklyPercent: nil
183168 )
184− XCTAssertEqual(title, "\u{005A}12%")
169+ XCTAssertEqual(title, "🤖12%")
185170 }
186171
187172 func testZaiWithHyper() {
@@ -189,10 +174,9 @@ final class StatusBarTextTests: XCTestCase {
189174 balance: 42, isLoading: false,
190175 hyperConfigured: true,
191176 claudeFiveHourPercent: nil, claudeSevenDayPercent: nil,
192− zaiFiveHourPercent: 12, zaiWeeklyPercent: nil,
193− zaiInPeakHours: false
177+ zaiFiveHourPercent: 12, zaiWeeklyPercent: nil
194178 )
195− XCTAssertEqual(title, "⚡42 · \u{005A}12%")
179+ XCTAssertEqual(title, "⚡42 · 🤖12%")
196180 }
197181
198182 func testZaiWithClaude() {
@@ -200,10 +184,9 @@ final class StatusBarTextTests: XCTestCase {
200184 balance: nil, isLoading: false,
201185 hyperConfigured: false,
202186 claudeFiveHourPercent: 62, claudeSevenDayPercent: 8,
203− zaiFiveHourPercent: 12, zaiWeeklyPercent: nil,
204− zaiInPeakHours: false
187+ zaiFiveHourPercent: 12, zaiWeeklyPercent: nil
205188 )
206− XCTAssertEqual(title, "\u{2055}62% 8% · \u{005A}12%")
189+ XCTAssertEqual(title, "🕐62% · 📅8% · 🤖12%")
207190 }
208191
209192 func testAllThreeServices() {
@@ -211,21 +194,19 @@ final class StatusBarTextTests: XCTestCase {
211194 balance: 42, isLoading: false,
212195 hyperConfigured: true,
213196 claudeFiveHourPercent: 62, claudeSevenDayPercent: 8,
214− zaiFiveHourPercent: 12, zaiWeeklyPercent: 3,
215− zaiInPeakHours: false
197+ zaiFiveHourPercent: 12, zaiWeeklyPercent: 3
216198 )
217− XCTAssertEqual(title, "⚡42 · \u{2055}62% 8% · \u{005A}12% 3%")
199+ XCTAssertEqual(title, "⚡42 · 🕐62% · 📅8% · 🤖12% · 📆3%")
218200 }
219201
220− func testZaiZeroIsShown() {
202+ func testZaiZeroIsOmitted() {
221203 let title = ViewModel.statusBarText(
222204 balance: 42, isLoading: false,
223205 hyperConfigured: true,
224206 claudeFiveHourPercent: nil, claudeSevenDayPercent: nil,
225− zaiFiveHourPercent: 0, zaiWeeklyPercent: 0,
226− zaiInPeakHours: false
207+ zaiFiveHourPercent: 0, zaiWeeklyPercent: 0
227208 )
228− XCTAssertEqual(title, "⚡42 · \u{005A}0% 0%")
209+ XCTAssertEqual(title, "⚡42")
229210 }
230211
231212 func testLoadingKeepsZaiPercentOnScreen() {
@@ -233,10 +214,9 @@ final class StatusBarTextTests: XCTestCase {
233214 balance: nil, isLoading: true,
234215 hyperConfigured: false,
235216 claudeFiveHourPercent: nil, claudeSevenDayPercent: nil,
236− zaiFiveHourPercent: 12, zaiWeeklyPercent: nil,
237− zaiInPeakHours: false
217+ zaiFiveHourPercent: 12, zaiWeeklyPercent: nil
238218 )
239− XCTAssertEqual(title, "\u{005A}12%")
219+ XCTAssertEqual(title, "🤖12%")
240220 }
241221
242222 // MARK: - z.ai Weekly
@@ -246,10 +226,9 @@ final class StatusBarTextTests: XCTestCase {
246226 balance: nil, isLoading: false,
247227 hyperConfigured: false,
248228 claudeFiveHourPercent: nil, claudeSevenDayPercent: nil,
249− zaiFiveHourPercent: nil, zaiWeeklyPercent: 3,
250− zaiInPeakHours: false
229+ zaiFiveHourPercent: nil, zaiWeeklyPercent: 3
251230 )
252− XCTAssertEqual(title, "\u{005A}3%")
231+ XCTAssertEqual(title, "📆3%")
253232 }
254233
255234 func testZaiWeeklyWithFiveHour() {
@@ -257,21 +236,19 @@ final class StatusBarTextTests: XCTestCase {
257236 balance: nil, isLoading: false,
258237 hyperConfigured: false,
259238 claudeFiveHourPercent: nil, claudeSevenDayPercent: nil,
260− zaiFiveHourPercent: 12, zaiWeeklyPercent: 3,
261− zaiInPeakHours: false
239+ zaiFiveHourPercent: 12, zaiWeeklyPercent: 3
262240 )
263− XCTAssertEqual(title, "\u{005A}12% 3%")
241+ XCTAssertEqual(title, "🤖12% · 📆3%")
264242 }
265243
266− func testZaiWeeklyZeroIsShown() {
244+ func testZaiWeeklyZeroIsOmitted() {
267245 let title = ViewModel.statusBarText(
268246 balance: nil, isLoading: false,
269247 hyperConfigured: false,
270248 claudeFiveHourPercent: nil, claudeSevenDayPercent: nil,
271− zaiFiveHourPercent: 12, zaiWeeklyPercent: 0,
272− zaiInPeakHours: false
249+ zaiFiveHourPercent: 12, zaiWeeklyPercent: 0
273250 )
274− XCTAssertEqual(title, "\u{005A}12% 0%")
251+ XCTAssertEqual(title, "🤖12%")
275252 }
276253
277254 func testLoadingKeepsZaiWeeklyOnScreen() {
@@ -279,46 +256,9 @@ final class StatusBarTextTests: XCTestCase {
279256 balance: nil, isLoading: true,
280257 hyperConfigured: false,
281258 claudeFiveHourPercent: nil, claudeSevenDayPercent: nil,
282− zaiFiveHourPercent: nil, zaiWeeklyPercent: 3,
283− zaiInPeakHours: false
284− )
285− XCTAssertEqual(title, "\u{005A}3%")
286− }
287−
288− // MARK: - z.ai Peak Hours
289−
290− func testPeakHoursAddsDiamondToZaiSegment() {
291− let title = ViewModel.statusBarText(
292− balance: 42, isLoading: false,
293− hyperConfigured: true,
294− claudeFiveHourPercent: 62, claudeSevenDayPercent: 8,
295− zaiFiveHourPercent: 12, zaiWeeklyPercent: 3,
296− zaiInPeakHours: true
297− )
298− XCTAssertEqual(title, "⚡42 · \u{2055}62% 8% · \u{005A}12% 3%\u{1F536}")
299− }
300−
301− func testPeakHoursWithZaiOnly() {
302− let title = ViewModel.statusBarText(
303− balance: nil, isLoading: false,
304− hyperConfigured: false,
305− claudeFiveHourPercent: nil, claudeSevenDayPercent: nil,
306− zaiFiveHourPercent: 12, zaiWeeklyPercent: nil,
307− zaiInPeakHours: true
308− )
309− XCTAssertEqual(title, "\u{005A}12%\u{1F536}")
310− }
311−
312− func testPeakHoursIgnoredWhenZaiNotConfigured() {
313− let title = ViewModel.statusBarText(
314− balance: 42, isLoading: false,
315− hyperConfigured: true,
316− claudeFiveHourPercent: 62, claudeSevenDayPercent: 8,
317− zaiFiveHourPercent: nil, zaiWeeklyPercent: nil,
318− zaiInPeakHours: true
259+ zaiFiveHourPercent: nil, zaiWeeklyPercent: 3
319260 )
320− // No z.ai segment, so peak marker has nothing to attach to.
321− XCTAssertEqual(title, "⚡42 · \u{2055}62% 8%")
261+ XCTAssertEqual(title, "📆3%")
322262 }
323263
324264 // MARK: - Claude Window Percentages