Skip to content
Snippets Groups Projects
Commit 00a7de0f authored by tina's avatar tina
Browse files

little improvements and test for array of one element

parent 9664984e
No related branches found
No related tags found
No related merge requests found
......@@ -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
......@@ -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 = []
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment