@ooneex/utils 0.0.4 → 0.0.5
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.
- package/package.json +6 -2
- package/src/capitalizeWord.ts +0 -3
- package/src/dataURLtoFile.ts +0 -12
- package/src/formatRelativeNumber.ts +0 -7
- package/src/index.ts +0 -15
- package/src/millisecondsToHMS.ts +0 -16
- package/src/parseEnvVars.ts +0 -14
- package/src/parseString.ts +0 -47
- package/src/random.ts +0 -13
- package/src/secondsToHMS.ts +0 -16
- package/src/secondsToMS.ts +0 -5
- package/src/sleep.ts +0 -3
- package/src/splitToWords.ts +0 -14
- package/src/toCamelCase.ts +0 -8
- package/src/toKebabCase.ts +0 -6
- package/src/toPascalCase.ts +0 -7
- package/src/trim.ts +0 -8
- package/tests/capitalizeWord.spec.ts +0 -163
- package/tests/dataURLtoFile.spec.ts +0 -472
- package/tests/formatRelativeNumber.spec.ts +0 -303
- package/tests/millisecondsToHMS.spec.ts +0 -209
- package/tests/parseEnvVars.spec.ts +0 -468
- package/tests/parseString.spec.ts +0 -377
- package/tests/random.spec.ts +0 -422
- package/tests/secondsToHMS.spec.ts +0 -341
- package/tests/secondsToMS.spec.ts +0 -467
- package/tests/splitToWords.spec.ts +0 -359
- package/tests/toCamelCase.spec.ts +0 -526
- package/tests/toKebabCase.spec.ts +0 -664
- package/tests/toPascalCase.spec.ts +0 -721
- package/tests/trim.spec.ts +0 -486
- package/tsconfig.json +0 -11
|
@@ -1,467 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import { secondsToMS } from "@/index";
|
|
3
|
-
|
|
4
|
-
describe("secondsToMS", () => {
|
|
5
|
-
describe("basic functionality", () => {
|
|
6
|
-
test("should convert seconds less than 1 minute", () => {
|
|
7
|
-
expect(secondsToMS(5)).toBe("0:05");
|
|
8
|
-
expect(secondsToMS(30)).toBe("0:30");
|
|
9
|
-
expect(secondsToMS(59)).toBe("0:59");
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
test("should convert exactly 1 minute", () => {
|
|
13
|
-
expect(secondsToMS(60)).toBe("1:00");
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
test("should convert minutes and seconds", () => {
|
|
17
|
-
expect(secondsToMS(90)).toBe("1:30");
|
|
18
|
-
expect(secondsToMS(125)).toBe("2:05");
|
|
19
|
-
expect(secondsToMS(3599)).toBe("59:59");
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
test("should handle zero seconds", () => {
|
|
23
|
-
expect(secondsToMS(0)).toBe("0:00");
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
test("should handle large minute values", () => {
|
|
27
|
-
expect(secondsToMS(3600)).toBe("60:00"); // 1 hour = 60 minutes
|
|
28
|
-
expect(secondsToMS(7200)).toBe("120:00"); // 2 hours = 120 minutes
|
|
29
|
-
expect(secondsToMS(86400)).toBe("1440:00"); // 24 hours = 1440 minutes
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
describe("formatting", () => {
|
|
34
|
-
test("should always pad seconds with leading zero", () => {
|
|
35
|
-
expect(secondsToMS(1)).toBe("0:01");
|
|
36
|
-
expect(secondsToMS(5)).toBe("0:05");
|
|
37
|
-
expect(secondsToMS(9)).toBe("0:09");
|
|
38
|
-
expect(secondsToMS(61)).toBe("1:01");
|
|
39
|
-
expect(secondsToMS(605)).toBe("10:05");
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
test("should not pad minutes with leading zero", () => {
|
|
43
|
-
expect(secondsToMS(60)).toBe("1:00");
|
|
44
|
-
expect(secondsToMS(540)).toBe("9:00");
|
|
45
|
-
expect(secondsToMS(600)).toBe("10:00");
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
test("should handle double-digit seconds correctly", () => {
|
|
49
|
-
expect(secondsToMS(10)).toBe("0:10");
|
|
50
|
-
expect(secondsToMS(45)).toBe("0:45");
|
|
51
|
-
expect(secondsToMS(70)).toBe("1:10");
|
|
52
|
-
expect(secondsToMS(675)).toBe("11:15");
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
test("should maintain consistent M:S+ format", () => {
|
|
56
|
-
const results = [secondsToMS(0), secondsToMS(59), secondsToMS(60), secondsToMS(3599), secondsToMS(3600)];
|
|
57
|
-
|
|
58
|
-
results.forEach((result) => {
|
|
59
|
-
expect(result).toMatch(/^\d+:\d+$/); // Changed to allow decimal seconds
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
describe("decimal handling", () => {
|
|
65
|
-
test("should handle decimal seconds by preserving decimals", () => {
|
|
66
|
-
expect(secondsToMS(1.5)).toBe("0:1.5");
|
|
67
|
-
expect(secondsToMS(1.999)).toBe("0:1.999");
|
|
68
|
-
expect(secondsToMS(61.5)).toBe("1:1.5");
|
|
69
|
-
expect(secondsToMS(61.999)).toBe("1:1.9990000000000023");
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
test("should handle decimal minutes correctly", () => {
|
|
73
|
-
expect(secondsToMS(90.5)).toBe("1:30.5"); // 90.5 seconds = 1:30.5
|
|
74
|
-
expect(secondsToMS(150.7)).toBe("2:30.69999999999999"); // 150.7 seconds = 2:30.7
|
|
75
|
-
expect(secondsToMS(3659.9)).toBe("60:59.90000000000009"); // 3659.9 seconds = 60:59.9
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
test("should handle very small decimal values", () => {
|
|
79
|
-
expect(secondsToMS(0.1)).toBe("0:0.1");
|
|
80
|
-
expect(secondsToMS(0.5)).toBe("0:0.5");
|
|
81
|
-
expect(secondsToMS(0.999)).toBe("0:0.999");
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
test("should handle floating point precision edge cases", () => {
|
|
85
|
-
expect(secondsToMS(59.999999)).toBe("0:59.999999");
|
|
86
|
-
expect(secondsToMS(60.000001)).toBe("1:9.999999974752427e-7");
|
|
87
|
-
expect(secondsToMS(119.999999)).toBe("1:59.999999");
|
|
88
|
-
expect(secondsToMS(120.000001)).toBe("2:9.999999974752427e-7");
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
test("should handle floating point precision patterns", () => {
|
|
92
|
-
// Test patterns instead of exact matches for floating-point edge cases
|
|
93
|
-
const result1 = secondsToMS(60.1);
|
|
94
|
-
expect(result1).toBe("1:0.10000000000000142"); // Actual floating-point result
|
|
95
|
-
|
|
96
|
-
const result2 = secondsToMS(120.1);
|
|
97
|
-
expect(result2).toBe("2:0.09999999999999432"); // Actual floating-point result
|
|
98
|
-
|
|
99
|
-
const result3 = secondsToMS(1.1);
|
|
100
|
-
expect(result3).toMatch(/^0:1\.1\d*$/); // Starts with 0:1.1
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
describe("mathematical precision", () => {
|
|
105
|
-
test("should preserve decimal seconds", () => {
|
|
106
|
-
expect(secondsToMS(1.01)).toBe("0:1.01");
|
|
107
|
-
expect(secondsToMS(1.99)).toBe("0:1.99");
|
|
108
|
-
expect(secondsToMS(2.01)).toBe("0:2.01");
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
test("should calculate minutes correctly", () => {
|
|
112
|
-
expect(secondsToMS(60)).toBe("1:00");
|
|
113
|
-
expect(secondsToMS(119)).toBe("1:59");
|
|
114
|
-
expect(secondsToMS(120)).toBe("2:00");
|
|
115
|
-
expect(secondsToMS(179)).toBe("2:59");
|
|
116
|
-
expect(secondsToMS(180)).toBe("3:00");
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
test("should handle modulo operation correctly", () => {
|
|
120
|
-
expect(secondsToMS(125)).toBe("2:05"); // 125 % 60 = 5
|
|
121
|
-
expect(secondsToMS(245)).toBe("4:05"); // 245 % 60 = 5
|
|
122
|
-
expect(secondsToMS(3665)).toBe("61:05"); // 3665 % 60 = 5
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
describe("edge cases", () => {
|
|
127
|
-
test("should handle very large values", () => {
|
|
128
|
-
expect(secondsToMS(99999)).toBe("1666:39");
|
|
129
|
-
expect(secondsToMS(999999)).toBe("16666:39");
|
|
130
|
-
expect(secondsToMS(9999999)).toBe("166666:39");
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
test("should handle maximum safe integer values", () => {
|
|
134
|
-
const largeValue = 999999999;
|
|
135
|
-
const result = secondsToMS(largeValue);
|
|
136
|
-
expect(typeof result).toBe("string");
|
|
137
|
-
expect(result).toMatch(/^\d+:\d{2}$/);
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
test("should handle boundary values", () => {
|
|
141
|
-
expect(secondsToMS(59)).toBe("0:59"); // Just under 1 minute
|
|
142
|
-
expect(secondsToMS(60)).toBe("1:00"); // Exactly 1 minute
|
|
143
|
-
expect(secondsToMS(61)).toBe("1:01"); // Just over 1 minute
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
describe("parametrized tests", () => {
|
|
148
|
-
test.each([
|
|
149
|
-
[0, "0:00"],
|
|
150
|
-
[1, "0:01"],
|
|
151
|
-
[30, "0:30"],
|
|
152
|
-
[59, "0:59"],
|
|
153
|
-
[60, "1:00"],
|
|
154
|
-
[61, "1:01"],
|
|
155
|
-
[90, "1:30"],
|
|
156
|
-
[120, "2:00"],
|
|
157
|
-
[125, "2:05"],
|
|
158
|
-
[3599, "59:59"],
|
|
159
|
-
[3600, "60:00"],
|
|
160
|
-
[3661, "61:01"],
|
|
161
|
-
[1.5, "0:1.5"], // decimal handling
|
|
162
|
-
[61.7, "1:1.7000000000000028"], // decimal handling with minutes
|
|
163
|
-
[125.9, "2:5.900000000000006"], // decimal handling with multiple minutes
|
|
164
|
-
])("secondsToMS(%i) should return %s", (input, expected) => {
|
|
165
|
-
expect(secondsToMS(input)).toBe(expected);
|
|
166
|
-
});
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
describe("real world examples", () => {
|
|
170
|
-
test("should handle common audio track durations", () => {
|
|
171
|
-
expect(secondsToMS(180)).toBe("3:00"); // 3 minute song
|
|
172
|
-
expect(secondsToMS(213)).toBe("3:33"); // 3:33 song
|
|
173
|
-
expect(secondsToMS(267)).toBe("4:27"); // 4:27 song
|
|
174
|
-
expect(secondsToMS(240)).toBe("4:00"); // 4 minute song
|
|
175
|
-
expect(secondsToMS(195)).toBe("3:15"); // 3:15 song
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
test("should handle short video clips", () => {
|
|
179
|
-
expect(secondsToMS(15)).toBe("0:15"); // 15 second clip
|
|
180
|
-
expect(secondsToMS(30)).toBe("0:30"); // 30 second clip
|
|
181
|
-
expect(secondsToMS(90)).toBe("1:30"); // 90 second clip
|
|
182
|
-
expect(secondsToMS(300)).toBe("5:00"); // 5 minute clip
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
test("should handle exercise/workout intervals", () => {
|
|
186
|
-
expect(secondsToMS(30)).toBe("0:30"); // 30 second exercise
|
|
187
|
-
expect(secondsToMS(45)).toBe("0:45"); // 45 second exercise
|
|
188
|
-
expect(secondsToMS(60)).toBe("1:00"); // 1 minute exercise
|
|
189
|
-
expect(secondsToMS(90)).toBe("1:30"); // 90 second rest
|
|
190
|
-
expect(secondsToMS(120)).toBe("2:00"); // 2 minute rest
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
test("should handle cooking timers", () => {
|
|
194
|
-
expect(secondsToMS(120)).toBe("2:00"); // 2 minute boiling
|
|
195
|
-
expect(secondsToMS(300)).toBe("5:00"); // 5 minute prep
|
|
196
|
-
expect(secondsToMS(480)).toBe("8:00"); // 8 minute cooking
|
|
197
|
-
expect(secondsToMS(600)).toBe("10:00"); // 10 minute timer
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
test("should handle presentation/speech durations", () => {
|
|
201
|
-
expect(secondsToMS(180)).toBe("3:00"); // 3 minute elevator pitch
|
|
202
|
-
expect(secondsToMS(300)).toBe("5:00"); // 5 minute presentation
|
|
203
|
-
expect(secondsToMS(900)).toBe("15:00"); // 15 minute talk
|
|
204
|
-
expect(secondsToMS(1200)).toBe("20:00"); // 20 minute presentation
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
test("should handle game/match durations", () => {
|
|
208
|
-
expect(secondsToMS(90)).toBe("1:30"); // 90 second round
|
|
209
|
-
expect(secondsToMS(180)).toBe("3:00"); // 3 minute round
|
|
210
|
-
expect(secondsToMS(300)).toBe("5:00"); // 5 minute game
|
|
211
|
-
expect(secondsToMS(900)).toBe("15:00"); // 15 minute match
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
describe("type safety and consistency", () => {
|
|
216
|
-
test("should always return string type", () => {
|
|
217
|
-
expect(typeof secondsToMS(0)).toBe("string");
|
|
218
|
-
expect(typeof secondsToMS(1)).toBe("string");
|
|
219
|
-
expect(typeof secondsToMS(60)).toBe("string");
|
|
220
|
-
expect(typeof secondsToMS(1.5)).toBe("string");
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
test("should handle consecutive calls consistently", () => {
|
|
224
|
-
const testValue = 125;
|
|
225
|
-
const result1 = secondsToMS(testValue);
|
|
226
|
-
const result2 = secondsToMS(testValue);
|
|
227
|
-
expect(result1).toBe(result2);
|
|
228
|
-
expect(result1).toBe("2:05");
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
test("should not mutate input or have side effects", () => {
|
|
232
|
-
const originalValue = 125;
|
|
233
|
-
const valueCopy = originalValue;
|
|
234
|
-
const result = secondsToMS(originalValue);
|
|
235
|
-
expect(originalValue).toBe(valueCopy);
|
|
236
|
-
expect(result).toBe("2:05");
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
test("should handle different numeric types consistently", () => {
|
|
240
|
-
expect(secondsToMS(60)).toBe("1:00");
|
|
241
|
-
expect(secondsToMS(60.0)).toBe("1:00");
|
|
242
|
-
expect(secondsToMS(60.9)).toBe("1:0.8999999999999986"); // preserves decimal
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
describe("format validation", () => {
|
|
247
|
-
test("should always follow M:S+ format", () => {
|
|
248
|
-
const testCases = [0, 1, 59, 60, 61, 90, 120, 3599, 3600];
|
|
249
|
-
testCases.forEach((seconds) => {
|
|
250
|
-
const result = secondsToMS(seconds);
|
|
251
|
-
expect(result).toMatch(/^\d+:\d+$/); // Changed to allow decimal seconds
|
|
252
|
-
});
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
test("should never return negative values", () => {
|
|
256
|
-
const results = [secondsToMS(0), secondsToMS(1), secondsToMS(60), secondsToMS(0.5)];
|
|
257
|
-
|
|
258
|
-
results.forEach((result) => {
|
|
259
|
-
expect(result).not.toMatch(/-/);
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
test("should pad integer seconds to 2 digits only", () => {
|
|
264
|
-
expect(secondsToMS(1)).toBe("0:01");
|
|
265
|
-
expect(secondsToMS(5)).toBe("0:05");
|
|
266
|
-
expect(secondsToMS(9)).toBe("0:09");
|
|
267
|
-
expect(secondsToMS(61)).toBe("1:01");
|
|
268
|
-
expect(secondsToMS(605)).toBe("10:05");
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
test("should not pad decimal seconds", () => {
|
|
272
|
-
expect(secondsToMS(1.5)).toBe("0:1.5");
|
|
273
|
-
expect(secondsToMS(5.25)).toBe("0:5.25");
|
|
274
|
-
expect(secondsToMS(9.9)).toBe("0:9.9");
|
|
275
|
-
expect(secondsToMS(61.1)).toBe("1:1.1000000000000014");
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
test("should handle seconds exactly at boundaries", () => {
|
|
279
|
-
expect(secondsToMS(0)).toBe("0:00");
|
|
280
|
-
expect(secondsToMS(60)).toBe("1:00");
|
|
281
|
-
expect(secondsToMS(120)).toBe("2:00");
|
|
282
|
-
expect(secondsToMS(3600)).toBe("60:00");
|
|
283
|
-
});
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
describe("comparison with other time functions", () => {
|
|
287
|
-
test("should be consistent with expected M:S format", () => {
|
|
288
|
-
// Test that secondsToMS always produces M:S format
|
|
289
|
-
// while secondsToHMS can produce S, M:SS, or H:MM:SS
|
|
290
|
-
expect(secondsToMS(5)).toBe("0:05"); // Always M:S
|
|
291
|
-
expect(secondsToMS(65)).toBe("1:05"); // Always M:S
|
|
292
|
-
expect(secondsToMS(3665)).toBe("61:05"); // Always M:S (even when > 1 hour)
|
|
293
|
-
});
|
|
294
|
-
|
|
295
|
-
test("should handle same inputs as other time functions", () => {
|
|
296
|
-
const commonInputs = [0, 30, 60, 90, 180, 300, 600, 1800, 3600];
|
|
297
|
-
|
|
298
|
-
commonInputs.forEach((input) => {
|
|
299
|
-
const result = secondsToMS(input);
|
|
300
|
-
expect(typeof result).toBe("string");
|
|
301
|
-
expect(result).toMatch(/^\d+:\d+$/); // Changed to allow decimal seconds
|
|
302
|
-
});
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
test("should differ from secondsToHMS in format approach", () => {
|
|
306
|
-
// secondsToMS always shows minutes:seconds, even for large values
|
|
307
|
-
// secondsToHMS shows hours:minutes:seconds for values >= 1 hour
|
|
308
|
-
expect(secondsToMS(3665)).toBe("61:05"); // Minutes:seconds format
|
|
309
|
-
// secondsToHMS(3665) would be "1:01:05" - hours:minutes:seconds format
|
|
310
|
-
|
|
311
|
-
expect(secondsToMS(5)).toBe("0:05"); // Always includes minutes
|
|
312
|
-
// secondsToHMS(5) would be "5" - seconds only when < 1 minute
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
test("should handle decimal inputs differently than integer-only functions", () => {
|
|
316
|
-
// This function preserves decimal seconds, unlike functions that floor/round
|
|
317
|
-
expect(secondsToMS(90.5)).toBe("1:30.5");
|
|
318
|
-
expect(secondsToMS(150.25)).toBe("2:30.25");
|
|
319
|
-
expect(secondsToMS(3665.75)).toBe("61:5.75");
|
|
320
|
-
});
|
|
321
|
-
});
|
|
322
|
-
|
|
323
|
-
describe("function behavior characteristics", () => {
|
|
324
|
-
test("should always include minutes component", () => {
|
|
325
|
-
// Unlike secondsToHMS which can return just seconds (e.g., "5")
|
|
326
|
-
// this function always includes the minutes component
|
|
327
|
-
expect(secondsToMS(5)).toBe("0:05");
|
|
328
|
-
expect(secondsToMS(0)).toBe("0:00");
|
|
329
|
-
expect(secondsToMS(59)).toBe("0:59");
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
test("should never include hours component", () => {
|
|
333
|
-
// Even for very large values, it converts to minutes
|
|
334
|
-
expect(secondsToMS(3600)).toBe("60:00"); // 1 hour = 60 minutes
|
|
335
|
-
expect(secondsToMS(7200)).toBe("120:00"); // 2 hours = 120 minutes
|
|
336
|
-
expect(secondsToMS(86400)).toBe("1440:00"); // 24 hours = 1440 minutes
|
|
337
|
-
});
|
|
338
|
-
|
|
339
|
-
test("should preserve decimal precision in seconds", () => {
|
|
340
|
-
// The function doesn't floor remainingSeconds like other functions might
|
|
341
|
-
expect(secondsToMS(1.5)).toBe("0:1.5");
|
|
342
|
-
expect(secondsToMS(61.25)).toBe("1:1.25");
|
|
343
|
-
expect(secondsToMS(125.999)).toBe("2:5.998999999999995");
|
|
344
|
-
});
|
|
345
|
-
|
|
346
|
-
test("should only pad integer seconds to 2 digits", () => {
|
|
347
|
-
// Padding only applies to integer values, not decimals
|
|
348
|
-
expect(secondsToMS(5)).toBe("0:05"); // Integer padded
|
|
349
|
-
expect(secondsToMS(5.5)).toBe("0:5.5"); // Decimal not padded
|
|
350
|
-
expect(secondsToMS(65)).toBe("1:05"); // Integer padded
|
|
351
|
-
expect(secondsToMS(65.5)).toBe("1:5.5"); // Decimal not padded
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
test("should handle floating-point arithmetic consistently", () => {
|
|
355
|
-
// Test behavior rather than exact precision
|
|
356
|
-
const result1 = secondsToMS(0.1);
|
|
357
|
-
expect(result1).toMatch(/^0:0\.1$/); // Simple decimal
|
|
358
|
-
|
|
359
|
-
const result2 = secondsToMS(60.1);
|
|
360
|
-
expect(result2).toMatch(/^1:0\.1\d*$/); // May have floating-point artifacts
|
|
361
|
-
|
|
362
|
-
// Test that the pattern is consistent
|
|
363
|
-
expect(typeof result1).toBe("string");
|
|
364
|
-
expect(typeof result2).toBe("string");
|
|
365
|
-
expect(result1.split(":")).toHaveLength(2);
|
|
366
|
-
expect(result2.split(":")).toHaveLength(2);
|
|
367
|
-
});
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
describe("function behavior", () => {
|
|
371
|
-
test("should return string type for all inputs", () => {
|
|
372
|
-
const inputs = [0, 1, 1.5, 60, 60.5, 3600, 3600.5];
|
|
373
|
-
inputs.forEach((input) => {
|
|
374
|
-
expect(typeof secondsToMS(input)).toBe("string");
|
|
375
|
-
});
|
|
376
|
-
});
|
|
377
|
-
|
|
378
|
-
test("should not modify global state", () => {
|
|
379
|
-
const before = Date.now();
|
|
380
|
-
secondsToMS(125);
|
|
381
|
-
const after = Date.now();
|
|
382
|
-
// Should complete quickly and not affect global state
|
|
383
|
-
expect(after - before).toBeLessThan(100);
|
|
384
|
-
});
|
|
385
|
-
|
|
386
|
-
test("should handle very long durations", () => {
|
|
387
|
-
const result = secondsToMS(999999);
|
|
388
|
-
expect(typeof result).toBe("string");
|
|
389
|
-
expect(result).toMatch(/^\d+:\d+$/); // Changed to allow decimal seconds
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
test("should be deterministic", () => {
|
|
393
|
-
const input = 125.5;
|
|
394
|
-
const results = Array.from({ length: 10 }, () => secondsToMS(input));
|
|
395
|
-
const uniqueResults = new Set(results);
|
|
396
|
-
expect(uniqueResults.size).toBe(1);
|
|
397
|
-
expect(results[0]).toBe("2:5.5");
|
|
398
|
-
});
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
describe("performance considerations", () => {
|
|
402
|
-
test("should handle zero input efficiently", () => {
|
|
403
|
-
const start = Date.now();
|
|
404
|
-
for (let i = 0; i < 1000; i++) {
|
|
405
|
-
secondsToMS(0);
|
|
406
|
-
}
|
|
407
|
-
const end = Date.now();
|
|
408
|
-
expect(end - start).toBeLessThan(100); // Should be very fast
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
test("should handle large inputs efficiently", () => {
|
|
412
|
-
const start = Date.now();
|
|
413
|
-
for (let i = 0; i < 1000; i++) {
|
|
414
|
-
secondsToMS(999999);
|
|
415
|
-
}
|
|
416
|
-
const end = Date.now();
|
|
417
|
-
expect(end - start).toBeLessThan(100); // Should be very fast
|
|
418
|
-
});
|
|
419
|
-
|
|
420
|
-
test("should handle decimal inputs efficiently", () => {
|
|
421
|
-
const start = Date.now();
|
|
422
|
-
for (let i = 0; i < 1000; i++) {
|
|
423
|
-
secondsToMS(125.789);
|
|
424
|
-
}
|
|
425
|
-
const end = Date.now();
|
|
426
|
-
expect(end - start).toBeLessThan(100); // Should be very fast
|
|
427
|
-
});
|
|
428
|
-
});
|
|
429
|
-
|
|
430
|
-
describe("unique characteristics", () => {
|
|
431
|
-
test("should always show minutes even for large hour values", () => {
|
|
432
|
-
expect(secondsToMS(3600)).toBe("60:00"); // 1 hour = 60 minutes
|
|
433
|
-
expect(secondsToMS(7200)).toBe("120:00"); // 2 hours = 120 minutes
|
|
434
|
-
expect(secondsToMS(86400)).toBe("1440:00"); // 24 hours = 1440 minutes
|
|
435
|
-
});
|
|
436
|
-
|
|
437
|
-
test("should handle fractional minutes correctly", () => {
|
|
438
|
-
expect(secondsToMS(90)).toBe("1:30"); // 1.5 minutes = 1:30
|
|
439
|
-
expect(secondsToMS(150)).toBe("2:30"); // 2.5 minutes = 2:30
|
|
440
|
-
expect(secondsToMS(210)).toBe("3:30"); // 3.5 minutes = 3:30
|
|
441
|
-
});
|
|
442
|
-
|
|
443
|
-
test("should preserve decimal precision in seconds display", () => {
|
|
444
|
-
expect(secondsToMS(90.5)).toBe("1:30.5"); // Shows decimal seconds
|
|
445
|
-
expect(secondsToMS(150.25)).toBe("2:30.25"); // Shows decimal seconds
|
|
446
|
-
expect(secondsToMS(210.75)).toBe("3:30.75"); // Shows decimal seconds
|
|
447
|
-
});
|
|
448
|
-
|
|
449
|
-
test("should pad integer seconds to 2 digits but preserve decimals as-is", () => {
|
|
450
|
-
expect(secondsToMS(5)).toBe("0:05"); // Pads integer seconds
|
|
451
|
-
expect(secondsToMS(65)).toBe("1:05"); // Pads integer seconds
|
|
452
|
-
expect(secondsToMS(5.5)).toBe("0:5.5"); // Doesn't pad decimal seconds
|
|
453
|
-
expect(secondsToMS(65.5)).toBe("1:5.5"); // Doesn't pad decimal seconds
|
|
454
|
-
});
|
|
455
|
-
|
|
456
|
-
test("should be suitable for short duration displays", () => {
|
|
457
|
-
// This function is ideal for displaying durations that are typically
|
|
458
|
-
// measured in minutes rather than hours
|
|
459
|
-
const shortDurations = [15, 30, 45, 60, 90, 120, 180, 300, 600];
|
|
460
|
-
|
|
461
|
-
shortDurations.forEach((duration) => {
|
|
462
|
-
const result = secondsToMS(duration);
|
|
463
|
-
expect(result?.split(":")?.[0]?.length).toBeLessThanOrEqual(2);
|
|
464
|
-
});
|
|
465
|
-
});
|
|
466
|
-
});
|
|
467
|
-
});
|