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