running-tools

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

commit bf518dc569a9970f68d021e03d94233fbb3e1eaa
parent 7d2e81f3445e849cd183eda85394973789363413
Author: Asher Morgan <59518073+ashermorgan@users.noreply.github.com>
Date:   Sat, 12 Jul 2025 08:03:16 -0700

Fix length of mile

The modern mile is defined as exactly 1609.3440 meters.

Diffstat:
Msrc/utils/units.ts | 2+-
Mtests/e2e/cross-calculator.spec.js | 12++++++------
Mtests/e2e/pace-calculator.spec.js | 4++--
Mtests/e2e/race-calculator.spec.js | 14+++++++-------
Mtests/e2e/unit-calculator.spec.js | 4++--
Mtests/e2e/workout-calculator.spec.js | 6+++---
Mtests/unit/utils/calculators.spec.js | 6+++---
Mtests/unit/views/RaceCalculator.spec.js | 2+-
8 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/src/utils/units.ts b/src/utils/units.ts @@ -62,7 +62,7 @@ export const DistanceUnitData: { [key in DistanceUnits]: UnitData } = { [DistanceUnits.Miles]: { name: 'Miles', symbol: 'mi', - value: 1609.3499, + value: 1609.344, }, [DistanceUnits.Marathons]: { name: 'Marathons', diff --git a/tests/e2e/cross-calculator.spec.js b/tests/e2e/cross-calculator.spec.js @@ -172,7 +172,7 @@ test('Cross-calculator', async ({ page }) => { await page.getByRole('button', { name: 'Pace Calculator' }).click(); // Assert paces are correct (input pace not reset) - await expect(page.getByRole('row').nth(1)).toHaveText('0.4 km' + '1:55.57'); + await expect(page.getByRole('row').nth(1)).toHaveText('0.4 km' + '1:55.58'); await expect(page.getByRole('row').nth(2)).toHaveText('800 m' + '3:51.15'); await expect(page.getByRole('row').nth(3)).toHaveText('2.08 km' + '10:00'); await expect(page.getByRole('row')).toHaveCount(4); @@ -183,7 +183,7 @@ test('Cross-calculator', async ({ page }) => { // Assert race predictions are correct (input race not resset and new prediction model loaded) await expect(page.getByRole('row').nth(5)).toHaveText('1 mi' + '5:02.17' + '3:08 / km'); - await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '16:44.86' + '3:21 / km'); + await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '16:44.87' + '3:21 / km'); await expect(page.getByRole('row')).toHaveCount(17); // Return to split calculator @@ -204,7 +204,7 @@ test('Cross-calculator', async ({ page }) => { await page.getByRole('button', { name: 'Unit Calculator' }).click(); // Assert result is correct (state not reset) - await expect(page.getByLabel('Output value')).toHaveText('00:09:39.366'); + await expect(page.getByLabel('Output value')).toHaveText('00:09:39.364'); // Return to workout calculator await page.getByRole('link', { name: 'Back' }).click(); @@ -459,7 +459,7 @@ test('Cross-calculator', async ({ page }) => { await page.getByRole('button', { name: 'Pace Calculator' }).click(); // Assert paces are correct (input pace not reset) - await expect(page.getByRole('row').nth(1)).toHaveText('0.4 km' + '1:55.57'); + await expect(page.getByRole('row').nth(1)).toHaveText('0.4 km' + '1:55.58'); await expect(page.getByRole('row').nth(2)).toHaveText('800 m' + '3:51.15'); await expect(page.getByRole('row').nth(3)).toHaveText('2.08 km' + '10:00'); await expect(page.getByRole('row')).toHaveCount(4); @@ -470,7 +470,7 @@ test('Cross-calculator', async ({ page }) => { // Assert race predictions are correct (input race not resset and new prediction model loaded) await expect(page.getByRole('row').nth(5)).toHaveText('1 mi' + '5:02.17' + '3:08 / km'); - await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '16:44.86' + '3:21 / km'); + await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '16:44.87' + '3:21 / km'); await expect(page.getByRole('row')).toHaveCount(17); // Return to split calculator @@ -491,7 +491,7 @@ test('Cross-calculator', async ({ page }) => { await page.getByRole('button', { name: 'Unit Calculator' }).click(); // Assert result is correct (state not reset) - await expect(page.getByLabel('Output value')).toHaveText('00:09:39.366'); + await expect(page.getByLabel('Output value')).toHaveText('00:09:39.364'); // Return to workout calculator await page.getByRole('link', { name: 'Back' }).click(); diff --git a/tests/e2e/pace-calculator.spec.js b/tests/e2e/pace-calculator.spec.js @@ -75,7 +75,7 @@ test('Pace Calculator', async ({ page }) => { await page.getByRole('button', { name: 'Close' }).click(); // Assert paces are correct - await expect(page.getByRole('row').nth(1)).toHaveText('0.4 km' + '1:55.57'); + await expect(page.getByRole('row').nth(1)).toHaveText('0.4 km' + '1:55.58'); await expect(page.getByRole('row').nth(2)).toHaveText('800 m' + '3:51.15'); await expect(page.getByRole('row')).toHaveCount(3); @@ -83,7 +83,7 @@ test('Pace Calculator', async ({ page }) => { await page.reload(); // Assert paces are correct (custom targets and default units not reset) - await expect(page.getByRole('row').nth(1)).toHaveText('0.4 km' + '1:55.57'); + await expect(page.getByRole('row').nth(1)).toHaveText('0.4 km' + '1:55.58'); await expect(page.getByRole('row').nth(2)).toHaveText('800 m' + '3:51.15'); await expect(page.getByRole('row')).toHaveCount(3); diff --git a/tests/e2e/race-calculator.spec.js b/tests/e2e/race-calculator.spec.js @@ -48,7 +48,7 @@ test('Race Calculator', async ({ page }) => { // Assert race predictions are correct await expect(page.getByRole('row').nth(5)).toHaveText('1 mi' + '5:02.17' + '3:08 / km'); - await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '16:44.86' + '3:21 / km'); + await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '16:44.87' + '3:21 / km'); await expect(page.getByRole('row')).toHaveCount(17); // Change Riegel exponent @@ -56,7 +56,7 @@ test('Race Calculator', async ({ page }) => { // Assert race predictions are correct await expect(page.getByRole('row').nth(5)).toHaveText('1 mi' + '4:49.86' + '3:00 / km'); - await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '17:11.77' + '3:26 / km'); + await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '17:11.78' + '3:26 / km'); await expect(page.getByRole('row')).toHaveCount(17); // Edit default target set @@ -95,16 +95,16 @@ test('Race Calculator', async ({ page }) => { await page.getByRole('button', { name: 'Close' }).click(); // Assert race predictions are correct - await expect(page.getByRole('row').nth(1)).toHaveText('5 km' + '17:11.77' + '3:26 / km'); - await expect(page.getByRole('row').nth(2)).toHaveText('10 km' + '37:22.53' + '3:44 / km'); + await expect(page.getByRole('row').nth(1)).toHaveText('5 km' + '17:11.78' + '3:26 / km'); + await expect(page.getByRole('row').nth(2)).toHaveText('10 km' + '37:22.54' + '3:44 / km'); await expect(page.getByRole('row')).toHaveCount(3); // Reload page await page.reload(); // Assert race predictions are correct (custom targets, default units, and model settings not reset) - await expect(page.getByRole('row').nth(1)).toHaveText('5 km' + '17:11.77' + '3:26 / km'); - await expect(page.getByRole('row').nth(2)).toHaveText('10 km' + '37:22.53' + '3:44 / km'); + await expect(page.getByRole('row').nth(1)).toHaveText('5 km' + '17:11.78' + '3:26 / km'); + await expect(page.getByRole('row').nth(2)).toHaveText('10 km' + '37:22.54' + '3:44 / km'); await expect(page.getByRole('row')).toHaveCount(3); // Switch target set @@ -137,7 +137,7 @@ test('Race Calculator', async ({ page }) => { // Assert paces are correct await expect(page.getByRole('row').nth(5)).toHaveText('1 mi' + '4:49.86' + '3:00 / km'); - await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '17:11.77' + '3:26 / km'); + await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '17:11.78' + '3:26 / km'); await expect(page.getByRole('row')).toHaveCount(17); // Assert title was reset diff --git a/tests/e2e/unit-calculator.spec.js b/tests/e2e/unit-calculator.spec.js @@ -34,7 +34,7 @@ test('Unit Calculator', async ({ page }) => { await page.getByLabel('Input units').selectOption('Kilometers per Hour'); await page.getByLabel('Input value').fill('10'); await page.getByLabel('Output units').selectOption('Time per Mile'); - await expect(page.getByLabel('Output value')).toHaveText('00:09:39.366'); + await expect(page.getByLabel('Output value')).toHaveText('00:09:39.364'); // Convert time units (83.76 min to hh:mm:ss) await page.getByLabel('Selected unit category').selectOption('Time'); @@ -64,5 +64,5 @@ test('Unit Calculator', async ({ page }) => { // Assert speed & pace result is correct (state not reset) await page.getByLabel('Selected unit category').selectOption('Speed & Pace'); - await expect(page.getByLabel('Output value')).toHaveText('00:09:39.366'); + await expect(page.getByLabel('Output value')).toHaveText('00:09:39.364'); }); diff --git a/tests/e2e/workout-calculator.spec.js b/tests/e2e/workout-calculator.spec.js @@ -24,7 +24,7 @@ test('Workout Calculator', async ({ page }) => { // Assert workout splits are correct await expect(page.getByRole('row').nth(1)).toHaveText('400 m @ 1 mi' + '1:13.45'); - await expect(page.getByRole('row').nth(3)).toHaveText('1600 m @ 1:00:00' + '5:45.43'); + await expect(page.getByRole('row').nth(3)).toHaveText('1600 m @ 1:00:00' + '5:45.44'); await expect(page.getByRole('row')).toHaveCount(5); // Change prediction model @@ -101,7 +101,7 @@ test('Workout Calculator', async ({ page }) => { // Assert workout splits are correct await expect(page.getByRole('row').nth(1)).toHaveText('800m Interval' + '2:45.08'); - await expect(page.getByRole('row').nth(2)).toHaveText('1600 m @ 10 km' + '5:58.80'); + await expect(page.getByRole('row').nth(2)).toHaveText('1600 m @ 10 km' + '5:58.81'); await expect(page.getByRole('row')).toHaveCount(3); // Reload page @@ -109,7 +109,7 @@ test('Workout Calculator', async ({ page }) => { // Assert workout splits are correct (custom targets and model settings not reset) await expect(page.getByRole('row').nth(1)).toHaveText('800m Interval' + '2:45.08'); - await expect(page.getByRole('row').nth(2)).toHaveText('1600 m @ 10 km' + '5:58.80'); + await expect(page.getByRole('row').nth(2)).toHaveText('1600 m @ 10 km' + '5:58.81'); await expect(page.getByRole('row')).toHaveCount(3); // Switch target set diff --git a/tests/unit/utils/calculators.spec.js b/tests/unit/utils/calculators.spec.js @@ -74,7 +74,7 @@ describe('calculateRaceResults method', () => { expect(result.key).to.equal('10 km'); expect(result.value).to.equal('41:34.80'); - expect(result.pace).to.equal('6:42 / mi'); + expect(result.pace).to.equal('6:41 / mi'); expect(result.result).to.equal('value'); expect(result.sort).to.be.closeTo(2494.80, 0.01); }); @@ -129,7 +129,7 @@ describe('calculateRaceResults method', () => { const result = calculatorUtils.calculateRaceResults(input, target, options, 'imperial'); expect(result.key).to.equal('5 km'); - expect(result.value).to.equal('17:11.77'); + expect(result.value).to.equal('17:11.78'); expect(result.pace).to.equal('5:32 / mi'); expect(result.result).to.equal('value'); expect(result.sort).to.be.closeTo(1031.77, 0.01); @@ -176,7 +176,7 @@ describe('calculateWorkoutResults method', () => { const result = calculatorUtils.calculateWorkoutResults(input, target, options); expect(result.key).to.equal('1000 m @ 5 km'); - expect(result.value).to.equal('3:26.35'); + expect(result.value).to.equal('3:26.36'); expect(result.pace).to.equal(''); expect(result.result).to.equal('value'); expect(result.sort).to.be.closeTo(206.35, 0.01); diff --git a/tests/unit/views/RaceCalculator.spec.js b/tests/unit/views/RaceCalculator.spec.js @@ -29,7 +29,7 @@ test('should correctly predict race times', async () => { // Assert result is correct expect(result.key).to.equal('10 km'); expect(result.value).to.equal('41:34.80'); - expect(result.pace).to.equal('6:42 / mi'); + expect(result.pace).to.equal('6:41 / mi'); expect(result.result).to.equal('value'); expect(result.sort).to.be.closeTo(2494.80, 0.01); });