Make getMensesDaysAfter work for non-bleeding day too

This commit is contained in:
Julia Friesel
2018-10-25 15:06:22 +02:00
parent e2b426727b
commit de674590e2
2 changed files with 108 additions and 29 deletions
+45 -10
View File
@@ -101,21 +101,23 @@ export default function config(opts) {
} }
} }
function getMensesDaysAfter(cycleDay) { function getMensesDaysRightAfter(cycleDay) {
const bleedingDays = bleedingDaysSortedByDate.filter(d => { const bleedingDays = bleedingDaysSortedByDate
.filter(d => {
return !d.bleeding.exclude return !d.bleeding.exclude
}) })
const startIndex = bleedingDays.findIndex(day => { .reverse()
return day.date === cycleDay.date const firstFollowingBleedingDayIndex = bleedingDays.findIndex(day => {
return day.date > cycleDay.date
}) })
return recurse(cycleDay, startIndex, []) return recurse(cycleDay, firstFollowingBleedingDayIndex, [])
function recurse(day, i, mensesDays) { function recurse(day, nextIndex, mensesDays) {
if (i === 0) return mensesDays const next = bleedingDays[nextIndex]
const next = bleedingDays[i - 1] if (!next) return mensesDays
if (!isWithinThreshold(day, next)) return mensesDays if (!isWithinThreshold(day, next)) return mensesDays
mensesDays.unshift(next) mensesDays.unshift(next)
return recurse(next, i - 1, mensesDays) return recurse(next, nextIndex + 1, mensesDays)
} }
function isWithinThreshold(cycleDay, nextCycleDay) { function isWithinThreshold(cycleDay, nextCycleDay) {
@@ -174,6 +176,37 @@ export default function config(opts) {
return predictedMenses return predictedMenses
} }
// TODO this also needs a test
function maybeSetNewCycleStart(oldCycleDay, newValue) {
// if a bleeding value is deleted, we need to check if
// there are any following bleeding days and if the
// next one of them is now a cycle start
// in order to get the menses days, the cycle day in question still
// has to have a bleeding value, so we get those days first and only
// then update the cycle day
const mensesDaysAfter = getMensesDaysRightAfter(oldCycleDay)
oldCycleDay.bleeding = newValue
oldCycleDay.isCycleStart = false
if (!mensesDaysAfter.length) return
const nextOne = mensesDaysAfter[mensesDaysAfter.length - 1]
if (isMensesStart(nextOne)) {
nextOne.isCycleStart = true
}
}
function maybeClearOldCycleStartsInThisMenses(cycleDay) {
// if we have a new bleeding day, we need to clear the
// menses start marker from all following days of this
// menses that may have been marked as start before
const mensesDaysAfter = getMensesDaysRightAfter(cycleDay)
mensesDaysAfter.forEach(day => day.isCycleStart = false)
}
return { return {
getCycleDayNumber, getCycleDayNumber,
getCycleForDay, getCycleForDay,
@@ -182,6 +215,8 @@ export default function config(opts) {
getAllCycleLengths, getAllCycleLengths,
getPredictedMenses, getPredictedMenses,
isMensesStart, isMensesStart,
getMensesDaysAfter getMensesDaysRightAfter,
maybeSetNewCycleStart,
maybeClearOldCycleStartsInThisMenses
} }
} }
+61 -17
View File
@@ -904,7 +904,7 @@ describe('isMensesStart', () => {
}) })
}) })
describe('getMensesDaysAfter', () => { describe('getMensesDaysRightAfter', () => {
it('works for simple menses start', () => { it('works for simple menses start', () => {
const cycleDaysSortedByDate = [ const cycleDaysSortedByDate = [
{ {
@@ -927,11 +927,11 @@ describe('getMensesDaysAfter', () => {
} }
] ]
const { getMensesDaysAfter } = cycleModule({ const { getMensesDaysRightAfter } = cycleModule({
cycleDaysSortedByDate, cycleDaysSortedByDate,
bleedingDaysSortedByDate: cycleDaysSortedByDate.filter(d => d.bleeding) bleedingDaysSortedByDate: cycleDaysSortedByDate.filter(d => d.bleeding)
}) })
const days = getMensesDaysAfter(cycleDaysSortedByDate[3]) const days = getMensesDaysRightAfter(cycleDaysSortedByDate[3])
expect(days).to.eql([ expect(days).to.eql([
{ {
date: '2018-05-03', date: '2018-05-03',
@@ -944,6 +944,50 @@ describe('getMensesDaysAfter', () => {
]) ])
}) })
it('works when the day is not a bleeding day', () => {
const cycleDaysSortedByDate = [
{
date: '2018-05-04',
},
{
date: '2018-05-03',
bleeding: { value: 1 }
},
{
date: '2018-05-02',
bleeding: { value: 1 }
},
{
date: '2018-05-01',
bleeding: { value: 1 }
},
{
date: '2018-04-30',
bleeding: null
}
]
const { getMensesDaysRightAfter } = cycleModule({
cycleDaysSortedByDate,
bleedingDaysSortedByDate: cycleDaysSortedByDate.filter(d => d.bleeding)
})
const days = getMensesDaysRightAfter(cycleDaysSortedByDate[4])
expect(days).to.eql([
{
date: '2018-05-03',
bleeding: { value: 1 }
},
{
date: '2018-05-02',
bleeding: { value: 1 }
},
{
date: '2018-05-01',
bleeding: { value: 1 }
}
])
})
it('ignores excluded values', () => { it('ignores excluded values', () => {
const cycleDaysSortedByDate = [ const cycleDaysSortedByDate = [
{ {
@@ -966,11 +1010,11 @@ describe('getMensesDaysAfter', () => {
} }
] ]
const { getMensesDaysAfter } = cycleModule({ const { getMensesDaysRightAfter } = cycleModule({
cycleDaysSortedByDate, cycleDaysSortedByDate,
bleedingDaysSortedByDate: cycleDaysSortedByDate.filter(d => d.bleeding) bleedingDaysSortedByDate: cycleDaysSortedByDate.filter(d => d.bleeding)
}) })
const days = getMensesDaysAfter(cycleDaysSortedByDate[3]) const days = getMensesDaysRightAfter(cycleDaysSortedByDate[3])
expect(days).to.eql([ expect(days).to.eql([
{ {
date: '2018-05-03', date: '2018-05-03',
@@ -999,11 +1043,11 @@ describe('getMensesDaysAfter', () => {
} }
] ]
const { getMensesDaysAfter } = cycleModule({ const { getMensesDaysRightAfter } = cycleModule({
cycleDaysSortedByDate, cycleDaysSortedByDate,
bleedingDaysSortedByDate: cycleDaysSortedByDate.filter(d => d.bleeding) bleedingDaysSortedByDate: cycleDaysSortedByDate.filter(d => d.bleeding)
}) })
const days = getMensesDaysAfter(cycleDaysSortedByDate[3]) const days = getMensesDaysRightAfter(cycleDaysSortedByDate[3])
expect(days).to.eql([]) expect(days).to.eql([])
}) })
@@ -1028,11 +1072,11 @@ describe('getMensesDaysAfter', () => {
} }
] ]
const { getMensesDaysAfter } = cycleModule({ const { getMensesDaysRightAfter } = cycleModule({
cycleDaysSortedByDate, cycleDaysSortedByDate,
bleedingDaysSortedByDate: cycleDaysSortedByDate.filter(d => d.bleeding) bleedingDaysSortedByDate: cycleDaysSortedByDate.filter(d => d.bleeding)
}) })
const days = getMensesDaysAfter(cycleDaysSortedByDate[3]) const days = getMensesDaysRightAfter(cycleDaysSortedByDate[3])
expect(days).to.eql([]) expect(days).to.eql([])
}) })
@@ -1058,11 +1102,11 @@ describe('getMensesDaysAfter', () => {
} }
] ]
const { getMensesDaysAfter } = cycleModule({ const { getMensesDaysRightAfter } = cycleModule({
cycleDaysSortedByDate, cycleDaysSortedByDate,
bleedingDaysSortedByDate: cycleDaysSortedByDate.filter(d => d.bleeding) bleedingDaysSortedByDate: cycleDaysSortedByDate.filter(d => d.bleeding)
}) })
const days = getMensesDaysAfter(cycleDaysSortedByDate[3]) const days = getMensesDaysRightAfter(cycleDaysSortedByDate[3])
expect(days).to.eql([ expect(days).to.eql([
{ {
date: '2018-05-05', date: '2018-05-05',
@@ -1090,11 +1134,11 @@ describe('getMensesDaysAfter', () => {
} }
}] }]
const getMensesDaysAfter = cycleModule({ const getMensesDaysRightAfter = cycleModule({
bleedingDaysSortedByDate: bleedingDays, bleedingDaysSortedByDate: bleedingDays,
maxBreakInBleeding maxBreakInBleeding
}).getMensesDaysAfter }).getMensesDaysRightAfter
const result = getMensesDaysAfter(bleedingDays[1]) const result = getMensesDaysRightAfter(bleedingDays[1])
expect(result).to.eql([bleedingDays[0]]) expect(result).to.eql([bleedingDays[0]])
}) })
@@ -1111,11 +1155,11 @@ describe('getMensesDaysAfter', () => {
} }
}] }]
const getMensesDaysAfter = cycleModule({ const getMensesDaysRightAfter = cycleModule({
bleedingDaysSortedByDate: bleedingDays, bleedingDaysSortedByDate: bleedingDays,
maxBreakInBleeding maxBreakInBleeding
}).getMensesDaysAfter }).getMensesDaysRightAfter
const result = getMensesDaysAfter(bleedingDays[1]) const result = getMensesDaysRightAfter(bleedingDays[1])
expect(result).to.eql([]) expect(result).to.eql([])
}) })
}) })