UNPKG

solar-scores

Version:

Compute scores for solar decathlon competition - Cali 2015

245 lines (208 loc) 10.1 kB
'use strict'; var utils = require('../src/utils'); var should = require('should'); describe('utils', function () { it('Should filter out invalid values', function () { var values = [ {epoch: 12, A: 0}, {epoch: 13, A: null}, {epoch: 14, A: 3}, {epoch: 15} ]; values = utils.filterValues(values, 'A'); values.should.deepEqual([ {epoch: 12, A: 0}, {epoch: 14, A: 3} ]); }); describe('getSingleScoringFunction', function () { it('full points if under threshold', function () { var getScore = utils.getSingleScoringFunction(60, 70); getScore(0).should.equal(1); getScore(10).should.equal(1); getScore(55.3).should.equal(1); getScore(60).should.equal(1); getScore(70).should.equal(0); getScore(72.36).should.equal(0); getScore(95).should.equal(0); getScore(100).should.equal(0); getScore(67.5).should.equal(0.25); getScore(65).should.equal(0.5); getScore(62.5).should.equal(0.75); }); it('full points if over threshold', function () { var getScore = utils.getSingleScoringFunction(4, 2.5); getScore(0).should.equal(0); getScore(1).should.equal(0); getScore(1.25).should.equal(0); getScore(2.5).should.equal(0); getScore(4).should.equal(1); getScore(5).should.equal(1); getScore(6.3).should.equal(1); getScore(4.36).should.equal(1); getScore(3.25).should.equal(0.5); getScore(2.875).should.equal(0.25); getScore(3.625).should.equal(0.75); }); }); it('getDoubleScoringFunction', function () { var getScore = utils.getDoubleScoringFunction(4, 6, 10, 18); getScore(2).should.equal(0); getScore(4).should.equal(0); getScore(6).should.equal(1); getScore(7.5).should.equal(1); getScore(10).should.equal(1); getScore(18).should.equal(0); getScore(21).should.equal(0); getScore(5).should.equal(0.5); getScore(14).should.equal(0.5); getScore(16).should.equal(0.25); getScore(12).should.equal(0.75); getScore(5.5).should.equal(0.75); getScore(4.5).should.equal(0.25); }); it('Should filter by epoch', function () { var values; values = [ {epoch: new Date('2015-12-06 01:00:00 GMT-0500').getTime()}, {epoch: new Date('2015-12-06 12:00:00 GMT-0500').getTime()}, {epoch: new Date('2015-12-06 06:00:00 GMT-0500').getTime()}, {epoch: new Date('2015-12-06 18:00:00 GMT-0500').getTime()}, {epoch: new Date('2015-12-04 00:00:00 GMT-0500').getTime()}, {epoch: new Date('2015-12-15 00:00:00 GMT-0500').getTime()} ]; values = utils.filterByEpoch(values, 'Luminosity'); values.should.deepEqual([ {epoch: new Date('2015-12-06 12:00:00 GMT-0500').getTime()}, {epoch: new Date('2015-12-06 06:00:00 GMT-0500').getTime()}, {epoch: new Date('2015-12-06 18:00:00 GMT-0500').getTime()} ]); values = [ {epoch: new Date('2015-12-10 10:00:00 GMT-0500').getTime()}, {epoch: new Date('2015-12-09 12:00:00 GMT-0500').getTime()}, {epoch: new Date('2015-12-11 12:00:00 GMT-0500').getTime()} ]; values = utils.filterByEpoch(values, [ {begin: new Date('2015-12-10 00:00:00 GMT-0500'), end: new Date('2015-12-11 00:00:00 GMT-0500')} ]); values.should.deepEqual([{epoch: new Date('2015-12-10 10:00:00 GMT-0500').getTime()}]); }); it('Should filter data by day', function () { var values = [ {epoch: new Date('2015-12-05 01:00:00 GMT-0500').getTime()}, {epoch: new Date('2015-12-05 12:00:00 GMT-0500').getTime()}, {epoch: new Date('2015-12-05 05:00:00 GMT-0500').getTime()}, {epoch: new Date('2015-12-05 18:30:00 GMT-0500').getTime()}, {epoch: new Date('2015-12-04 00:00:00 GMT-0500').getTime()}, {epoch: new Date('2015-12-15 00:00:00 GMT-0500').getTime()} ]; values = utils.filterByEpochPerDay(values, 'Temperature'); }); it('Should resample', function () { var values = [[ {epoch: new Date('2015-12-05 00:00:00 GMT-0500').getTime(), A: 1}, // Larger than other serie {epoch: new Date('2015-12-05 00:05:00 GMT-0500').getTime(), A: 2}, // Smaller than other serie {epoch: new Date('2015-12-05 00:10:00 GMT-0500').getTime(), A: 3}, // Smaller than other serie {epoch: new Date('2015-12-05 00:12:31 GMT-0500').getTime(), A: 4}, // Border line not largest of bin {epoch: new Date('2015-12-05 00:15:00 GMT-0500').getTime(), A: 3}, // Not largest of bin {epoch: new Date('2015-12-05 00:17:29 GMT-0500').getTime(), A: 5}, // Border line largest of bin {epoch: new Date('2015-12-05 00:29:31 GMT-0500').getTime(), A: 6}, // Not inside range, should not be taken into account {epoch: new Date('2015-12-06 00:00:00 GMT-0500').getTime(), A: 10} // Between 2 periods, should not be taken into account ], [ {epoch: new Date('2015-12-05 00:01:00 GMT-0500').getTime(), B: 0}, // Smaller than other serie {epoch: new Date('2015-12-05 00:04:00 GMT-0500').getTime(), B: 4}, // Larger than other serie {epoch: new Date('2015-12-05 00:10:00 GMT-0500').getTime(), B: 5}, // Larger than other serie {epoch: new Date('2015-12-05 00:11:00 GMT-0500').getTime(), B: 6}, // Larger than same serie {epoch: new Date('2015-12-05 00:10:00 GMT-0500').getTime(), B: 2}, // Smaller than same serie, {epoch: new Date('2015-12-05 00:20:00 GMT-0500').getTime(), B: 2}, // No equivalent in other serie {epoch: new Date('2015-12-08 00:05:00 GMT-0500').getTime(), B: 2} // No equivalent in other serie ] ]; var period = [{ begin: new Date('2015-12-05 00:00:00 GMT-0500'), end: new Date('2015-12-05 00:26:00 GMT-0500'), duration: 1560 }, { begin: new Date('2015-12-08 00:00:00 GMT-0500'), end: new Date('2015-12-08 00:10:00 GMT-0500'), duration: 600 }]; var result = utils.resampleWithMax(values, ['A', 'B'], period); var expected = [{value: 1, epoch: 1449291600000}, {value: 4, epoch: 1449291900000}, {value: 6, epoch: 1449292200000}, {value: 5, epoch: 1449292500000}, {value: 2, epoch: 1449292800000}, {value: null, epoch: 1449293100000}, {value: null, epoch: 1449550800000}, {value: 2, epoch: 1449551100000}, {value: null, epoch: 1449551400000} ]; result.should.deepEqual(expected); result = utils.resampleWithMax(values, ['A', 'B'], period, 60 * 10 * 1000); result.should.deepEqual([{value: 4, epoch: 1449291600000}, {value: 6, epoch: 1449292200000}, {value: 5, epoch: 1449292800000}, {value: 2, epoch: 1449550800000}, {value: null, epoch: 1449551400000}]); }); it('resample special case', function () { // The first epoch is in between 2 ranges var data = [ { epoch: 1449378257000, B: 795.8110940088501 }, { epoch: 1449930170000, B: 795.8110940088501 }, { epoch: 1449930516000, B: 882.2014617980318 }]; var result = utils.resampleWithMax([data], ['B'], 'Luminosity'); result = result.filter(function(val) { return val.value !== null; }); result.should.not.be.empty(); }); it('should get elapsed fraction', function () { var fraction = utils.getElapsedFraction('EnergyBalance', new Date('2015-12-06 12:00:00 GMT-0500')); fraction.should.equal(1/9); fraction = utils.getElapsedFraction('EnergyBalance', new Date('2015-12-03 12:00:00 GMT-0500')); fraction.should.equal(0); fraction = utils.getElapsedFraction('EnergyBalance', new Date('2015-12-16 12:00:00 GMT-0500')); fraction.should.equal(1); }); it('Should interpolate', function () { var data = [null, null, 1, 2, null, 4, null]; utils.interpolate(data); data.should.deepEqual([1, 1, 1, 2, 3, 4, 4]); utils.interpolate([null]).should.deepEqual([null]); utils.interpolate([null, null, null]).should.deepEqual([null, null, null]); utils.interpolate([null, 1]).should.deepEqual([1, 1]); utils.interpolate([1, null, null]).should.deepEqual([1, 1, 1]); utils.interpolate([null, null, 1]).should.deepEqual([1, 1, 1]); utils.interpolate([1, null, null, 4]).should.deepEqual([1, 2, 3, 4]); utils.interpolate([null, 2, null]).should.deepEqual([2, 2, 2]); }); it('Should average', function () { utils.average([null, 4, 5]).should.equal(4.5); should(null).be.equal(utils.average([null, null])); }); it('Should diff', function () { utils.diff([]).should.deepEqual([]); utils.diff([1]).should.deepEqual([]); utils.diff([1, 2, 7, 2, -2]).should.deepEqual([1, 5, -5, -4]); }); it('Should calculate ref temperature', function() { var data = [ {epoch: new Date('2015-12-05 05:59:00 GMT-0500'), A: 26}, {epoch: new Date('2015-12-05 12:00:00 GMT-0500'), A: 25}, {epoch: new Date('2015-12-05 18:01:00 GMT-0500'), A: 27}, {epoch: new Date('2015-12-06 12:00:00 GMT-0500'), A: 28} ]; var ref = utils.getRefTemperature(data, 'A', new Date('2015-12-06 18:00:00 GMT-0500')); ref.should.equal(19.9 + 25 * 0.255); }); });