running-tools

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

SplitOutputTable.spec.js (7648B)


      1 import { test, expect } from 'vitest';
      2 import { shallowMount } from '@vue/test-utils';
      3 import SplitOutputTable from '@/components/SplitOutputTable.vue';
      4 
      5 test('should initialize undefined splits to 0:00.00', async () => {
      6   // Initialize component
      7   const wrapper = shallowMount(SplitOutputTable, {
      8     propsData: {
      9       modelValue: [
     10         { result: 'time', distanceValue: 1, distanceUnit: 'miles' },
     11         { result: 'time', distanceValue: 2, distanceUnit: 'miles' },
     12         { result: 'time', distanceValue: 5, distanceUnit: 'kilometers' },
     13       ],
     14     },
     15   });
     16 
     17   // Assert results are correct
     18   const rows = wrapper.findAll('tbody tr');
     19   expect(rows[0].findAll('td')[0].element.textContent).to.equal('1 mi');
     20   expect(rows[0].findAll('td')[1].element.textContent).to.equal('0:00.00');
     21   expect(rows[0].findAll('td')[2].findComponent({ name: 'time-input' }).vm.modelValue).to.equal(0);
     22   expect(rows[0].findAll('td').length).to.equal(4);
     23   expect(rows[1].findAll('td')[0].element.textContent).to.equal('2 mi');
     24   expect(rows[1].findAll('td')[1].element.textContent).to.equal('0:00.00');
     25   expect(rows[1].findAll('td')[2].findComponent({ name: 'time-input' }).vm.modelValue).to.equal(0);
     26   expect(rows[1].findAll('td').length).to.equal(4);
     27   expect(rows[2].findAll('td')[0].element.textContent).to.equal('5 km');
     28   expect(rows[2].findAll('td')[1].element.textContent).to.equal('0:00.00');
     29   expect(rows[2].findAll('td')[2].findComponent({ name: 'time-input' }).vm.modelValue).to.equal(0);
     30   expect(rows[2].findAll('td').length).to.equal(4);
     31   expect(rows.length).to.equal(3);
     32 });
     33 
     34 test('should correctly load split times from split targets', async () => {
     35   // Initialize component
     36   const wrapper = shallowMount(SplitOutputTable, {
     37     propsData: {
     38       modelValue: [
     39         { result: 'time', distanceValue: 1, distanceUnit: 'kilometers', splitTime: 180 },
     40         { result: 'time', distanceValue: 2, distanceUnit: 'kilometers', splitTime: 190 },
     41         { result: 'time', distanceValue: 3000, distanceUnit: 'meters', splitTime: 200 },
     42       ],
     43     },
     44   });
     45 
     46   // Assert results are correct
     47   const rows = wrapper.findAll('tbody tr');
     48   expect(rows[0].findAll('td')[0].element.textContent).to.equal('1 km');
     49   expect(rows[0].findAll('td')[1].element.textContent).to.equal('3:00.00');
     50   expect(rows[0].findAll('td')[2].findComponent({ name: 'time-input' }).vm.modelValue)
     51     .to.equal(180);
     52   expect(rows[0].findAll('td').length).to.equal(4);
     53   expect(rows[1].findAll('td')[0].element.textContent).to.equal('2 km');
     54   expect(rows[1].findAll('td')[1].element.textContent).to.equal('6:10.00');
     55   expect(rows[1].findAll('td')[2].findComponent({ name: 'time-input' }).vm.modelValue)
     56     .to.equal(190);
     57   expect(rows[1].findAll('td').length).to.equal(4);
     58   expect(rows[2].findAll('td')[0].element.textContent).to.equal('3000 m');
     59   expect(rows[2].findAll('td')[1].element.textContent).to.equal('9:30.00');
     60   expect(rows[2].findAll('td')[2].findComponent({ name: 'time-input' }).vm.modelValue)
     61     .to.equal(200);
     62   expect(rows[2].findAll('td').length).to.equal(4);
     63   expect(rows.length).to.equal(3);
     64 });
     65 
     66 test('should correctly calculate paces and cumulative times from entered split times', async () => {
     67   // Initialize component
     68   const wrapper = shallowMount(SplitOutputTable, {
     69     propsData: {
     70       modelValue: [
     71         { result: 'time', distanceValue: 1, distanceUnit: 'miles' },
     72         { result: 'time', distanceValue: 2, distanceUnit: 'miles' },
     73         { result: 'time', distanceValue: 5, distanceUnit: 'kilometers' },
     74       ],
     75     },
     76   });
     77 
     78   // Update split times
     79   await wrapper.findAllComponents({ name: 'time-input' })[0].setValue(420);
     80   await wrapper.findAllComponents({ name: 'time-input' })[1].setValue(390);
     81   await wrapper.findAllComponents({ name: 'time-input' })[2].setValue(390);
     82 
     83   // Assert results are correct
     84   const rows = wrapper.findAll('tbody tr');
     85   expect(rows[0].findAll('td')[0].element.textContent).to.equal('1 mi');
     86   expect(rows[0].findAll('td')[1].element.textContent).to.equal('7:00.00');
     87   expect(rows[0].findAll('td')[2].findComponent({ name: 'time-input' })
     88     .vm.modelValue).to.equal(420);
     89   expect(rows[0].findAll('td')[3].element.textContent).to.equal('4:21 / km');
     90   expect(rows[0].findAll('td').length).to.equal(4);
     91   expect(rows[1].findAll('td')[0].element.textContent).to.equal('2 mi');
     92   expect(rows[1].findAll('td')[1].element.textContent).to.equal('13:30.00');
     93   expect(rows[1].findAll('td')[2].findComponent({ name: 'time-input' })
     94     .vm.modelValue).to.equal(390);
     95   expect(rows[1].findAll('td')[3].element.textContent).to.equal('4:02 / km');
     96   expect(rows[1].findAll('td').length).to.equal(4);
     97   expect(rows[2].findAll('td')[0].element.textContent).to.equal('5 km');
     98   expect(rows[2].findAll('td')[1].element.textContent).to.equal('20:00.00');
     99   expect(rows[2].findAll('td')[2].findComponent({ name: 'time-input' })
    100     .vm.modelValue).to.equal(390);
    101   expect(rows[2].findAll('td')[3].element.textContent).to.equal('3:39 / km');
    102   expect(rows[2].findAll('td').length).to.equal(4);
    103   expect(rows.length).to.equal(3);
    104 });
    105 
    106 test('should emit update event when split times are changed', async () => {
    107   // Initialize component
    108   const wrapper = shallowMount(SplitOutputTable, {
    109     propsData: {
    110       modelValue: [
    111         { result: 'time', distanceValue: 1, distanceUnit: 'kilometers', splitTime: 180 },
    112         { result: 'time', distanceValue: 2, distanceUnit: 'kilometers', splitTime: 180 },
    113         { result: 'time', distanceValue: 3000, distanceUnit: 'meters', splitTime: 180 },
    114       ],
    115     },
    116   });
    117 
    118   // Update split times
    119   await wrapper.findAllComponents({ name: 'time-input' })[1].setValue(190);
    120   await wrapper.findAllComponents({ name: 'time-input' })[2].setValue(200);
    121 
    122   // Assert update events correctly emitted
    123   expect(wrapper.emitted()['update:modelValue']).to.deep.equal([
    124     [[
    125         { result: 'time', distanceValue: 1, distanceUnit: 'kilometers', splitTime: 180 },
    126         { result: 'time', distanceValue: 2, distanceUnit: 'kilometers', splitTime: 190 },
    127         { result: 'time', distanceValue: 3000, distanceUnit: 'meters', splitTime: 180 },
    128     ]],
    129     [[
    130         { result: 'time', distanceValue: 1, distanceUnit: 'kilometers', splitTime: 180 },
    131         { result: 'time', distanceValue: 2, distanceUnit: 'kilometers', splitTime: 190 },
    132         { result: 'time', distanceValue: 3000, distanceUnit: 'meters', splitTime: 200 },
    133     ]],
    134   ]);
    135 });
    136 
    137 test('should update paces according to default units setting', async () => {
    138   // Initialize component
    139   const wrapper = shallowMount(SplitOutputTable, {
    140     propsData: {
    141       modelValue: [
    142         { result: 'time', distanceValue: 1, distanceUnit: 'miles', splitTime: 300 },
    143         { result: 'time', distanceValue: 2, distanceUnit: 'miles', splitTime: 300 },
    144         { result: 'time', distanceValue: 5, distanceUnit: 'kilometers', splitTime: 330 },
    145       ],
    146       defaultUnitSystem: 'metric',
    147     }
    148   });
    149 
    150   // Assert paces are correct
    151   let rows = wrapper.findAll('tbody tr');
    152   expect(rows[0].findAll('td')[3].element.textContent).to.equal('3:06 / km');
    153   expect(rows[1].findAll('td')[3].element.textContent).to.equal('3:06 / km');
    154   expect(rows[2].findAll('td')[3].element.textContent).to.equal('3:05 / km');
    155 
    156   // Change default units
    157   await wrapper.setProps({ defaultUnitSystem: 'imperial' });
    158 
    159   // Assert paces are correct
    160   rows = wrapper.findAll('tbody tr');
    161   expect(rows[0].findAll('td')[3].element.textContent).to.equal('5:00 / mi');
    162   expect(rows[1].findAll('td')[3].element.textContent).to.equal('5:00 / mi');
    163   expect(rows[2].findAll('td')[3].element.textContent).to.equal('4:58 / mi');
    164 });