running-tools

A collection of tools for runners and their coaches
git clone https://git.ashermorgan.net/running-tools/
Log | Files | Refs | README

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 });