UNPKG

signalk-racer

Version:

Signalk plugin to calculate values of interest to sail racers, such as: Time to Start; Time of Start, Time to Burn; Distance to Line; Next leg TWA.

169 lines (152 loc) 8.81 kB
// tests/racerMath.test.js /* global describe, test, expect */ 'use strict'; const { toRadians, collectVmgSamples, resetVmgSamples, _vmgState } = require('../racer'); describe('racer vmg', () => { test('resetVmgSamples: test arrays are cleared', () => { _vmgState.vmgToLinePos.sorted.push(1, 2, 3); _vmgState.vmgToLinePos.queue.push(1, 2, 3); _vmgState.vmgToLineNeg.sorted.push(4, 5, 6); _vmgState.vmgToLineNeg.queue.push(4, 5, 6); _vmgState.vmgToZonePort.sorted.push(7, 8, 9); _vmgState.vmgToZonePort.queue.push(7, 8, 9); _vmgState.vmgToZoneStb.sorted.push(10, 11, 12); _vmgState.vmgToZoneStb.queue.push(10, 11, 12); expect(_vmgState.vmgToLinePos.sorted.length).toBe(3); expect(_vmgState.vmgToLineNeg.sorted.length).toBe(3); expect(_vmgState.vmgToZonePort.sorted.length).toBe(3); expect(_vmgState.vmgToZoneStb.sorted.length).toBe(3); resetVmgSamples(); expect(_vmgState.vmgToLinePos.sorted.length).toBe(0); expect(_vmgState.vmgToLineNeg.sorted.length).toBe(0); expect(_vmgState.vmgToZonePort.sorted.length).toBe(0); expect(_vmgState.vmgToZoneStb.sorted.length).toBe(0); }); test('collectVmgSamplesEastWestNarrow: test east west line, with perpendicular and narrow approaches', () => { resetVmgSamples(); collectVmgSamples(toRadians(0), 19.7, 270, 0, 0); expect(_vmgState.vmgToLinePos.sorted.length).toBe(1); expect(_vmgState.vmgToLinePos.sorted[0]).toBeCloseTo(19.7); expect(_vmgState.vmgToLineNeg.sorted.length).toBe(0); expect(_vmgState.vmgToZonePort.sorted.length).toBe(0); expect(_vmgState.vmgToZoneStb.sorted.length).toBe(0); collectVmgSamples(toRadians(8.21), 19.7, 270, 0, 0); expect(_vmgState.vmgToLinePos.sorted.length).toBe(2); expect(_vmgState.vmgToLinePos.sorted[0]).toBeCloseTo(19.5); expect(_vmgState.vmgToLinePos.sorted[1]).toBeCloseTo(19.7); expect(_vmgState.vmgToLineNeg.sorted.length).toBe(0); expect(_vmgState.vmgToZonePort.sorted.length).toBe(0); expect(_vmgState.vmgToZoneStb.sorted.length).toBe(1); expect(_vmgState.vmgToZoneStb.sorted[0]).toBeCloseTo(2.81); }); test('collectVmgSamplesEastWest: test east west line with circle', () => { resetVmgSamples(); collectVmgSamples(toRadians(0), 5, 270, 0, 0); expect(_vmgState.vmgToLinePos.sorted.length).toBe(1); expect(_vmgState.vmgToLinePos.sorted[0]).toBe(5); expect(_vmgState.vmgToLineNeg.sorted.length).toBe(0); expect(_vmgState.vmgToZonePort.sorted.length).toBe(0); expect(_vmgState.vmgToZoneStb.sorted.length).toBe(0); collectVmgSamples(toRadians(36.87), 5, 270, 0, 0); expect(_vmgState.vmgToLinePos.sorted.length).toBe(2); expect(_vmgState.vmgToLinePos.sorted[0]).toBeCloseTo(4); expect(_vmgState.vmgToLinePos.sorted[1]).toBe(5); expect(_vmgState.vmgToLineNeg.sorted.length).toBe(0); expect(_vmgState.vmgToZonePort.sorted.length).toBe(0); expect(_vmgState.vmgToZoneStb.sorted.length).toBe(1); expect(_vmgState.vmgToZoneStb.sorted[0]).toBeCloseTo(3); collectVmgSamples(toRadians(90), 5, 270, 0, 0); expect(_vmgState.vmgToLinePos.sorted.length).toBe(2); expect(_vmgState.vmgToLinePos.sorted[0]).toBeCloseTo(4); expect(_vmgState.vmgToLinePos.sorted[1]).toBeCloseTo(5); expect(_vmgState.vmgToLineNeg.sorted.length).toBe(0); expect(_vmgState.vmgToZonePort.sorted.length).toBe(0); expect(_vmgState.vmgToZoneStb.sorted.length).toBe(2); expect(_vmgState.vmgToZoneStb.sorted[0]).toBeCloseTo(3); expect(_vmgState.vmgToZoneStb.sorted[1]).toBeCloseTo(5); collectVmgSamples(toRadians(90 + 36.87), 5, 270, 0, 0); expect(_vmgState.vmgToLinePos.sorted.length).toBe(2); expect(_vmgState.vmgToLinePos.sorted[0]).toBeCloseTo(4); expect(_vmgState.vmgToLinePos.sorted[1]).toBeCloseTo(5); expect(_vmgState.vmgToLineNeg.sorted.length).toBe(1); expect(_vmgState.vmgToLineNeg.sorted[0]).toBeCloseTo(3); expect(_vmgState.vmgToZonePort.sorted.length).toBe(0); expect(_vmgState.vmgToZoneStb.sorted.length).toBe(3); expect(_vmgState.vmgToZoneStb.sorted[0]).toBeCloseTo(3); expect(_vmgState.vmgToZoneStb.sorted[1]).toBeCloseTo(4); expect(_vmgState.vmgToZoneStb.sorted[2]).toBeCloseTo(5); collectVmgSamples(toRadians(180), 5, 270, 0, 0); expect(_vmgState.vmgToLinePos.sorted.length).toBe(2); expect(_vmgState.vmgToLinePos.sorted[0]).toBeCloseTo(4); expect(_vmgState.vmgToLinePos.sorted[1]).toBeCloseTo(5); expect(_vmgState.vmgToLineNeg.sorted.length).toBe(2); expect(_vmgState.vmgToLineNeg.sorted[0]).toBeCloseTo(3); expect(_vmgState.vmgToLineNeg.sorted[1]).toBeCloseTo(5); expect(_vmgState.vmgToZonePort.sorted.length).toBe(0); expect(_vmgState.vmgToZoneStb.sorted.length).toBe(3); expect(_vmgState.vmgToZoneStb.sorted[0]).toBeCloseTo(3); expect(_vmgState.vmgToZoneStb.sorted[1]).toBeCloseTo(4); expect(_vmgState.vmgToZoneStb.sorted[2]).toBeCloseTo(5); collectVmgSamples(toRadians(180 + 53.13), 5, 270, 0, 0); expect(_vmgState.vmgToLinePos.sorted.length).toBe(2); expect(_vmgState.vmgToLinePos.sorted[0]).toBeCloseTo(4); expect(_vmgState.vmgToLinePos.sorted[1]).toBeCloseTo(5); expect(_vmgState.vmgToLineNeg.sorted.length).toBe(3); expect(_vmgState.vmgToLineNeg.sorted[0]).toBeCloseTo(3); expect(_vmgState.vmgToLineNeg.sorted[1]).toBeCloseTo(3); expect(_vmgState.vmgToLineNeg.sorted[2]).toBeCloseTo(5); expect(_vmgState.vmgToZonePort.sorted.length).toBe(1); expect(_vmgState.vmgToZonePort.sorted[0]).toBeCloseTo(4); expect(_vmgState.vmgToZoneStb.sorted.length).toBe(3); expect(_vmgState.vmgToZoneStb.sorted[0]).toBeCloseTo(3); expect(_vmgState.vmgToZoneStb.sorted[1]).toBeCloseTo(4); expect(_vmgState.vmgToZoneStb.sorted[2]).toBeCloseTo(5); collectVmgSamples(toRadians(270), 5, 270, 0, 0); expect(_vmgState.vmgToLinePos.sorted.length).toBe(2); expect(_vmgState.vmgToLinePos.sorted[0]).toBeCloseTo(4); expect(_vmgState.vmgToLinePos.sorted[1]).toBeCloseTo(5); expect(_vmgState.vmgToLineNeg.sorted.length).toBe(3); expect(_vmgState.vmgToLineNeg.sorted[0]).toBeCloseTo(3); expect(_vmgState.vmgToLineNeg.sorted[1]).toBeCloseTo(3); expect(_vmgState.vmgToLineNeg.sorted[2]).toBeCloseTo(5); expect(_vmgState.vmgToZonePort.sorted.length).toBe(2); expect(_vmgState.vmgToZonePort.sorted[0]).toBeCloseTo(4); expect(_vmgState.vmgToZonePort.sorted[1]).toBeCloseTo(5); expect(_vmgState.vmgToZoneStb.sorted.length).toBe(3); expect(_vmgState.vmgToZoneStb.sorted[0]).toBeCloseTo(3); expect(_vmgState.vmgToZoneStb.sorted[1]).toBeCloseTo(4); expect(_vmgState.vmgToZoneStb.sorted[2]).toBeCloseTo(5); collectVmgSamples(-toRadians(53.13), 5, 270, 0, 0); expect(_vmgState.vmgToLinePos.sorted.length).toBe(3); expect(_vmgState.vmgToLinePos.sorted[0]).toBeCloseTo(3); expect(_vmgState.vmgToLinePos.sorted[1]).toBeCloseTo(4); expect(_vmgState.vmgToLinePos.sorted[2]).toBeCloseTo(5); expect(_vmgState.vmgToLineNeg.sorted.length).toBe(3); expect(_vmgState.vmgToLineNeg.sorted[0]).toBeCloseTo(3); expect(_vmgState.vmgToLineNeg.sorted[1]).toBeCloseTo(3); expect(_vmgState.vmgToLineNeg.sorted[2]).toBeCloseTo(5); expect(_vmgState.vmgToZonePort.sorted.length).toBe(3); expect(_vmgState.vmgToZonePort.sorted[0]).toBeCloseTo(4); expect(_vmgState.vmgToZonePort.sorted[1]).toBeCloseTo(4); expect(_vmgState.vmgToZonePort.sorted[2]).toBeCloseTo(5); expect(_vmgState.vmgToZoneStb.sorted.length).toBe(3); expect(_vmgState.vmgToZoneStb.sorted[0]).toBeCloseTo(3); expect(_vmgState.vmgToZoneStb.sorted[1]).toBeCloseTo(4); expect(_vmgState.vmgToZoneStb.sorted[2]).toBeCloseTo(5); }); test('collectVmgSamplesNW2SE: test NW to SE line approached obliquely', () => { resetVmgSamples(); collectVmgSamples(toRadians(0), 19.7, 8.21, 0, 0); expect(_vmgState.vmgToLinePos.sorted.length).toBe(0); expect(_vmgState.vmgToLineNeg.sorted.length).toBe(1); expect(_vmgState.vmgToLineNeg.sorted[0]).toBeCloseTo(2.81); expect(_vmgState.vmgToZonePort.sorted.length).toBe(1); expect(_vmgState.vmgToZonePort.sorted[0]).toBeCloseTo(19.5); expect(_vmgState.vmgToZoneStb.sorted.length).toBe(0); }); });