From 00a7de0faf02c3794d325ffc4ee8c1a1808e2e69 Mon Sep 17 00:00:00 2001 From: tina Date: Wed, 1 Aug 2018 15:49:44 +0200 Subject: [PATCH] little improvements and test for array of one element --- lib/period-length.js | 21 ++++++++++++--------- test/periode-length.spec.js | 14 +++++++++++++- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/lib/period-length.js b/lib/period-length.js index f369571..e62f076 100644 --- a/lib/period-length.js +++ b/lib/period-length.js @@ -9,25 +9,28 @@ export default function getPeriodLengthStats(cycleLengths) { periodLengthStats.minimum = sortedCycleLengths[0] periodLengthStats.maximum = sortedCycleLengths[cycleLengths.length - 1] periodLengthStats.mean = Math.round( - cycleLengths.reduce(getSum) / cycleLengths.length * 100) / 100 + cycleLengths.reduce(getSum) / cycleLengths.length * 100 + ) / 100 // median if (cycleLengths.length % 2 == 1) { - periodLengthStats.median = sortedCycleLengths[(cycleLengths.length + 1) / - 2 - 1] - } - else { + periodLengthStats.median = sortedCycleLengths[ + (cycleLengths.length + 1) / 2 - 1 + ] + } else { const middle = cycleLengths.length / 2 periodLengthStats.median = (sortedCycleLengths[middle - 1] + sortedCycleLengths[middle]) / 2 } // corrected standard deviation (based on unbiased sample variance) - periodLengthStats.stdDeviation = null // for case t if (cycleLengths.length > 1) { const sumOfSquares = cycleLengths.map(cycleLength => { return Math.pow(cycleLength - periodLengthStats.mean, 2) }).reduce(getSum) periodLengthStats.stdDeviation = Math.round( - Math.sqrt(sumOfSquares / (cycleLengths.length - 1 )) * 100) / 100 + Math.sqrt(sumOfSquares / (cycleLengths.length - 1 )) * 100 + ) / 100 + } else { + periodLengthStats.stdDeviation = null } return periodLengthStats } @@ -37,10 +40,10 @@ function getSum(total, num) { } function throwIfArgsAreNotInRequiredFormat(cycleLengths) { - assert.ok(Array.isArray(cycleLengths), 'Function requires input to be an array.') + assert.ok(Array.isArray(cycleLengths), 'Input should be an array.') assert.ok(cycleLengths.length > 0, 'Input array should not be empty.') cycleLengths.forEach(cycleLength => { assert.equal(typeof cycleLength, 'number', 'Elements in the array should be of type number.') - assert.ok(!isNaN(cycleLength), 'Elements of Array should not be NaN.') + assert.ok(!isNaN(cycleLength), 'Elements of array should not be NaN.') }) } \ No newline at end of file diff --git a/test/periode-length.spec.js b/test/periode-length.spec.js index ad10bd6..0b9b200 100644 --- a/test/periode-length.spec.js +++ b/test/periode-length.spec.js @@ -5,7 +5,7 @@ import periodInfo from '../lib/period-length' const expect = chai.expect -describe('getPeriodLengthStats', () => { +describe.only('getPeriodLengthStats', () => { it('works for a simple odd-numbered array', () => { const periodLengths = [99, 5, 1, 2, 100] const result = periodInfo(periodLengths) @@ -31,6 +31,18 @@ describe('getPeriodLengthStats', () => { } expect(result).to.eql(expectedResult) }) + it('works for an one-element array', () => { + const periodLengths = [42] + const result = periodInfo(periodLengths) + const expectedResult = { + minimum: 42, + maximum: 42, + mean: 42, + median: 42, + stdDeviation: null + } + expect(result).to.eql(expectedResult) + }) describe('when args are wrong', () => { it('throws when arg object is an empty array', () => { const periodLengths = []