solar-scores
Version:
Compute scores for solar decathlon competition - Cali 2015
245 lines (208 loc) • 10.1 kB
JavaScript
'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);
});
});