running-tools

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

split-calculator.spec.js (12573B)


      1 import { test, expect } from '@playwright/test';
      2 
      3 test('Split Calculator', async ({ page }) => {
      4   // Go to split calculator
      5   await page.goto('/');
      6   await page.getByRole('button', { name: 'Split Calculator' }).click();
      7   await expect(page).toHaveTitle('Split Calculator - Running Tools');
      8 
      9   // Test standard split results
     10   {
     11     // Enter input 5K splits (7:00, 6:30, 6:30)
     12     await page.getByLabel('Split duration minutes').nth(0).fill('7');
     13     await page.getByLabel('Split duration seconds').nth(0).fill('0');
     14     await page.getByLabel('Split duration minutes').nth(1).fill('6');
     15     await page.getByLabel('Split duration seconds').nth(1).fill('30');
     16     await page.getByLabel('Split duration minutes').nth(2).fill('6');
     17     await page.getByLabel('Split duration seconds').nth(2).fill('30');
     18 
     19     // Assert times and paces are correct
     20     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(1)).toHaveText('7:00.00');
     21     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(3)).toHaveText('7:00 / mi');
     22     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(1)).toHaveText('13:30.00');
     23     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(3)).toHaveText('6:30 / mi');
     24     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(1)).toHaveText('20:00.00');
     25     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(3)).toHaveText('5:52 / mi');
     26     await expect(page.getByRole('row')).toHaveCount(4);
     27   }
     28 
     29   // Test different calculator options
     30   {
     31     // Change default units
     32     await page.getByLabel('Default units').selectOption('Kilometers');
     33 
     34     // Assert times and paces are correct
     35     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(1)).toHaveText('7:00.00');
     36     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(3)).toHaveText('4:21 / km');
     37     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(1)).toHaveText('13:30.00');
     38     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(3)).toHaveText('4:02 / km');
     39     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(1)).toHaveText('20:00.00');
     40     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(3)).toHaveText('3:39 / km');
     41     await expect(page.getByRole('row')).toHaveCount(4);
     42   }
     43 
     44   // Test modified default target set
     45   {
     46     // Edit target set
     47     await page.getByRole('button', { name: 'Edit target set' }).click();
     48     await page.getByLabel('Target set label').fill('5K 1600m Splits');
     49     await page.getByLabel('Target distance value').nth(0).fill('1.6');
     50     await page.getByLabel('Target distance unit').nth(0).selectOption('Kilometers');
     51     await page.getByLabel('Target distance value').nth(1).fill('3.2');
     52     await page.getByLabel('Target distance unit').nth(1).selectOption('Kilometers');
     53     await page.getByRole('button', { name: 'Add distance target' }).click();
     54     await page.getByLabel('Target distance value').nth(3).fill('4.8');
     55     await page.getByLabel('Target distance unit').nth(3).selectOption('Kilometers');
     56     await page.getByRole('button', { name: 'Close' }).click();
     57 
     58     // Assert times and paces are correct (new distances are processed)
     59     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(1)).toHaveText('7:00.00');
     60     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(3)).toHaveText('4:23 / km');
     61     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(1)).toHaveText('13:30.00');
     62     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(3)).toHaveText('4:04 / km');
     63     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(1)).toHaveText('13:30.00');
     64     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(3)).toHaveText('0:00 / km');
     65     await expect(page.getByRole('row').nth(4).getByRole('cell').nth(1)).toHaveText('20:00.00');
     66     await expect(page.getByRole('row').nth(4).getByRole('cell').nth(3)).toHaveText('32:30 / km');
     67     await expect(page.getByRole('row')).toHaveCount(5);
     68 
     69     // Update third and fourth splits
     70     await page.getByLabel('Split duration minutes').nth(2).fill('6');
     71     await page.getByLabel('Split duration seconds').nth(2).fill('0');
     72     await page.getByLabel('Split duration minutes').nth(3).fill('0');
     73     await page.getByLabel('Split duration seconds').nth(3).fill('30');
     74     await page.getByLabel('Split duration seconds').nth(3).blur();
     75 
     76     // Assert times and paces are correct (new input splits are processed)
     77     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(1)).toHaveText('7:00.00');
     78     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(3)).toHaveText('4:23 / km');
     79     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(1)).toHaveText('13:30.00');
     80     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(3)).toHaveText('4:04 / km');
     81     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(1)).toHaveText('19:30.00');
     82     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(3)).toHaveText('3:45 / km');
     83     await expect(page.getByRole('row').nth(4).getByRole('cell').nth(1)).toHaveText('20:00.00');
     84     await expect(page.getByRole('row').nth(4).getByRole('cell').nth(3)).toHaveText('2:30 / km');
     85     await expect(page.getByRole('row')).toHaveCount(5);
     86   }
     87 
     88   // Test custom target set
     89   {
     90     // Create custom target set
     91     await page.getByLabel('Selected target set').selectOption('[ Create New Target Set ]');
     92     await expect(page.getByRole('row').nth(4)).toHaveText('There aren\'t any targets in this set yet.');
     93     await expect(page.getByRole('row')).toHaveCount(5);
     94 
     95     // Edit new target set
     96     await expect(page.getByRole('row').nth(1)).toHaveText('There aren\'t any targets in this set yet.');
     97     await expect(page.getByLabel('Target set label')).toHaveValue('New target set');
     98     await page.getByLabel('Target set label').fill('800m Splits');
     99     await page.getByRole('button', { name: 'Add distance target' }).click();
    100     await page.getByLabel('Target distance value').nth(0).fill('0.4');
    101     await page.getByLabel('Target distance unit').nth(0).selectOption('Kilometers');
    102     await page.getByRole('button', { name: 'Add distance target' }).click();
    103     await page.getByLabel('Target distance value').nth(1).fill('800');
    104     await page.getByLabel('Target distance unit').nth(1).selectOption('Meters');
    105     await page.getByRole('button', { name: 'Close' }).click();
    106 
    107     // Assert times and paces are correct (input splits initialized to zero)
    108     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toHaveText('0.4 km');
    109     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(1)).toHaveText('0:00.00');
    110     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(3)).toHaveText('0:00 / km');
    111     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(0)).toHaveText('800 m');
    112     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(1)).toHaveText('0:00.00');
    113     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(3)).toHaveText('0:00 / km');
    114     await expect(page.getByRole('row')).toHaveCount(3);
    115 
    116     // Enter input 800m splits (0:55, 1:05)
    117     await page.getByLabel('Split duration minutes').nth(0).fill('0');
    118     await page.getByLabel('Split duration seconds').nth(0).fill('55');
    119     await page.getByLabel('Split duration minutes').nth(1).fill('1');
    120     await page.getByLabel('Split duration seconds').nth(1).fill('5');
    121 
    122     // Assert times and paces are correct
    123     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(1)).toHaveText('0:55.00');
    124     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(3)).toHaveText('2:18 / km');
    125     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(1)).toHaveText('2:00.00');
    126     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(3)).toHaveText('2:43 / km');
    127     await expect(page.getByRole('row')).toHaveCount(3);
    128   }
    129 
    130   // Reload page
    131   await page.reload();
    132 
    133   // Assert outputs are still the same
    134   {
    135     // Assert times and paces are correct (custom targets, split times, and default units not reset)
    136     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toHaveText('0.4 km');
    137     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(1)).toHaveText('0:55.00');
    138     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(3)).toHaveText('2:18 / km');
    139     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(0)).toHaveText('800 m');
    140     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(1)).toHaveText('2:00.00');
    141     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(3)).toHaveText('2:43 / km');
    142     await expect(page.getByRole('row')).toHaveCount(3);
    143 
    144     // Switch target set
    145     await page.getByLabel('Selected target set').selectOption('5K 1600m Splits');
    146 
    147     // Assert times and paces are correct (input splits are not reset)
    148     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(1)).toHaveText('7:00.00');
    149     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(3)).toHaveText('4:23 / km');
    150     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(1)).toHaveText('13:30.00');
    151     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(3)).toHaveText('4:04 / km');
    152     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(1)).toHaveText('19:30.00');
    153     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(3)).toHaveText('3:45 / km');
    154     await expect(page.getByRole('row').nth(4).getByRole('cell').nth(1)).toHaveText('20:00.00');
    155     await expect(page.getByRole('row').nth(4).getByRole('cell').nth(3)).toHaveText('2:30 / km');
    156     await expect(page.getByRole('row')).toHaveCount(5);
    157   }
    158 
    159   // Test target set deletion and reversion
    160   {
    161     // Delete custom target set
    162     await page.getByLabel('Selected target set').selectOption('800m Splits');
    163     await page.getByRole('button', { name: 'Edit target set' }).click();
    164     await expect(page.getByLabel('Target set label')).toHaveValue('800m Splits');
    165     await page.getByRole('button', { name: 'Delete target set' }).click();
    166 
    167     // Assert times and paces are correct (back to default target set)
    168     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(1)).toHaveText('7:00.00');
    169     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(3)).toHaveText('4:23 / km');
    170     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(1)).toHaveText('13:30.00');
    171     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(3)).toHaveText('4:04 / km');
    172     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(1)).toHaveText('19:30.00');
    173     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(3)).toHaveText('3:45 / km');
    174     await expect(page.getByRole('row').nth(4).getByRole('cell').nth(1)).toHaveText('20:00.00');
    175     await expect(page.getByRole('row').nth(4).getByRole('cell').nth(3)).toHaveText('2:30 / km');
    176     await expect(page.getByRole('row')).toHaveCount(5);
    177 
    178     // Revert target set
    179     await page.getByRole('button', { name: 'Edit target set' }).click();
    180     await expect(page.getByLabel('Target set label')).toHaveValue('5K 1600m Splits');
    181     await page.getByRole('button', { name: 'Revert target set' }).click();
    182     await page.getByRole('button', { name: 'Close' }).click();
    183 
    184     // Assert times and paces are correct (split times are reverted)
    185     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toHaveText('1 mi');
    186     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(1)).toHaveText('0:00.00');
    187     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(3)).toHaveText('0:00 / km');
    188     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(0)).toHaveText('2 mi');
    189     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(1)).toHaveText('0:00.00');
    190     await expect(page.getByRole('row').nth(2).getByRole('cell').nth(3)).toHaveText('0:00 / km');
    191     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(0)).toHaveText('5 km');
    192     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(1)).toHaveText('0:00.00');
    193     await expect(page.getByRole('row').nth(3).getByRole('cell').nth(3)).toHaveText('0:00 / km');
    194     await expect(page.getByRole('row')).toHaveCount(4);
    195 
    196     // Assert title was reset
    197     await page.getByRole('button', { name: 'Edit target set' }).click();
    198     await expect(page.getByLabel('Target set label')).toHaveValue('5K Mile Splits');
    199   }
    200 });