little improvements and test for array of one element

This commit is contained in:
tina
2018-08-01 15:49:44 +02:00
parent 9664984e72
commit 00a7de0faf
2 changed files with 25 additions and 10 deletions
+12 -9
View File
@@ -9,25 +9,28 @@ export default function getPeriodLengthStats(cycleLengths) {
periodLengthStats.minimum = sortedCycleLengths[0] periodLengthStats.minimum = sortedCycleLengths[0]
periodLengthStats.maximum = sortedCycleLengths[cycleLengths.length - 1] periodLengthStats.maximum = sortedCycleLengths[cycleLengths.length - 1]
periodLengthStats.mean = Math.round( periodLengthStats.mean = Math.round(
cycleLengths.reduce(getSum) / cycleLengths.length * 100) / 100 cycleLengths.reduce(getSum) / cycleLengths.length * 100
) / 100
// median // median
if (cycleLengths.length % 2 == 1) { if (cycleLengths.length % 2 == 1) {
periodLengthStats.median = sortedCycleLengths[(cycleLengths.length + 1) / periodLengthStats.median = sortedCycleLengths[
2 - 1] (cycleLengths.length + 1) / 2 - 1
} ]
else { } else {
const middle = cycleLengths.length / 2 const middle = cycleLengths.length / 2
periodLengthStats.median = (sortedCycleLengths[middle - 1] + periodLengthStats.median = (sortedCycleLengths[middle - 1] +
sortedCycleLengths[middle]) / 2 sortedCycleLengths[middle]) / 2
} }
// corrected standard deviation (based on unbiased sample variance) // corrected standard deviation (based on unbiased sample variance)
periodLengthStats.stdDeviation = null // for case t
if (cycleLengths.length > 1) { if (cycleLengths.length > 1) {
const sumOfSquares = cycleLengths.map(cycleLength => { const sumOfSquares = cycleLengths.map(cycleLength => {
return Math.pow(cycleLength - periodLengthStats.mean, 2) return Math.pow(cycleLength - periodLengthStats.mean, 2)
}).reduce(getSum) }).reduce(getSum)
periodLengthStats.stdDeviation = Math.round( 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 return periodLengthStats
} }
@@ -37,10 +40,10 @@ function getSum(total, num) {
} }
function throwIfArgsAreNotInRequiredFormat(cycleLengths) { 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.') assert.ok(cycleLengths.length > 0, 'Input array should not be empty.')
cycleLengths.forEach(cycleLength => { cycleLengths.forEach(cycleLength => {
assert.equal(typeof cycleLength, 'number', 'Elements in the array should be of type number.') 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.')
}) })
} }
+13 -1
View File
@@ -5,7 +5,7 @@ import periodInfo from '../lib/period-length'
const expect = chai.expect const expect = chai.expect
describe('getPeriodLengthStats', () => { describe.only('getPeriodLengthStats', () => {
it('works for a simple odd-numbered array', () => { it('works for a simple odd-numbered array', () => {
const periodLengths = [99, 5, 1, 2, 100] const periodLengths = [99, 5, 1, 2, 100]
const result = periodInfo(periodLengths) const result = periodInfo(periodLengths)
@@ -31,6 +31,18 @@ describe('getPeriodLengthStats', () => {
} }
expect(result).to.eql(expectedResult) 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', () => { describe('when args are wrong', () => {
it('throws when arg object is an empty array', () => { it('throws when arg object is an empty array', () => {
const periodLengths = [] const periodLengths = []