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