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