diff --git a/lib/sensiplan.js b/lib/sensiplan.js index 8a1e7cd..ed36953 100644 --- a/lib/sensiplan.js +++ b/lib/sensiplan.js @@ -42,6 +42,7 @@ function detectTemperatureShift(temperaturesOfCycle) { } function rounded(val, step) { + // we round the difference because of JS decimal weirdness const inverted = 1 / step return Math.round(val * inverted) / inverted } @@ -73,6 +74,16 @@ function checkIfFirstHighMeasurement(temp, i, temps, ltl) { } } + if (secondExceptionRuleApplies(temp, nextTemps, ltl)) { + return { + isFirstHighMeasurement: true, + rules: { + secondException: true, + }, + ltl + } + } + return { isFirstHighMeasurement: false } @@ -81,18 +92,37 @@ function checkIfFirstHighMeasurement(temp, i, temps, ltl) { function regularRuleApplies(temp, nextTemps, ltl) { if (!nextTemps.every(temp => temp > ltl)) return false const thirdTemp = nextTemps[1] - // we round the difference because of JS decimal weirdness if (rounded(thirdTemp - ltl, 0.1) < 0.2) return false return true } function firstExceptionRuleApplies(temp, nextTemps, ltl) { + if (nextTemps.length < 3) return false if (!nextTemps.every(temp => temp > ltl)) return false const fourthTemp = nextTemps[2] if (fourthTemp > ltl) return true return false } +function secondExceptionRuleApplies(temp, nextTemps, ltl) { + if (nextTemps.length < 3) return false + if (secondOrThirdTempIsAtOrBelowLtl(nextTemps, ltl)) { + const fourthTemp = nextTemps[2] + if (rounded(fourthTemp - ltl, 0.1) >= 0.2) return true + } + return false +} + +function secondOrThirdTempIsAtOrBelowLtl(nextTemps, ltl) { + const secondIsLow = nextTemps[0] <= ltl + const thirdIsLow = nextTemps[1] <= ltl + if ((secondIsLow || thirdIsLow) && !(secondIsLow && thirdIsLow)) { + return true + } else { + return false + } +} + export { detectTemperatureShift } \ No newline at end of file diff --git a/test/sensiplan.spec.js b/test/sensiplan.spec.js index bb3719c..f490a86 100644 --- a/test/sensiplan.spec.js +++ b/test/sensiplan.spec.js @@ -82,6 +82,12 @@ describe.only('sensiplan', () => { expect(status).to.eql({ detected: false }) }) + it('detects missing temperature shift with not enough high temps', function () { + const temps = [36.7, 36.57, 36.47, 36.49, 36.57, 36.62, 36.55, 36.8, 36.86, 36.77] + const status = detectTemperatureShift(temps) + expect(status).to.eql({ detected: false }) + }) + it('detects shift after an earlier one was invalid', function () { const temps = [36.4, 36.4, 36.4, 36.4, 36.4, 36.4, 36.6, 36.6, 36.4, 36.4, 36.7, 36.7, 36.7, 36.7] @@ -95,5 +101,55 @@ describe.only('sensiplan', () => { }) }) }) + + describe('2nd exception rule', () => { + it('detects temperature shift with exception temp eql ltl', function () { + const secondException = [36.7, 36.57, 36.47, 36.49, 36.57, 36.62, 36.55, 36.8, 36.86, 36.6, 36.8] + const status = detectTemperatureShift(secondException) + expect(status).to.eql({ + low: [36.55, 36.45, 36.5, 36.55, 36.6, 36.55], + ltl: 36.6, + high: [36.8, 36.85, 36.6, 36.8], + detected: true, + rules: { secondException: true } + }) + }) + + it('detects temperature shift with exception temp lower than ltl', function () { + const secondException = [36.7, 36.57, 36.47, 36.49, 36.57, 36.62, 36.55, 36.8, 36.86, 36.4, 36.8] + const status = detectTemperatureShift(secondException) + expect(status).to.eql({ + low: [36.55, 36.45, 36.5, 36.55, 36.6, 36.55], + ltl: 36.6, + high: [36.8, 36.85, 36.4, 36.8], + detected: true, + rules: { secondException: true } + }) + }) + + it('detects missing temperature shift correctly', function () { + const temps = [36.7, 36.57, 36.47, 36.49, 36.57, 36.62, 36.55, 36.8, 36.86, 36.4, 36.77, 36.77] + const status = detectTemperatureShift(temps) + expect(status).to.eql({ detected: false }) + }) + + it('detects missing temperature shift when not enough high temps', function () { + const temps = [36.7, 36.57, 36.47, 36.49, 36.57, 36.62, 36.55, 36.8, 36.86, 36.4] + const status = detectTemperatureShift(temps) + expect(status).to.eql({ detected: false }) + }) + + it('detects shift after an earlier one was invalid', function () { + const temps = [36.7, 36.57, 36.47, 36.49, 36.57, 36.62, 36.55, 36.8, 36.86, 36.4, 36.77, 36.9, 36.9, 36.86, 37.04] + const status = detectTemperatureShift(temps) + expect(status).to.eql({ + low: [36.6, 36.55, 36.8, 36.85, 36.4, 36.75], + ltl: 36.85, + high: [36.9, 36.9, 36.85, 37.05], + detected: true, + rules: { secondException: true } + }) + }) + }) }) }) \ No newline at end of file