running-tools

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

batch-calculator.spec.js (11575B)


      1 import { test, expect } from '@playwright/test';
      2 
      3 test('Batch calculator', async ({ page }) => {
      4   await page.goto('/');
      5 
      6   // Test workout batch results, including modified prediction model and custom target names
      7   {
      8     // Go to batch calculator
      9     await page.getByRole('button', { name: 'Batch Calculator' }).click();
     10     await expect(page).toHaveTitle('Batch Calculator - Running Tools');
     11 
     12     // Enter input pace (2 mi in 10:30)
     13     await page.getByLabel('Input distance value').fill('2');
     14     await page.getByLabel('Input distance unit').selectOption('Miles');
     15     await page.getByLabel('Input duration hours').fill('0');
     16     await page.getByLabel('Input duration minutes').fill('10');
     17     await page.getByLabel('Input duration seconds').fill('30');
     18 
     19     // Enter batch options (15 x 10s increments)
     20     await page.getByLabel('Duration increment minutes').fill('0');
     21     await page.getByLabel('Duration increment seconds').fill('10');
     22     await page.getByLabel('Number of rows').fill('15');
     23 
     24     // Assert workout results are correct
     25     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(0)).toHaveText('2 mi');
     26     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(2)).toHaveText('800 m @ 5 km');
     27     await expect(page.getByRole('row').nth(0).getByRole('cell')).toHaveCount(5);
     28     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toHaveText('10:30');
     29     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(2)).toHaveText('2:41');
     30     await expect(page.getByRole('row').nth(1).getByRole('cell')).toHaveCount(5);
     31     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(0)).toHaveText('12:50');
     32     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(2)).toHaveText('3:17');
     33     await expect(page.getByRole('row').nth(15).getByRole('cell')).toHaveCount(5);
     34     await expect(page.getByRole('row')).toHaveCount(16);
     35 
     36     // Change prediction model, enable customized target names, and set custom batch column label
     37     await page.getByText('Advanced Options').click();
     38     await page.getByLabel('Prediction model').selectOption('Riegel\'s Model');
     39     await page.getByLabel('Workout name customization').selectOption('Enabled');
     40     await page.getByLabel('Batch column label').fill('foo');
     41 
     42     // Assert workout results are correct
     43     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(0)).toHaveText('foo');
     44     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(2)).toHaveText('800 m @ 5 km');
     45     await expect(page.getByRole('row').nth(0).getByRole('cell')).toHaveCount(5);
     46     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toHaveText('10:30');
     47     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(2)).toHaveText('2:41');
     48     await expect(page.getByRole('row').nth(1).getByRole('cell')).toHaveCount(5);
     49     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(0)).toHaveText('12:50');
     50     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(2)).toHaveText('3:17');
     51     await expect(page.getByRole('row').nth(15).getByRole('cell')).toHaveCount(5);
     52     await expect(page.getByRole('row')).toHaveCount(16);
     53   }
     54 
     55   // Test pace batch results, including modified default units
     56   {
     57     // Change calculator
     58     await expect(page.getByLabel('Calculator')).toHaveValue('workout');
     59     await page.getByLabel('Calculator').selectOption('Pace Calculator');
     60 
     61     // Assert pace results are correct
     62     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(0)).toHaveText('2 mi');
     63     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(6)).toHaveText('800 m');
     64     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(28)).toHaveText('10:00');
     65     await expect(page.getByRole('row').nth(0).getByRole('cell')).toHaveCount(31);
     66     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toHaveText('10:30');
     67     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(6)).toHaveText('2:37');
     68     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(28)).toHaveText('1.90 mi');
     69     await expect(page.getByRole('row').nth(1).getByRole('cell')).toHaveCount(31);
     70     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(0)).toHaveText('12:50');
     71     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(6)).toHaveText('3:11');
     72     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(28)).toHaveText('1.56 mi');
     73     await expect(page.getByRole('row').nth(15).getByRole('cell')).toHaveCount(31);
     74     await expect(page.getByRole('row')).toHaveCount(16);
     75 
     76     // Assert prediction options are hidden
     77     await expect(page.getByLabel('Prediction model')).toHaveCount(0);
     78 
     79     // Change default units
     80     await page.getByLabel('Default units').selectOption('Kilometers');
     81 
     82     // Assert pace results are correct
     83     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(0)).toHaveText('2 mi');
     84     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(6)).toHaveText('800 m');
     85     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(28)).toHaveText('10:00');
     86     await expect(page.getByRole('row').nth(0).getByRole('cell')).toHaveCount(31);
     87     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toHaveText('10:30');
     88     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(6)).toHaveText('2:37');
     89     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(28)).toHaveText('3.07 km');
     90     await expect(page.getByRole('row').nth(1).getByRole('cell')).toHaveCount(31);
     91     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(0)).toHaveText('12:50');
     92     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(6)).toHaveText('3:11');
     93     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(28)).toHaveText('2.51 km');
     94     await expect(page.getByRole('row').nth(15).getByRole('cell')).toHaveCount(31);
     95     await expect(page.getByRole('row')).toHaveCount(16);
     96   }
     97 
     98   // Test race batch results, including modified Riegel exponent
     99   {
    100     // Change calculator
    101     await page.getByLabel('Calculator').selectOption('Race Calculator');
    102 
    103     // Assert race results are correct
    104     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(0)).toHaveText('2 mi');
    105     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(2)).toHaveText('800 m');
    106     await expect(page.getByRole('row').nth(0).getByRole('cell')).toHaveCount(17);
    107     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toHaveText('10:30');
    108     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(2)).toHaveText('2:24');
    109     await expect(page.getByRole('row').nth(1).getByRole('cell')).toHaveCount(17);
    110     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(0)).toHaveText('12:50');
    111     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(2)).toHaveText('2:56');
    112     await expect(page.getByRole('row').nth(15).getByRole('cell')).toHaveCount(17);
    113     await expect(page.getByRole('row')).toHaveCount(16);
    114 
    115     // Change Riegel exponent
    116     await expect(page.getByLabel('Prediction model')).toHaveValue('RiegelModel');
    117     await page.getByLabel('Riegel Exponent').fill('1.12');
    118 
    119     // Assert race results are correct
    120     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(0)).toHaveText('2 mi');
    121     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(2)).toHaveText('800 m');
    122     await expect(page.getByRole('row').nth(0).getByRole('cell')).toHaveCount(17);
    123     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toHaveText('10:30');
    124     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(2)).toHaveText('2:12');
    125     await expect(page.getByRole('row').nth(1).getByRole('cell')).toHaveCount(17);
    126     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(0)).toHaveText('12:50');
    127     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(2)).toHaveText('2:42');
    128     await expect(page.getByRole('row').nth(15).getByRole('cell')).toHaveCount(17);
    129     await expect(page.getByRole('row')).toHaveCount(16);
    130   }
    131 
    132   // Reload page
    133   await page.reload();
    134 
    135   // Assert race results are correct (inputs and options not reset)
    136   {
    137     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(0)).toHaveText('2 mi');
    138     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(2)).toHaveText('800 m');
    139     await expect(page.getByRole('row').nth(0).getByRole('cell')).toHaveCount(17);
    140     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toHaveText('10:30');
    141     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(2)).toHaveText('2:12');
    142     await expect(page.getByRole('row').nth(1).getByRole('cell')).toHaveCount(17);
    143     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(0)).toHaveText('12:50');
    144     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(2)).toHaveText('2:42');
    145     await expect(page.getByRole('row').nth(15).getByRole('cell')).toHaveCount(17);
    146     await expect(page.getByRole('row')).toHaveCount(16);
    147   }
    148 
    149   // Assert pace results are correct (inputs and options not reset)
    150   {
    151     await page.getByLabel('Calculator').selectOption('Pace Calculator');
    152     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(0)).toHaveText('2 mi');
    153     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(6)).toHaveText('800 m');
    154     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(28)).toHaveText('10:00');
    155     await expect(page.getByRole('row').nth(0).getByRole('cell')).toHaveCount(31);
    156     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toHaveText('10:30');
    157     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(6)).toHaveText('2:37');
    158     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(28)).toHaveText('3.07 km');
    159     await expect(page.getByRole('row').nth(1).getByRole('cell')).toHaveCount(31);
    160     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(0)).toHaveText('12:50');
    161     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(6)).toHaveText('3:11');
    162     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(28)).toHaveText('2.51 km');
    163     await expect(page.getByRole('row').nth(15).getByRole('cell')).toHaveCount(31);
    164     await expect(page.getByRole('row')).toHaveCount(16);
    165   }
    166 
    167   // Assert workout results are correct (inputs not reset, but updated options are used)
    168   {
    169     await page.getByLabel('Calculator').selectOption('Workout Calculator');
    170     await expect(page.getByLabel('Workout name customization')).toHaveValue("true");
    171     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(0)).toHaveText('foo');
    172     await expect(page.getByRole('row').nth(0).getByRole('cell').nth(2)).toHaveText('800 m @ 5 km');
    173     await expect(page.getByRole('row').nth(0).getByRole('cell')).toHaveCount(5);
    174     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toHaveText('10:30');
    175     await expect(page.getByRole('row').nth(1).getByRole('cell').nth(2)).toHaveText('2:45');
    176     await expect(page.getByRole('row').nth(1).getByRole('cell')).toHaveCount(5);
    177     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(0)).toHaveText('12:50');
    178     await expect(page.getByRole('row').nth(15).getByRole('cell').nth(2)).toHaveText('3:22');
    179     await expect(page.getByRole('row').nth(15).getByRole('cell')).toHaveCount(5);
    180     await expect(page.getByRole('row')).toHaveCount(16);
    181   }
    182 });