units.spec.js (13601B)
1 import { describe, test, expect } from 'vitest'; 2 import * as units from '@/core/units'; 3 4 describe('convertTime method', () => { 5 test('90 seconds should equal 1.5 minutes', () => { 6 const result = units.convertTime(90, 'seconds', 'minutes'); 7 expect(result).to.equal(1.5); 8 }); 9 10 test('1.5 minutes should equal 95 seconds', () => { 11 const result = units.convertTime(1.5, 'minutes', 'seconds'); 12 expect(result).to.equal(90); 13 }); 14 }); 15 16 describe('convertDistance method', () => { 17 test('100 meters should equal 0.1 kilometers', () => { 18 const result = units.convertDistance(100, 'meters', 'kilometers'); 19 expect(result).to.equal(0.1); 20 }); 21 22 test('0.1 kilometers should equal 100 meters', () => { 23 const result = units.convertDistance(0.1, 'kilometers', 'meters'); 24 expect(result).to.equal(100); 25 }); 26 }); 27 28 describe('convertSpeed method', () => { 29 test('1000 meters per seconds should equal 3600 kilometers per hour', () => { 30 const result = units.convertSpeed(1000, 'meters_per_second', 'kilometers_per_hour'); 31 expect(result).to.equal(3600); 32 }); 33 34 test('3600 kilometers per hour should equal 1000 meters per second', () => { 35 const result = units.convertSpeed(3600, 'kilometers_per_hour', 'meters_per_second'); 36 expect(result).to.equal(1000); 37 }); 38 }); 39 40 describe('convertPace method', () => { 41 test('1 second per meter should equal 1000 seconds per kilometer', () => { 42 const result = units.convertPace(1, 'seconds_per_meter', 'seconds_per_kilometer'); 43 expect(result).to.equal(1000); 44 }); 45 46 test('1000 seconds per kilometer should equal 1 second per meter', () => { 47 const result = units.convertPace(1000, 'seconds_per_kilometer', 'seconds_per_meter'); 48 expect(result).to.equal(1); 49 }); 50 }); 51 52 describe('convertSpeedPace method', () => { 53 test('3600 kilometers per hour should equal 1 second per kilometer', () => { 54 const result = units.convertSpeedPace(3600, 'kilometers_per_hour', 'seconds_per_kilometer'); 55 expect(result).to.equal(1); 56 }); 57 58 test('1 second per kilometer should equal 3600 kilometers per hour', () => { 59 const result = units.convertSpeedPace(3600, 'seconds_per_kilometer', 'kilometers_per_hour'); 60 expect(result).to.equal(1); 61 }); 62 }); 63 64 describe('formatNumber method', () => { 65 test('should correctly format number when padding is not 0', () => { 66 let result = units.formatNumber(12.3, 3, 0); 67 expect(result).to.equal('012'); 68 69 result = units.formatNumber(12.3, 3, 2); 70 expect(result).to.equal('012.30'); 71 72 result = units.formatNumber(123, 2, 0); 73 expect(result).to.equal('123'); 74 75 result = units.formatNumber(-12, 3, 0); 76 expect(result).to.equal('-012'); 77 }); 78 79 test('should correctly format number when extraDigits is true', () => { 80 let result = units.formatNumber(1234, 0, 2); 81 expect(result).to.equal('1234.00'); 82 83 result = units.formatNumber(1234.5, 0, 2); 84 expect(result).to.equal('1234.50'); 85 86 result = units.formatNumber(1234.56, 0, 2); 87 expect(result).to.equal('1234.56'); 88 89 result = units.formatNumber(1234.567, 0, 2); 90 expect(result).to.equal('1234.57'); 91 92 result = units.formatNumber(1234.56, 0, 0); 93 expect(result).to.equal('1235'); 94 }); 95 96 test('should correctly format number when extraDigits is false', () => { 97 let result = units.formatNumber(1234, 0, 2, false); 98 expect(result).to.equal('1234'); 99 100 result = units.formatNumber(1234.5, 0, 2, false); 101 expect(result).to.equal('1234.5'); 102 103 result = units.formatNumber(1234.56, 0, 2, false); 104 expect(result).to.equal('1234.56'); 105 106 result = units.formatNumber(1234.567, 0, 2, false); 107 expect(result).to.equal('1234.57'); 108 109 result = units.formatNumber(1234.56, 0, 0, false); 110 expect(result).to.equal('1235'); 111 }); 112 113 test('should correctly format undefined', () => { 114 let result = units.formatNumber(undefined, 0, 2); 115 expect(result).to.equal('NaN'); 116 117 result = units.formatNumber(undefined, 0, 2, false); 118 expect(result).to.equal('NaN'); 119 120 result = units.formatNumber(undefined, 5, 2); 121 expect(result).to.equal('NaN'); 122 }); 123 124 test('should correctly format NaN', () => { 125 let result = units.formatNumber(NaN, 0, 0); 126 expect(result).to.equal('NaN'); 127 128 result = units.formatNumber(NaN, 0, 2, false); 129 expect(result).to.equal('NaN'); 130 131 result = units.formatNumber(NaN, 5, 2); 132 expect(result).to.equal('NaN'); 133 }); 134 135 test('should correctly format +/- Infinity', () => { 136 let result = units.formatNumber(Infinity); 137 expect(result).to.equal('Infinity'); 138 139 result = units.formatNumber(Infinity, 10, 2); 140 expect(result).to.equal('Infinity'); 141 142 result = units.formatNumber(-Infinity); 143 expect(result).to.equal('-Infinity'); 144 }); 145 146 test('should correctly format numbers smaller than 1', () => { 147 let result = units.formatNumber(0.123, 0, 0); 148 expect(result).to.equal('0'); 149 150 result = units.formatNumber(0.123, 0, 2); 151 expect(result).to.equal('0.12'); 152 }); 153 154 test('should correctly format negative numbers', () => { 155 let result = units.formatNumber(-12, 0, 2, false); 156 expect(result).to.equal('-12'); 157 158 result = units.formatNumber(-12, 0, 2); 159 expect(result).to.equal('-12.00'); 160 161 result = units.formatNumber(-12.34, 0, 2); 162 expect(result).to.equal('-12.34'); 163 164 result = units.formatNumber(-12.34, 3, 2); 165 expect(result).to.equal('-012.34'); 166 167 result = units.formatNumber(-0.12, 0, 2); 168 expect(result).to.equal('-0.12'); 169 }); 170 }); 171 172 describe('formatDistance method', () => { 173 test('should correctly format distances with a variety of units', () => { 174 let result = units.formatDistance({ 175 distanceValue: 1, 176 distanceUnit: units.DistanceUnits.Yards, 177 }, false); 178 expect(result).to.equal('1 yd'); 179 180 result = units.formatDistance({ 181 distanceValue: 2, 182 distanceUnit: units.DistanceUnits.Meters, 183 }, false); 184 expect(result).to.equal('2 m'); 185 186 result = units.formatDistance({ 187 distanceValue: 3, 188 distanceUnit: units.DistanceUnits.Kilometers, 189 }, false); 190 expect(result).to.equal('3 km'); 191 192 result = units.formatDistance({ 193 distanceValue: 4, 194 distanceUnit: units.DistanceUnits.Miles, 195 }, false); 196 expect(result).to.equal('4 mi'); 197 198 result = units.formatDistance({ 199 distanceValue: 5, 200 distanceUnit: units.DistanceUnits.Marathons, 201 }, false); 202 expect(result).to.equal('5 Mar'); 203 }); 204 205 test('should correctly format distance when extraDigits is true', () => { 206 let result = units.formatDistance({ 207 distanceValue: 1234, 208 distanceUnit: units.DistanceUnits.Miles, 209 }, true); 210 expect(result).to.equal('1234.00 mi'); 211 212 result = units.formatDistance({ 213 distanceValue: 1234.5, 214 distanceUnit: units.DistanceUnits.Miles, 215 }, true); 216 expect(result).to.equal('1234.50 mi'); 217 218 result = units.formatDistance({ 219 distanceValue: 1234.56, 220 distanceUnit: units.DistanceUnits.Miles, 221 }, true); 222 expect(result).to.equal('1234.56 mi'); 223 224 result = units.formatDistance({ 225 distanceValue: 1234.567, 226 distanceUnit: units.DistanceUnits.Miles, 227 }, true); 228 expect(result).to.equal('1234.57 mi'); 229 }); 230 231 test('should correctly format distance when extraDigits is false', () => { 232 let result = units.formatDistance({ 233 distanceValue: 1234, 234 distanceUnit: units.DistanceUnits.Miles, 235 }, false); 236 expect(result).to.equal('1234 mi'); 237 238 result = units.formatDistance({ 239 distanceValue: 1234.5, 240 distanceUnit: units.DistanceUnits.Miles, 241 }, false); 242 expect(result).to.equal('1234.5 mi'); 243 244 result = units.formatDistance({ 245 distanceValue: 1234.56, 246 distanceUnit: units.DistanceUnits.Miles, 247 }, false); 248 expect(result).to.equal('1234.56 mi'); 249 250 result = units.formatDistance({ 251 distanceValue: 1234.567, 252 distanceUnit: units.DistanceUnits.Miles, 253 }, false); 254 expect(result).to.equal('1234.57 mi'); 255 }); 256 257 test('should correctly format distances smaller than 1', () => { 258 let result = units.formatDistance({ 259 distanceValue: 0, 260 distanceUnit: units.DistanceUnits.Miles, 261 }, false); 262 expect(result).to.equal('0 mi'); 263 264 result = units.formatDistance({ 265 distanceValue: 0, 266 distanceUnit: units.DistanceUnits.Miles, 267 }, true); 268 expect(result).to.equal('0.00 mi'); 269 270 result = units.formatDistance({ 271 distanceValue: 0.1, 272 distanceUnit: units.DistanceUnits.Miles, 273 }, false); 274 expect(result).to.equal('0.1 mi'); 275 276 result = units.formatDistance({ 277 distanceValue: 0.1, 278 distanceUnit: units.DistanceUnits.Miles, 279 }, true); 280 expect(result).to.equal('0.10 mi'); 281 282 result = units.formatDistance({ 283 distanceValue: 0.12, 284 distanceUnit: units.DistanceUnits.Miles, 285 }, false); 286 expect(result).to.equal('0.12 mi'); 287 }); 288 289 test('should correctly format negative distances', () => { 290 let result = units.formatDistance({ 291 distanceValue: -1234, 292 distanceUnit: units.DistanceUnits.Miles, 293 }, false); 294 expect(result).to.equal('-1234 mi'); 295 296 result = units.formatDistance({ 297 distanceValue: -1234, 298 distanceUnit: units.DistanceUnits.Miles, 299 }, true); 300 expect(result).to.equal('-1234.00 mi'); 301 302 result = units.formatDistance({ 303 distanceValue: -1234.56, 304 distanceUnit: units.DistanceUnits.Miles, 305 }, false); 306 expect(result).to.equal('-1234.56 mi'); 307 }); 308 }); 309 310 describe('formatDuration method', () => { 311 test('should correctly divide durations into parts', () => { 312 const result = units.formatDuration(3600 + 120 + 3 + 0.4); 313 expect(result).to.equal('01:02:03.40'); 314 }); 315 316 test('should correctly format duration when padding is 7', () => { 317 const result = units.formatDuration(3600 + 120 + 3 + 0.4, 7); 318 expect(result).to.equal('01:02:03.40'); 319 }); 320 321 test('should correctly format duration when padding is 3', () => { 322 let result = units.formatDuration(3600 + 120 + 3 + 0.4, 3); 323 expect(result).to.equal('1:02:03.40'); 324 325 result = units.formatDuration(120 + 3 + 0.4, 3); 326 expect(result).to.equal('2:03.40'); 327 328 result = units.formatDuration(3 + 0.4, 3); 329 expect(result).to.equal('0:03.40'); 330 }); 331 332 test('should correctly format duration when padding is 0', () => { 333 const result = units.formatDuration(0.4, 0); 334 expect(result).to.equal('0.40'); 335 }); 336 337 test('should correctly format duration when digits is 3', () => { 338 const result = units.formatDuration(3600 + 120 + 3 + 0.4567, 0, 3); 339 expect(result).to.equal('1:02:03.457'); 340 }); 341 342 test('should correctly format duration when digits is 0', () => { 343 const result = units.formatDuration(3600 + 120 + 3 + 0.456, 0, 0); 344 expect(result).to.equal('1:02:03'); 345 }); 346 347 test('should correctly format NaN', () => { 348 const result = units.formatDuration(NaN); 349 expect(result).to.equal('NaN'); 350 }); 351 352 test('should correctly format +/- Infinity', () => { 353 let result = units.formatDuration(Infinity); 354 expect(result).to.equal('Infinity'); 355 356 result = units.formatDuration(-Infinity); 357 expect(result).to.equal('-Infinity'); 358 }); 359 360 test('should correctly format 0 when padding is 0', () => { 361 const result = units.formatDuration(0, 0); 362 expect(result).to.equal('0.00'); 363 }); 364 365 test('should correctly format negative durations', () => { 366 const result = units.formatDuration(-3600 - 120 - 3 - 0.4); 367 expect(result).to.equal('-01:02:03.40'); 368 }); 369 370 test('should correctly format 59.9999', () => { 371 const result = units.formatDuration(59.9999); 372 expect(result).to.equal('00:01:00.00'); 373 }); 374 375 test('should correctly format duration when extraDigits is false', () => { 376 let result = units.formatDuration(83, 0, 2, false); 377 expect(result).to.equal('1:23'); 378 379 result = units.formatDuration(83.4, 0, 2, false); 380 expect(result).to.equal('1:23.4'); 381 382 result = units.formatDuration(83.45, 0, 2, false); 383 expect(result).to.equal('1:23.45'); 384 385 result = units.formatDuration(83.456, 0, 2, false); 386 expect(result).to.equal('1:23.46'); 387 388 result = units.formatDuration(83.45, 0, 0, false); 389 expect(result).to.equal('1:23'); 390 }); 391 }); 392 393 describe('formatPace method', () => { 394 test('should correctly format paces in a variety of units', () => { 395 let result = units.formatPace({ 396 distanceValue: 1, 397 distanceUnit: units.DistanceUnits.Meters, 398 time: 600, 399 }, units.PaceUnits.SecondsPerMeter); 400 expect(result).to.equal('10:00 s/m'); 401 402 result = units.formatPace({ 403 distanceValue: 2, 404 distanceUnit: units.DistanceUnits.Kilometers, 405 time: 600, 406 }, units.PaceUnits.TimePerKilometer); 407 expect(result).to.equal('5:00 / km'); 408 409 result = units.formatPace({ 410 distanceValue: 3, 411 distanceUnit: units.DistanceUnits.Miles, 412 time: 600, 413 }, units.PaceUnits.TimePerMile); 414 expect(result).to.equal('3:20 / mi'); 415 }); 416 417 test('should correctly format paces that require distance conversion', () => { 418 let result = units.formatPace({ 419 distanceValue: 100, 420 distanceUnit: units.DistanceUnits.Meters, 421 time: 600, 422 }, units.PaceUnits.TimePerKilometer); 423 expect(result).to.equal('1:40:00 / km'); 424 425 result = units.formatPace({ 426 distanceValue: 2, 427 distanceUnit: units.DistanceUnits.Kilometers, 428 time: 600, 429 }, units.PaceUnits.TimePerMile); 430 expect(result).to.equal('8:03 / mi'); 431 432 result = units.formatPace({ 433 distanceValue: 0.03, 434 distanceUnit: units.DistanceUnits.Miles, 435 time: 600, 436 }, units.PaceUnits.SecondsPerMeter); 437 expect(result).to.equal('0:12 s/m'); 438 }); 439 });