signalk-barometer-trend
Version:
Get pressure trend and weather predictions from a barometer over time
443 lines (387 loc) • 14 kB
JavaScript
const assert = require('assert');
const barometer = require('../barometer');
const KELVIN = 273.15;
describe("Barometer Tests", function () {
describe("onDeltasUpdated", function () {
it("Subscription should equal", function () {
//arrange
barometer.clear();
let expected = 'environment.outside.pressure';
//act
let actual = barometer.SUBSCRIPTIONS;
//assert
assert.strictEqual(actual.find((f) => f.path === expected).path, expected);
});
it("Pressure should equal", function () {
//arrange
barometer.clear();
const expectedTendency = "RISING";
const expectedTrend = "STEADY";
barometer.onDeltasUpdate(createDeltaMockPressure(101500));
//act
let actual = barometer.onDeltasUpdate(createDeltaMockPressure(101500 + 3));
//assert
assert.strictEqual(actual.find((f) => f.path === getPath("trend.tendency")).value, expectedTendency);
assert.strictEqual(actual.find((f) => f.path === getPath("trend.trend")).value, expectedTrend);
assert.strictEqual(actual.find((f) => f.path === getPath("trend.severity")).value, 0);
});
it("it should throw an exception", function () {
//arrange
barometer.clear();
//act
//assert
assert.throws(() => { barometer.onDeltasUpdate(null) }, Error, "Deltas cannot be null");
});
it("it should be ok", function () {
//arrange
//act
barometer.clear();
let actual = barometer.onDeltasUpdate(createDeltaMockPressure(300));
//assert
assert.notStrictEqual(actual, null);
});
// describe("preLoad", function () {
// it("it should be waiting", function () {
// //arrange
// //act
// let actual = barometer.preLoad();
// //assert
// assert.strictEqual(actual.values.find((f) => f.path === getPath("trend.tendency")).value, "Waiting...");
// });
// });
it("Subscription should equal", function () {
//arrange
barometer.clear();
let expected = 'environment.outside.pressure';
//act
let actual = barometer.SUBSCRIPTIONS;
//assert
assert.strictEqual(actual.find((f) => f.path === expected).path, expected);
});
it("Has position within one minute", function () {
//arrange
barometer.clear();
barometer.onDeltasUpdate(createDeltaMockPosition(mockPositionNorthernHemisphere()));
barometer.onDeltasUpdate(createDeltaMockPressure(101500));
barometer.onDeltasUpdate(createDeltaMockPressure(101600));
barometer.onDeltasUpdate(createDeltaMockPressure(101700));
//act
let actual = barometer.hasPositionWithinOneMinute();
//assert
assert.strictEqual(actual, true);
});
it("Has no position defaults to northern hemisphere", function () {
//arrange
barometer.clear();
barometer.onDeltasUpdate(createDeltaMockPressure(101500));
barometer.onDeltasUpdate(createDeltaMockPressure(101600));
barometer.onDeltasUpdate(createDeltaMockPressure(101700));
//act
let actual = barometer.isNortherHemisphere();
//assert
assert.strictEqual(actual, true);
});
it("Is northern hemisphere", function () {
//arrange
barometer.clear();
barometer.onDeltasUpdate(createDeltaMockPosition(mockPositionNorthernHemisphere()));
barometer.onDeltasUpdate(createDeltaMockPressure(101500));
barometer.onDeltasUpdate(createDeltaMockPressure(101600));
barometer.onDeltasUpdate(createDeltaMockPressure(101700));
//act
let actual = barometer.isNortherHemisphere();
//assert
assert.strictEqual(actual, true);
});
it("Is southern hemisphere", function () {
//arrange
barometer.clear();
barometer.onDeltasUpdate(createDeltaMockPosition(mockPositionSouthernHemisphere()));
barometer.onDeltasUpdate(createDeltaMockPressure(101500));
barometer.onDeltasUpdate(createDeltaMockPressure(101600));
barometer.onDeltasUpdate(createDeltaMockPressure(101700));
//act
let actual = barometer.isNortherHemisphere();
//assert
assert.strictEqual(actual, false);
});
it("Has TWD within one minute", function () {
//arrange
barometer.clear();
barometer.onDeltasUpdate(createDeltaMockWindDirection(225));
barometer.onDeltasUpdate(createDeltaMockPressure(101500));
barometer.onDeltasUpdate(createDeltaMockPressure(101600));
barometer.onDeltasUpdate(createDeltaMockPressure(101700));
//act
let actual = barometer.hasTWDWithinOneMinute();
//assert
assert.strictEqual(actual, true);
});
it("Has not TWD within one minute", function () {
//arrange
barometer.clear();
barometer.onDeltasUpdate(createDeltaMockPressure(101500));
barometer.onDeltasUpdate(createDeltaMockPressure(101600));
barometer.onDeltasUpdate(createDeltaMockPressure(101700));
//act
let actual = barometer.hasTWDWithinOneMinute();
//assert
assert.strictEqual(actual, false);
});
it("Has temperature", function () {
//arrange
const expected = 30 + KELVIN;
barometer.clear();
//act
barometer.onDeltasUpdate(createDeltaMockTemperature(expected));
//assert
assert.strictEqual(barometer.getLatest().temperature.value, expected);
});
it("Has altitude", function () {
//arrange
const expected = 100;
barometer.clear();
//act
barometer.onDeltasUpdate(createDeltaMockAltitude(expected));
//assert
assert.strictEqual(barometer.getLatest().altitude.value, expected);
});
});
describe("System Tests", function () {
it("System is correct", function () {
//arrange
barometer.clear();
const expected = "Between Low and High";
barometer.onDeltasUpdate(createDeltaMockPressure(101549));
//act
let actual = barometer.onDeltasUpdate(createDeltaMockPressure(101500));
//assert
assert.strictEqual(actual.find((f) => f.path === getPath("system")).value, expected);
});
});
describe("Set Sample Rate", function () {
it("It should equal", function () {
//arrange
barometer.clear();
let expected = 80 * 1000;
//act
var actual = barometer.setSampleRate(80);
//assert
assert.strictEqual(actual, expected);
});
it("It should equal under threshold", function () {
//arrange
barometer.clear();
let expected = 1200 * 1000;
//act
var actual = barometer.setSampleRate(1201);
//assert
assert.strictEqual(actual, expected);
});
it("It should equal above threshold", function () {
//arrange
barometer.clear();
let expected = 60 * 1000;
//act
var actual = barometer.setSampleRate(59);
//assert
assert.strictEqual(actual, expected);
});
});
describe("Set Altitude Correction", function () {
it("It should equal positive", function () {
//arrange
barometer.clear();
let expected = 104;
//act
barometer.setAltitudeCorrection(4);
barometer.onDeltasUpdate(createDeltaMockAltitude(100));
let actual = barometer.getLatest().altitude.value;
//assert
assert.strictEqual(actual, expected);
});
it("It should equal negative", function () {
//arrange
barometer.clear();
let expected = 96;
//act
barometer.setAltitudeCorrection(-4);
barometer.onDeltasUpdate(createDeltaMockAltitude(100));
let actual = barometer.getLatest().altitude.value;
//assert
assert.strictEqual(actual, expected);
});
it("It should not equal", function () {
//arrange
barometer.clear();
let expected = 100;
//act
barometer.setAltitudeCorrection(null);
barometer.setAltitudeCorrection(undefined);
barometer.onDeltasUpdate(createDeltaMockAltitude(100));
let actual = barometer.getLatest().altitude.value;
//assert
assert.strictEqual(actual, expected);
});
});
describe("persist", function () {
it("Persist should persist", function () {
//arrange
barometer.clear();
barometer.onDeltasUpdate(createDeltaMockPressure(101500));
barometer.onDeltasUpdate(createDeltaMockPressure(101600));
barometer.onDeltasUpdate(createDeltaMockPressure(101700));
const all = barometer.getAll();
let actual = null;
const persistCallback = (json) => {
actual = json;
}
//act
barometer.persist(persistCallback);
//assert
assert.deepEqual(actual, all);
});
});
describe("populate", function () {
it("Populate should populate", function () {
//arrange
barometer.clear();
barometer.onDeltasUpdate(createDeltaMockPressure(101500));
barometer.onDeltasUpdate(createDeltaMockPressure(101600));
barometer.onDeltasUpdate(createDeltaMockPressure(101700));
const all = barometer.getAll();
const populateCallback = () => {
return all;
}
barometer.clear();
//act
barometer.populate(populateCallback)
const actual = barometer.getAll();
//assert
assert.deepEqual(actual, all);
});
it("Populate should not fail with empty array", function () {
//arrange
barometer.clear();
const populateCallback = () => {
return [];
}
//act
barometer.populate(populateCallback)
//assert
//assert.strictEqual(actual, all);
});
it("Populate should not fail with null", function () {
//arrange
barometer.clear();
const populateCallback = () => {
return null;
}
//act
barometer.populate(populateCallback)
//assert
assert.ok(true);
});
it("Parse date into date objecft", function () {
//arrange
barometer.clear();
barometer.onDeltasUpdate(createDeltaMockPressure(101500));
barometer.onDeltasUpdate(createDeltaMockPressure(101600));
barometer.onDeltasUpdate(createDeltaMockPressure(101700));
const content = JSON.stringify(barometer.getAll());
const populateCallback = () => {
barometer.JSONParser(content);
}
//act
barometer.populate(populateCallback)
//assert
assert.ok(true);
});
});
});
function getPath(path) {
return "environment.outside.pressure." + path;
}
function createDeltaMockPressure(value) {
return {
updates: [
{
values: [
{
path: 'environment.outside.pressure',
value: value
}
]
}
]
}
}
function createDeltaMockTemperature(temperature) {
return {
updates: [
{
values: [
{
path: 'environment.outside.temperature',
value: temperature
}
]
}
]
}
}
function createDeltaMockAltitude(altitude) {
return {
updates: [
{
values: [
{
path: 'navigation.gnss.antennaAltitude',
value: altitude
}
]
}
]
}
}
function createDeltaMockWindDirection(value) {
return {
updates: [
{
values: [
{
path: 'environment.wind.directionTrue',
value: value
}
]
}
]
}
}
function createDeltaMockPosition(position) {
return {
updates: [
{
values: [
{
path: 'navigation.position',
value: position
}
]
}
]
}
}
function mockPositionNorthernHemisphere() {
return {
"longitude": -61.59,
"latitude": 15.84
}
}
function mockPositionSouthernHemisphere() {
return {
"longitude": -61.59,
"latitude": -15.84
}
}