running-tools

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

commit 970377bad66713d8d3b70bc42622aa78393ecab9
parent a73aceb13035be2bf75322bc2663ad0dcfaf5692
Author: ashermorgan <59518073+ashermorgan@users.noreply.github.com>
Date:   Wed, 11 Aug 2021 13:12:47 -0700

Add units.formatDuration method and update units

Diffstat:
Msrc/utils/units.js | 49+++++++++++++++++++++++++++++++++++++++++++++----
Mtests/unit/units.spec.js | 65+++++++++++++++++++++++++++++++++++++++++++++++++++--------------
2 files changed, 96 insertions(+), 18 deletions(-)

diff --git a/src/utils/units.js b/src/utils/units.js @@ -73,8 +73,8 @@ const SPEED_UNIT_VALUES = { */ const PACE_UNITS = { seconds_per_meter: 'seconds_per_meter', - minutes_per_kilometer: 'minutes_per_kilometer', - minutes_per_mile: 'minutes_per_mile', + seconds_per_kilometer: 'seconds_per_kilometer', + seconds_per_mile: 'seconds_per_mile', }; @@ -84,8 +84,8 @@ const PACE_UNITS = { */ const PACE_UNIT_VALUES = { seconds_per_meter: 1, - minutes_per_kilometer: TIME_UNIT_VALUES.minute / DISTANCE_UNIT_VALUES.kilometer, - minutes_per_mile: TIME_UNIT_VALUES.minute / DISTANCE_UNIT_VALUES.mile, + seconds_per_kilometer: TIME_UNIT_VALUES.second / DISTANCE_UNIT_VALUES.kilometer, + seconds_per_mile: TIME_UNIT_VALUES.second / DISTANCE_UNIT_VALUES.mile, }; @@ -170,6 +170,45 @@ function convertSpeedPace(inputValue, inputUnits, outputUnits) { +/** + * Format a duration as a string + * @param {Number} value The duration (in seconds) + * @param {Number} padding The number of digits to show before the decimal point + * @param {Number} digits The number of digits to show after the decimal point + * @returns {String} The formatted value + */ +function formatDuration(value, padding=6, digits=2) { + // Validate padding + padding = Math.min(padding, 6); + + // Calculate parts + let hours = Math.floor(value / 3600); + let minutes = Math.floor((value % 3600) / 60); + let seconds = value % 60; + + // Format parts + let result = ''; + if (hours !== 0 || padding >= 5) { + result += hours.toString().padStart(padding - 4, '0'); + result += ':'; + padding = 4; + } + if (minutes !== 0 || padding >= 3) { + result += minutes.toString().padStart(padding - 2, '0'); + result += ':'; + padding = 2; + } + if (digits === 0) { + result += seconds.toFixed(digits).padStart(padding, '0'); + } + else { + result += seconds.toFixed(digits).padStart(padding + digits + 1, '0'); + } + return result; +} + + + export default { TIME_UNITS, DISTANCE_UNITS, @@ -181,4 +220,6 @@ export default { convertSpeed, convertPace, convertSpeedPace, + + formatDuration, } diff --git a/tests/unit/units.spec.js b/tests/unit/units.spec.js @@ -1,5 +1,4 @@ import { expect } from 'chai'; -import { shallowMount } from '@vue/test-utils'; import units from '@/utils/units.js'; @@ -69,43 +68,81 @@ describe('utils/units.js', () => { describe('convertPace method', () => { - it('60 seconds per meter should equal 1000 minutes per kilometer', () => { + it('1 second per meter should equal 1000 seconds per kilometer', () => { let result = units.convertPace( - 60, + 1, units.PACE_UNITS.seconds_per_meter, - units.PACE_UNITS.minutes_per_kilometer + units.PACE_UNITS.seconds_per_kilometer ); expect(result).to.equal(1000); }); - it('1000 minutes per kilometer should equal 60 seconds per meter', () => { + it('1000 seconds per kilometer should equal 1 second per meter', () => { let result = units.convertPace( 1000, - units.PACE_UNITS.minutes_per_kilometer, + units.PACE_UNITS.seconds_per_kilometer, units.PACE_UNITS.seconds_per_meter ); - expect(result).to.equal(60); + expect(result).to.equal(1); }); }); describe('convertSpeedPace method', () => { - it('60 kilometers per hour should equal 1 minute per kilometer', () => { + it('3600 kilometers per hour should equal 1 second per kilometer', () => { let result = units.convertSpeedPace( - 60, + 3600, units.SPEED_UNITS.kilometers_per_hour, - units.PACE_UNITS.minutes_per_kilometer + units.PACE_UNITS.seconds_per_kilometer ); expect(result).to.equal(1); }); - it('1 minute per kilometer should equal 60 kilometers per hour', () => { + it('1 second per kilometer should equal 3600 kilometers per hour', () => { let result = units.convertSpeedPace( - 1, - units.PACE_UNITS.minutes_per_kilometer, + 3600, + units.PACE_UNITS.seconds_per_kilometer, units.SPEED_UNITS.kilometers_per_hour ); - expect(result).to.equal(60); + expect(result).to.equal(1); + }); + }); + + describe('formatDuration method', () => { + it('should correctly divide durations into parts', () => { + let result = units.formatDuration(3600 + 120 + 3 + 0.4); + expect(result).to.equal('01:02:03.40'); + }); + + it('should correctly format duration when padding is 7', () => { + let result = units.formatDuration(3600 + 120 + 3 + 0.4, 7); + expect(result).to.equal('01:02:03.40'); + }); + + it('should correctly format duration when padding is 3', () => { + let result = units.formatDuration(3600 + 120 + 3 + 0.4, 3); + expect(result).to.equal('1:02:03.40'); + + result = units.formatDuration(120 + 3 + 0.4, 3); + expect(result).to.equal('2:03.40'); + + result = units.formatDuration(3 + 0.4, 3); + expect(result).to.equal('0:03.40'); + }); + + it('should correctly format duration when padding is 0', () => { + let result = units.formatDuration(0.4, 0); + expect(result).to.equal('0.40'); + }); + + it('should correctly format duration when digits is 3', () => { + let result = units.formatDuration(3600 + 120 + 3 + 0.4567, 0, 3); + expect(result).to.equal('1:02:03.457'); + }); + + it('should correctly format duration when digits is 0', () => { + let result = units.formatDuration(3600 + 120 + 3 + 0.456, 0, 0); + expect(result).to.equal('1:02:03'); }); }); });