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