@neurodevs/node-lsl 10.2.2 → 11.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -38
- package/build/__tests__/{AbstractNodeLslTest.d.ts → AbstractLslTest.d.ts} +5 -4
- package/build/__tests__/{AbstractNodeLslTest.js → AbstractLslTest.js} +30 -24
- package/build/__tests__/AbstractLslTest.js.map +1 -0
- package/build/__tests__/EventMarkerOutlet.test.d.ts +18 -0
- package/build/__tests__/EventMarkerOutlet.test.js +144 -0
- package/build/__tests__/EventMarkerOutlet.test.js.map +1 -0
- package/build/__tests__/{Liblsl.test.d.ts → LiblslAdapter.test.d.ts} +2 -2
- package/build/__tests__/{Liblsl.test.js → LiblslAdapter.test.js} +43 -75
- package/build/__tests__/LiblslAdapter.test.js.map +1 -0
- package/build/__tests__/LslStreamInfo.test.d.ts +3 -3
- package/build/__tests__/LslStreamInfo.test.js +3 -3
- package/build/__tests__/LslStreamInfo.test.js.map +1 -1
- package/build/__tests__/{LslInlet.test.d.ts → LslStreamInlet.test.d.ts} +4 -4
- package/build/__tests__/{LslInlet.test.js → LslStreamInlet.test.js} +17 -17
- package/build/__tests__/LslStreamInlet.test.js.map +1 -0
- package/build/__tests__/{LslOutlet.test.d.ts → LslStreamOutlet.test.d.ts} +3 -3
- package/build/__tests__/{LslOutlet.test.js → LslStreamOutlet.test.js} +45 -41
- package/build/__tests__/LslStreamOutlet.test.js.map +1 -0
- package/build/{components/Liblsl.d.ts → adapters/LiblslAdapter.d.ts} +1 -1
- package/build/{components/Liblsl.js → adapters/LiblslAdapter.js} +7 -7
- package/build/adapters/LiblslAdapter.js.map +1 -0
- package/build/components/EventMarkerOutlet.d.ts +20 -0
- package/build/components/{TimeMarkerOutlet.js → EventMarkerOutlet.js} +19 -25
- package/build/components/EventMarkerOutlet.js.map +1 -0
- package/build/components/LiblslAdapter.d.ts +24 -0
- package/build/components/LiblslAdapter.js +198 -0
- package/build/components/LiblslAdapter.js.map +1 -0
- package/build/components/LslStreamInfo.js +2 -2
- package/build/components/LslStreamInfo.js.map +1 -1
- package/build/components/{LslInlet.d.ts → LslStreamInlet.d.ts} +4 -4
- package/build/components/{LslInlet.js → LslStreamInlet.js} +5 -5
- package/build/components/LslStreamInlet.js.map +1 -0
- package/build/components/{LslOutlet.d.ts → LslStreamOutlet.d.ts} +1 -1
- package/build/components/{LslOutlet.js → LslStreamOutlet.js} +5 -5
- package/build/components/LslStreamOutlet.js.map +1 -0
- package/build/index.d.ts +20 -19
- package/build/index.js +33 -28
- package/build/index.js.map +1 -1
- package/build/nodeLsl.types.d.ts +3 -3
- package/build/testDoubles/{FakeLiblsl.d.ts → Liblsl/FakeLiblsl.d.ts} +1 -1
- package/build/testDoubles/Liblsl/FakeLiblsl.js.map +1 -0
- package/build/testDoubles/LslInlet/SpyLslInlet.d.ts +7 -0
- package/build/testDoubles/{SpyLslInlet.js → LslInlet/SpyLslInlet.js} +2 -2
- package/build/testDoubles/LslInlet/SpyLslInlet.js.map +1 -0
- package/build/testDoubles/{FakeLslOutlet.d.ts → LslOutlet/FakeLslOutlet.d.ts} +3 -5
- package/build/testDoubles/{FakeLslOutlet.js → LslOutlet/FakeLslOutlet.js} +0 -4
- package/build/testDoubles/LslOutlet/FakeLslOutlet.js.map +1 -0
- package/build/testDoubles/MarkerOutlet/FakeMarkerOutlet.d.ts +12 -0
- package/build/testDoubles/MarkerOutlet/FakeMarkerOutlet.js +25 -0
- package/build/testDoubles/MarkerOutlet/FakeMarkerOutlet.js.map +1 -0
- package/build/testDoubles/{MockTimeMarkerOutlet.d.ts → MarkerOutlet/MockMarkerOutlet.d.ts} +3 -2
- package/build/testDoubles/{MockTimeMarkerOutlet.js → MarkerOutlet/MockMarkerOutlet.js} +3 -3
- package/build/testDoubles/MarkerOutlet/MockMarkerOutlet.js.map +1 -0
- package/build/testDoubles/MarkerOutlet/SpyMarkerOutlet.d.ts +9 -0
- package/build/testDoubles/MarkerOutlet/SpyMarkerOutlet.js +24 -0
- package/build/testDoubles/MarkerOutlet/SpyMarkerOutlet.js.map +1 -0
- package/build/testDoubles/{FakeStreamInfo.d.ts → StreamInfo/FakeStreamInfo.d.ts} +2 -2
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +1 -0
- package/build/testDoubles/StreamInfo/SpyStreamInfo.d.ts +9 -0
- package/build/testDoubles/{SpyLslStreamInfo.js → StreamInfo/SpyStreamInfo.js} +4 -4
- package/build/testDoubles/StreamInfo/SpyStreamInfo.js.map +1 -0
- package/build/testDoubles/generateRandomOutletOptions.d.ts +1 -1
- package/package.json +1 -1
- package/src/__tests__/AbstractLslTest.ts +58 -0
- package/src/__tests__/EventMarkerOutlet.test.ts +165 -0
- package/src/__tests__/{Liblsl.test.ts → LiblslAdapter.test.ts} +18 -22
- package/src/__tests__/LslStreamInfo.test.ts +12 -12
- package/src/__tests__/{LslInlet.test.ts → LslStreamInlet.test.ts} +11 -11
- package/src/__tests__/{LslOutlet.test.ts → LslStreamOutlet.test.ts} +28 -22
- package/src/{components/Liblsl.ts → adapters/LiblslAdapter.ts} +3 -3
- package/src/components/{TimeMarkerOutlet.ts → EventMarkerOutlet.ts} +23 -33
- package/src/components/LslStreamInfo.ts +2 -2
- package/src/components/{LslInlet.ts → LslStreamInlet.ts} +5 -5
- package/src/components/{LslOutlet.ts → LslStreamOutlet.ts} +3 -3
- package/src/index.ts +28 -19
- package/src/nodeLsl.types.ts +3 -3
- package/src/testDoubles/{FakeLiblsl.ts → Liblsl/FakeLiblsl.ts} +1 -1
- package/src/testDoubles/{SpyLslInlet.ts → LslInlet/SpyLslInlet.ts} +5 -3
- package/src/testDoubles/{FakeLslOutlet.ts → LslOutlet/FakeLslOutlet.ts} +3 -9
- package/src/testDoubles/MarkerOutlet/FakeMarkerOutlet.ts +32 -0
- package/src/testDoubles/{MockTimeMarkerOutlet.ts → MarkerOutlet/MockMarkerOutlet.ts} +3 -2
- package/src/testDoubles/MarkerOutlet/SpyMarkerOutlet.ts +24 -0
- package/src/testDoubles/{FakeStreamInfo.ts → StreamInfo/FakeStreamInfo.ts} +2 -2
- package/src/testDoubles/{SpyLslStreamInfo.ts → StreamInfo/SpyStreamInfo.ts} +4 -2
- package/src/testDoubles/generateRandomOutletOptions.ts +1 -1
- package/build/__tests__/AbstractNodeLslTest.js.map +0 -1
- package/build/__tests__/Liblsl.test.js.map +0 -1
- package/build/__tests__/LslInlet.test.js.map +0 -1
- package/build/__tests__/LslOutlet.test.js.map +0 -1
- package/build/__tests__/SpyLslStreamInfo.d.ts +0 -5
- package/build/__tests__/SpyLslStreamInfo.js +0 -17
- package/build/__tests__/SpyLslStreamInfo.js.map +0 -1
- package/build/__tests__/TimeMarkerOutlet.test.d.ts +0 -28
- package/build/__tests__/TimeMarkerOutlet.test.js +0 -165
- package/build/__tests__/TimeMarkerOutlet.test.js.map +0 -1
- package/build/components/Liblsl.js.map +0 -1
- package/build/components/LslInlet.js.map +0 -1
- package/build/components/LslOutlet.js.map +0 -1
- package/build/components/TimeMarkerOutlet.d.ts +0 -19
- package/build/components/TimeMarkerOutlet.js.map +0 -1
- package/build/demo.d.ts +0 -1
- package/build/demo.js +0 -42
- package/build/demo.js.map +0 -1
- package/build/testDoubles/FakeLiblsl.js.map +0 -1
- package/build/testDoubles/FakeLslOutlet.js.map +0 -1
- package/build/testDoubles/FakeLslStreamInfo.d.ts +0 -5
- package/build/testDoubles/FakeLslStreamInfo.js +0 -10
- package/build/testDoubles/FakeLslStreamInfo.js.map +0 -1
- package/build/testDoubles/FakeStreamInfo.js.map +0 -1
- package/build/testDoubles/FakeTimeMarkerOutlet.d.ts +0 -14
- package/build/testDoubles/FakeTimeMarkerOutlet.js +0 -30
- package/build/testDoubles/FakeTimeMarkerOutlet.js.map +0 -1
- package/build/testDoubles/MockTimeMarkerOutlet.js.map +0 -1
- package/build/testDoubles/SpyLslInlet.d.ts +0 -7
- package/build/testDoubles/SpyLslInlet.js.map +0 -1
- package/build/testDoubles/SpyLslStreamInfo.d.ts +0 -9
- package/build/testDoubles/SpyLslStreamInfo.js.map +0 -1
- package/build/testDoubles/SpyTimeMarkerOutlet.d.ts +0 -9
- package/build/testDoubles/SpyTimeMarkerOutlet.js +0 -19
- package/build/testDoubles/SpyTimeMarkerOutlet.js.map +0 -1
- package/src/__tests__/AbstractNodeLslTest.ts +0 -50
- package/src/__tests__/TimeMarkerOutlet.test.ts +0 -181
- package/src/demo.ts +0 -43
- package/src/testDoubles/FakeTimeMarkerOutlet.ts +0 -39
- package/src/testDoubles/SpyTimeMarkerOutlet.ts +0 -19
- /package/build/testDoubles/{FakeLiblsl.js → Liblsl/FakeLiblsl.js} +0 -0
- /package/build/testDoubles/{FakeStreamInfo.js → StreamInfo/FakeStreamInfo.js} +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { MarkerOutlet } from '../../components/EventMarkerOutlet';
|
|
2
|
+
import { DurationMarker, LslSample } from '../../nodeLsl.types';
|
|
3
|
+
export default class MockMarkerOutlet implements MarkerOutlet {
|
|
3
4
|
private didPushMarkers;
|
|
4
5
|
private pushedMarkers?;
|
|
5
6
|
private didPushSamples;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const test_utils_1 = require("@sprucelabs/test-utils");
|
|
4
|
-
class
|
|
4
|
+
class MockMarkerOutlet {
|
|
5
5
|
constructor() {
|
|
6
6
|
this.didPushMarkers = false;
|
|
7
7
|
this.didPushSamples = false;
|
|
@@ -38,5 +38,5 @@ class MockTimeMarkerOutlet {
|
|
|
38
38
|
test_utils_1.assert.isFalse(this.didPushMarkers, `Expected to NOT have pushed markers but did. Try 'outlet.pushMarkers(...)'`);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
-
exports.default =
|
|
42
|
-
//# sourceMappingURL=
|
|
41
|
+
exports.default = MockMarkerOutlet;
|
|
42
|
+
//# sourceMappingURL=MockMarkerOutlet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockMarkerOutlet.js","sourceRoot":"","sources":["../../../src/testDoubles/MarkerOutlet/MockMarkerOutlet.ts"],"names":[],"mappings":";;AAAA,uDAA+C;AAI/C,MAAqB,gBAAgB;IAArC;QACY,mBAAc,GAAG,KAAK,CAAA;QAEtB,mBAAc,GAAG,KAAK,CAAA;IAsDlC,CAAC;IAnDU,IAAI,KAAI,CAAC;IACT,OAAO,KAAI,CAAC;IAEZ,UAAU,CAAC,MAAiB;QAC/B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;YAC1B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;QAC3B,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IACpC,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,OAAyB;QAC9C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAA;IAChC,CAAC;IAEM,oBAAoB,CAAC,OAAqB;QAC7C,mBAAM,CAAC,MAAM,CACT,IAAI,CAAC,cAAc,EACnB,0EAA0E,CAC7E,CAAA;QAED,IAAI,OAAO,EAAE,CAAC;YACV,mBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;QACnD,CAAC;IACL,CAAC;IAEM,uBAAuB;QAC1B,mBAAM,CAAC,OAAO,CACV,IAAI,CAAC,cAAc,EACnB,2EAA2E,CAC9E,CAAA;IACL,CAAC;IAEM,oBAAoB,CAAC,OAA0B;QAClD,mBAAM,CAAC,MAAM,CACT,IAAI,CAAC,cAAc,EACnB,2EAA2E,CAC9E,CAAA;QAED,IAAI,OAAO,EAAE,CAAC;YACV,mBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;QACnD,CAAC;IACL,CAAC;IAEM,uBAAuB;QAC1B,mBAAM,CAAC,OAAO,CACV,IAAI,CAAC,cAAc,EACnB,4EAA4E,CAC/E,CAAA;IACL,CAAC;CACJ;AAzDD,mCAyDC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import EventMarkerOutlet from '../../components/EventMarkerOutlet';
|
|
2
|
+
import { LslOutlet } from '../../components/LslStreamOutlet';
|
|
3
|
+
export default class SpyMarkerOutlet extends EventMarkerOutlet {
|
|
4
|
+
totalWaitTimeMs: number;
|
|
5
|
+
constructor(lslOutlet: LslOutlet);
|
|
6
|
+
wait(durationMs: number): Promise<void>;
|
|
7
|
+
getLslOutlet(): LslOutlet;
|
|
8
|
+
resetTestDouble(): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const EventMarkerOutlet_1 = __importDefault(require("../../components/EventMarkerOutlet"));
|
|
7
|
+
class SpyMarkerOutlet extends EventMarkerOutlet_1.default {
|
|
8
|
+
constructor(lslOutlet) {
|
|
9
|
+
super(lslOutlet);
|
|
10
|
+
this.totalWaitTimeMs = 0;
|
|
11
|
+
}
|
|
12
|
+
async wait(durationMs) {
|
|
13
|
+
this.totalWaitTimeMs += durationMs;
|
|
14
|
+
return Promise.resolve();
|
|
15
|
+
}
|
|
16
|
+
getLslOutlet() {
|
|
17
|
+
return this.lslOutlet;
|
|
18
|
+
}
|
|
19
|
+
resetTestDouble() {
|
|
20
|
+
this.totalWaitTimeMs = 0;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.default = SpyMarkerOutlet;
|
|
24
|
+
//# sourceMappingURL=SpyMarkerOutlet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpyMarkerOutlet.js","sourceRoot":"","sources":["../../../src/testDoubles/MarkerOutlet/SpyMarkerOutlet.ts"],"names":[],"mappings":";;;;;AAAA,2FAAkE;AAGlE,MAAqB,eAAgB,SAAQ,2BAAiB;IAG1D,YAAmB,SAAoB;QACnC,KAAK,CAAC,SAAS,CAAC,CAAA;QAChB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAA;IAC5B,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,UAAkB;QAChC,IAAI,CAAC,eAAe,IAAI,UAAU,CAAA;QAClC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC5B,CAAC;IAEM,YAAY;QACf,OAAO,IAAI,CAAC,SAAS,CAAA;IACzB,CAAC;IAEM,eAAe;QAClB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAA;IAC5B,CAAC;CACJ;AApBD,kCAoBC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { StreamInfo, StreamInfoOptions } from '
|
|
2
|
-
import { BoundStreamInfo } from '
|
|
1
|
+
import { StreamInfo, StreamInfoOptions } from '../../components/LslStreamInfo';
|
|
2
|
+
import { BoundStreamInfo } from '../../nodeLsl.types';
|
|
3
3
|
export default class FakeStreamInfo implements StreamInfo {
|
|
4
4
|
static callsToConstructor: StreamInfoOptions[];
|
|
5
5
|
static boundStreamInfo: BoundStreamInfo;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FakeStreamInfo.js","sourceRoot":"","sources":["../../../src/testDoubles/StreamInfo/FakeStreamInfo.ts"],"names":[],"mappings":";;AAGA,MAAqB,cAAc;IAI/B,YAAmB,OAA0B;QACzC,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACnD,CAAC;IAED,IAAW,eAAe;QACtB,OAAO,cAAc,CAAC,eAAe,CAAA;IACzC,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,cAAc,CAAC,kBAAkB,GAAG,EAAE,CAAA;IAC1C,CAAC;;AAba,iCAAkB,GAAwB,EAAE,CAAA;AAC5C,8BAAe,GAAG,EAAqB,CAAA;kBAFpC,cAAc"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import LslStreamInfo, { StreamInfoOptions } from '../../components/LslStreamInfo';
|
|
2
|
+
export default class SpyStreamInfo extends LslStreamInfo {
|
|
3
|
+
constructor(options: StreamInfoOptions);
|
|
4
|
+
getStreamInfo(): import("../..").BoundStreamInfo;
|
|
5
|
+
getName(): string;
|
|
6
|
+
getType(): string;
|
|
7
|
+
getSourceId(): string;
|
|
8
|
+
getUnits(): string;
|
|
9
|
+
}
|
|
@@ -3,8 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const LslStreamInfo_1 = __importDefault(require("
|
|
7
|
-
class
|
|
6
|
+
const LslStreamInfo_1 = __importDefault(require("../../components/LslStreamInfo"));
|
|
7
|
+
class SpyStreamInfo extends LslStreamInfo_1.default {
|
|
8
8
|
constructor(options) {
|
|
9
9
|
super(options);
|
|
10
10
|
}
|
|
@@ -24,5 +24,5 @@ class SpyLslStreamInfo extends LslStreamInfo_1.default {
|
|
|
24
24
|
return this.units;
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
exports.default =
|
|
28
|
-
//# sourceMappingURL=
|
|
27
|
+
exports.default = SpyStreamInfo;
|
|
28
|
+
//# sourceMappingURL=SpyStreamInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpyStreamInfo.js","sourceRoot":"","sources":["../../../src/testDoubles/StreamInfo/SpyStreamInfo.ts"],"names":[],"mappings":";;;;;AAAA,mFAEuC;AAEvC,MAAqB,aAAc,SAAQ,uBAAa;IACpD,YAAmB,OAA0B;QACzC,KAAK,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC;IAEM,aAAa;QAChB,OAAO,IAAI,CAAC,UAAU,CAAA;IAC1B,CAAC;IAEM,OAAO;QACV,OAAO,IAAI,CAAC,IAAI,CAAA;IACpB,CAAC;IAEM,OAAO;QACV,OAAO,IAAI,CAAC,IAAI,CAAA;IACpB,CAAC;IAEM,WAAW;QACd,OAAO,IAAI,CAAC,QAAQ,CAAA;IACxB,CAAC;IAEM,QAAQ;QACX,OAAO,IAAI,CAAC,KAAK,CAAA;IACrB,CAAC;CACJ;AAxBD,gCAwBC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { LslOutletOptions } from '../components/
|
|
1
|
+
import { LslOutletOptions } from '../components/LslStreamOutlet';
|
|
2
2
|
export default function generateRandomOutletOptions(): LslOutletOptions;
|
package/package.json
CHANGED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import AbstractSpruceTest, { generateId } from '@sprucelabs/test-utils'
|
|
2
|
+
import LiblslAdapter from '../adapters/LiblslAdapter'
|
|
3
|
+
import EventMarkerOutlet from '../components/EventMarkerOutlet'
|
|
4
|
+
import LslStreamInfo from '../components/LslStreamInfo'
|
|
5
|
+
import LslStreamInlet from '../components/LslStreamInlet'
|
|
6
|
+
|
|
7
|
+
import LslStreamOutlet from '../components/LslStreamOutlet'
|
|
8
|
+
import FakeLiblsl from '../testDoubles/Liblsl/FakeLiblsl'
|
|
9
|
+
import { SpyLslInlet } from '../testDoubles/LslInlet/SpyLslInlet'
|
|
10
|
+
import FakeLslOutlet from '../testDoubles/LslOutlet/FakeLslOutlet'
|
|
11
|
+
import SpyMarkerOutlet from '../testDoubles/MarkerOutlet/SpyMarkerOutlet'
|
|
12
|
+
import FakeStreamInfo from '../testDoubles/StreamInfo/FakeStreamInfo'
|
|
13
|
+
import SpyStreamInfo from '../testDoubles/StreamInfo/SpyStreamInfo'
|
|
14
|
+
|
|
15
|
+
export default class AbstractLslTest extends AbstractSpruceTest {
|
|
16
|
+
protected static fakeLiblsl: FakeLiblsl
|
|
17
|
+
|
|
18
|
+
protected static async beforeEach() {
|
|
19
|
+
await super.beforeEach()
|
|
20
|
+
|
|
21
|
+
this.setFakeLiblsl()
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
protected static setFakeLiblsl() {
|
|
25
|
+
this.fakeLiblsl = new FakeLiblsl()
|
|
26
|
+
LiblslAdapter.setInstance(this.fakeLiblsl)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
protected static setSpyStreamInfo() {
|
|
30
|
+
LslStreamInfo.Class = SpyStreamInfo
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
protected static setFakeStreamInfo() {
|
|
34
|
+
LslStreamInfo.Class = FakeStreamInfo
|
|
35
|
+
FakeStreamInfo.resetTestDouble()
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
protected static setSpyLslInlet() {
|
|
39
|
+
LslStreamInlet.Class = SpyLslInlet
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
protected static setFakeLslOutlet() {
|
|
43
|
+
LslStreamOutlet.Class = FakeLslOutlet
|
|
44
|
+
FakeLslOutlet.resetTestDouble()
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
protected static setSpyMarkerOutlet() {
|
|
48
|
+
EventMarkerOutlet.Class = SpyMarkerOutlet
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
protected static readonly name_ = generateId()
|
|
52
|
+
protected static readonly type = generateId()
|
|
53
|
+
protected static readonly sourceId = generateId()
|
|
54
|
+
protected static readonly units = generateId()
|
|
55
|
+
protected static readonly channelNames = [generateId(), generateId()]
|
|
56
|
+
protected static readonly chunkSize = Math.floor(Math.random() * 100)
|
|
57
|
+
protected static readonly maxBuffered = Math.floor(Math.random() * 100)
|
|
58
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { randomInt } from 'crypto'
|
|
2
|
+
import { assert, generateId, test } from '@sprucelabs/test-utils'
|
|
3
|
+
import EventMarkerOutlet from '../components/EventMarkerOutlet'
|
|
4
|
+
import { LslOutletOptions } from '../components/LslStreamOutlet'
|
|
5
|
+
import generateRandomOutletOptions from '../testDoubles/generateRandomOutletOptions'
|
|
6
|
+
import FakeLslOutlet from '../testDoubles/LslOutlet/FakeLslOutlet'
|
|
7
|
+
import SpyMarkerOutlet from '../testDoubles/MarkerOutlet/SpyMarkerOutlet'
|
|
8
|
+
import AbstractLslTest from './AbstractLslTest'
|
|
9
|
+
|
|
10
|
+
export default class EventMarkerOutletTest extends AbstractLslTest {
|
|
11
|
+
private static instance: SpyMarkerOutlet
|
|
12
|
+
|
|
13
|
+
protected static async beforeEach() {
|
|
14
|
+
await super.beforeEach()
|
|
15
|
+
|
|
16
|
+
this.setFakeLiblsl()
|
|
17
|
+
this.setFakeLslOutlet()
|
|
18
|
+
this.setSpyMarkerOutlet()
|
|
19
|
+
|
|
20
|
+
this.instance = await this.EventMarkerOutlet()
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@test()
|
|
24
|
+
protected static async loadsWithEventMarkerSpecificOptions() {
|
|
25
|
+
assert.isEqualDeep(FakeLslOutlet.callsToConstructor[0].options, {
|
|
26
|
+
name: 'Event markers',
|
|
27
|
+
type: 'Markers',
|
|
28
|
+
channelNames: ['Markers'],
|
|
29
|
+
sampleRate: 0,
|
|
30
|
+
channelFormat: 'string',
|
|
31
|
+
sourceId: 'event-markers',
|
|
32
|
+
manufacturer: 'N/A',
|
|
33
|
+
unit: 'N/A',
|
|
34
|
+
chunkSize: 0,
|
|
35
|
+
maxBuffered: 0,
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@test()
|
|
40
|
+
protected static async canOverrideDefaultOptions() {
|
|
41
|
+
const options = generateRandomOutletOptions()
|
|
42
|
+
await this.EventMarkerOutlet(options)
|
|
43
|
+
|
|
44
|
+
assert.isEqualDeep(FakeLslOutlet.callsToConstructor[1].options, options)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@test()
|
|
48
|
+
protected static async pushingSingleMarkerIncrementsHitCountAndWaitTime() {
|
|
49
|
+
const markers = [this.generateDurationMarker()]
|
|
50
|
+
await this.instance.pushMarkers(markers)
|
|
51
|
+
|
|
52
|
+
const marker = markers[0]
|
|
53
|
+
|
|
54
|
+
assert.isEqual(
|
|
55
|
+
FakeLslOutlet.callsToPushSample[0][0],
|
|
56
|
+
marker.name,
|
|
57
|
+
'Pushed the wrong marker!'
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
assert.isEqual(this.instance.totalWaitTimeMs, marker.durationMs)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@test()
|
|
64
|
+
protected static async pushingTwoMarkersIncrementsHitCountAndWaitTimeTwice() {
|
|
65
|
+
const markers = await this.pushTotalMarkers(2)
|
|
66
|
+
|
|
67
|
+
assert.isEqual(FakeLslOutlet.callsToPushSample.length, 2)
|
|
68
|
+
|
|
69
|
+
assert.isEqual(
|
|
70
|
+
this.instance.totalWaitTimeMs,
|
|
71
|
+
markers[0].durationMs + markers[1].durationMs
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@test('can stop on the first marker', 1)
|
|
76
|
+
@test('can stop on the second marker', 2)
|
|
77
|
+
@test('can stop on the third marker', 3)
|
|
78
|
+
protected static async canStopEventMarkersMidPush(bailIdx: number) {
|
|
79
|
+
let hitCount = 0
|
|
80
|
+
|
|
81
|
+
const outlet = this.instance.getLslOutlet()
|
|
82
|
+
|
|
83
|
+
outlet.pushSample = () => {
|
|
84
|
+
hitCount += 1
|
|
85
|
+
if (hitCount === bailIdx) {
|
|
86
|
+
this.instance.stop()
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
await this.pushTotalMarkers(10)
|
|
91
|
+
|
|
92
|
+
assert.isEqual(hitCount, bailIdx)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@test()
|
|
96
|
+
protected static async canStartAgainAfterStopping() {
|
|
97
|
+
this.instance.stop()
|
|
98
|
+
|
|
99
|
+
let hitCount = 0
|
|
100
|
+
|
|
101
|
+
const outlet = this.instance.getLslOutlet()
|
|
102
|
+
|
|
103
|
+
outlet.pushSample = () => {
|
|
104
|
+
hitCount++
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
await this.pushTotalMarkers(10)
|
|
108
|
+
|
|
109
|
+
assert.isEqual(hitCount, 10)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
@test()
|
|
113
|
+
protected static async doesNotWaitIfStopped() {
|
|
114
|
+
await this.setupOutlet()
|
|
115
|
+
|
|
116
|
+
const startMs = Date.now()
|
|
117
|
+
const promise = this.pushTotalMarkers(2, 1000)
|
|
118
|
+
this.instance.stop()
|
|
119
|
+
await promise
|
|
120
|
+
const endMs = Date.now()
|
|
121
|
+
|
|
122
|
+
assert.isBelow(endMs - startMs, 10)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
@test()
|
|
126
|
+
protected static async clearsTheTimeoutOnStop() {
|
|
127
|
+
void this.pushTotalMarkers(2, 100)
|
|
128
|
+
this.instance.stop()
|
|
129
|
+
|
|
130
|
+
this.lslOutlet.pushSample = () =>
|
|
131
|
+
assert.fail('Should not have been called')
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private static get lslOutlet() {
|
|
135
|
+
return this.instance.getLslOutlet()
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
private static async setupOutlet() {
|
|
139
|
+
EventMarkerOutlet.Class = EventMarkerOutlet as any
|
|
140
|
+
this.instance = await this.EventMarkerOutlet()
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
private static async pushTotalMarkers(total: number, durationMs?: number) {
|
|
144
|
+
const markers = new Array(total)
|
|
145
|
+
.fill(null)
|
|
146
|
+
.map(() => this.generateDurationMarker(durationMs))
|
|
147
|
+
|
|
148
|
+
await this.instance.pushMarkers(markers)
|
|
149
|
+
|
|
150
|
+
return markers
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private static generateDurationMarker(durationMs?: number) {
|
|
154
|
+
return {
|
|
155
|
+
name: generateId(),
|
|
156
|
+
durationMs: durationMs ?? randomInt(100, 1000),
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
private static async EventMarkerOutlet(
|
|
161
|
+
options?: Partial<LslOutletOptions>
|
|
162
|
+
) {
|
|
163
|
+
return (await EventMarkerOutlet.Create(options)) as SpyMarkerOutlet
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import { randomInt } from 'crypto'
|
|
2
|
-
import
|
|
3
|
-
test,
|
|
4
|
-
assert,
|
|
5
|
-
errorAssert,
|
|
6
|
-
generateId,
|
|
7
|
-
} from '@sprucelabs/test-utils'
|
|
2
|
+
import { test, assert, errorAssert, generateId } from '@sprucelabs/test-utils'
|
|
8
3
|
import { DataType, OpenParams } from 'ffi-rs'
|
|
9
|
-
import
|
|
4
|
+
import LiblslAdapter from '../adapters/LiblslAdapter'
|
|
10
5
|
import {
|
|
11
6
|
BoundChild,
|
|
12
7
|
BoundDescription,
|
|
@@ -18,9 +13,10 @@ import {
|
|
|
18
13
|
LiblslBindings,
|
|
19
14
|
LslChannel,
|
|
20
15
|
} from '../nodeLsl.types'
|
|
21
|
-
import FakeLiblsl from '../testDoubles/FakeLiblsl'
|
|
16
|
+
import FakeLiblsl from '../testDoubles/Liblsl/FakeLiblsl'
|
|
17
|
+
import AbstractLslTest from './AbstractLslTest'
|
|
22
18
|
|
|
23
|
-
export default class
|
|
19
|
+
export default class LiblslAdapterTest extends AbstractLslTest {
|
|
24
20
|
private static lsl: Liblsl
|
|
25
21
|
private static libraryPath?: string
|
|
26
22
|
private static libraryOptions?: Record<string, any>
|
|
@@ -76,11 +72,11 @@ export default class LiblslTest extends AbstractSpruceTest {
|
|
|
76
72
|
this.appendChildHitCount = 0
|
|
77
73
|
|
|
78
74
|
delete this.ffiRsOpenOptions
|
|
79
|
-
|
|
75
|
+
LiblslAdapter.ffiRsOpen = (options) => {
|
|
80
76
|
this.ffiRsOpenOptions = options
|
|
81
77
|
}
|
|
82
78
|
|
|
83
|
-
|
|
79
|
+
LiblslAdapter.ffiRsDefine = (options) => {
|
|
84
80
|
this.ffiRsDefineOptions = options
|
|
85
81
|
if (this.shouldThrowWhenCreatingBindings) {
|
|
86
82
|
throw new Error('Failed to create bindings!')
|
|
@@ -88,16 +84,16 @@ export default class LiblslTest extends AbstractSpruceTest {
|
|
|
88
84
|
return this.fakeBindings as any
|
|
89
85
|
}
|
|
90
86
|
|
|
91
|
-
|
|
92
|
-
this.lsl =
|
|
87
|
+
LiblslAdapter.resetInstance()
|
|
88
|
+
this.lsl = LiblslAdapter.getInstance()
|
|
93
89
|
}
|
|
94
90
|
|
|
95
91
|
@test()
|
|
96
92
|
protected static async throwsWhenBindingsFailToLoad() {
|
|
97
93
|
this.shouldThrowWhenCreatingBindings = true
|
|
98
|
-
|
|
94
|
+
LiblslAdapter.resetInstance()
|
|
99
95
|
|
|
100
|
-
const err = assert.doesThrow(() =>
|
|
96
|
+
const err = assert.doesThrow(() => LiblslAdapter.getInstance())
|
|
101
97
|
errorAssert.assertError(err, 'FAILED_TO_LOAD_LIBLSL', {
|
|
102
98
|
liblslPath: process.env.LIBLSL_PATH,
|
|
103
99
|
})
|
|
@@ -167,21 +163,21 @@ export default class LiblslTest extends AbstractSpruceTest {
|
|
|
167
163
|
|
|
168
164
|
@test()
|
|
169
165
|
protected static async worksAsASingleton() {
|
|
170
|
-
const liblsl =
|
|
166
|
+
const liblsl = LiblslAdapter.getInstance()
|
|
171
167
|
//@ts-ignore
|
|
172
|
-
assert.isInstanceOf(liblsl,
|
|
168
|
+
assert.isInstanceOf(liblsl, LiblslAdapter)
|
|
173
169
|
}
|
|
174
170
|
|
|
175
171
|
@test()
|
|
176
172
|
protected static async singletonIsTheSame() {
|
|
177
|
-
assert.isEqual(
|
|
173
|
+
assert.isEqual(LiblslAdapter.getInstance(), LiblslAdapter.getInstance())
|
|
178
174
|
}
|
|
179
175
|
|
|
180
176
|
@test()
|
|
181
177
|
protected static canSetInstance() {
|
|
182
178
|
const fake = new FakeLiblsl()
|
|
183
|
-
|
|
184
|
-
assert.isEqual(
|
|
179
|
+
LiblslAdapter.setInstance(fake)
|
|
180
|
+
assert.isEqual(LiblslAdapter.getInstance(), fake)
|
|
185
181
|
}
|
|
186
182
|
|
|
187
183
|
@test()
|
|
@@ -402,8 +398,8 @@ export default class LiblslTest extends AbstractSpruceTest {
|
|
|
402
398
|
protected static async defaultsToMacOsPath() {
|
|
403
399
|
delete process.env.LIBLSL_PATH
|
|
404
400
|
|
|
405
|
-
|
|
406
|
-
this.lsl =
|
|
401
|
+
LiblslAdapter.resetInstance()
|
|
402
|
+
this.lsl = LiblslAdapter.getInstance()
|
|
407
403
|
|
|
408
404
|
assert.isEqual(
|
|
409
405
|
this.ffiRsOpenOptions?.path,
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { test, assert, generateId, errorAssert } from '@sprucelabs/test-utils'
|
|
2
2
|
import LslStreamInfo, { StreamInfoOptions } from '../components/LslStreamInfo'
|
|
3
3
|
import { CHANNEL_FORMATS } from '../consts'
|
|
4
|
-
import
|
|
5
|
-
import
|
|
4
|
+
import SpyStreamInfo from '../testDoubles/StreamInfo/SpyStreamInfo'
|
|
5
|
+
import AbstractLslTest from './AbstractLslTest'
|
|
6
6
|
|
|
7
|
-
export default class LslStreamInfoTest extends
|
|
8
|
-
private static instance:
|
|
7
|
+
export default class LslStreamInfoTest extends AbstractLslTest {
|
|
8
|
+
private static instance: SpyStreamInfo
|
|
9
9
|
|
|
10
10
|
protected static async beforeEach() {
|
|
11
11
|
await super.beforeEach()
|
|
12
12
|
|
|
13
|
-
this.
|
|
13
|
+
this.setSpyStreamInfo()
|
|
14
14
|
|
|
15
15
|
this.instance = this.LslStreamInfo()
|
|
16
16
|
}
|
|
@@ -191,13 +191,6 @@ export default class LslStreamInfoTest extends AbstractNodeLslTest {
|
|
|
191
191
|
)
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
-
private static LslStreamInfo(options?: Partial<StreamInfoOptions>) {
|
|
195
|
-
return LslStreamInfo.Create({
|
|
196
|
-
...this.defaultOptions,
|
|
197
|
-
...options,
|
|
198
|
-
}) as SpyLslStreamInfo
|
|
199
|
-
}
|
|
200
|
-
|
|
201
194
|
private static readonly defaultOptions = {
|
|
202
195
|
name: generateId(),
|
|
203
196
|
type: generateId(),
|
|
@@ -206,4 +199,11 @@ export default class LslStreamInfoTest extends AbstractNodeLslTest {
|
|
|
206
199
|
channelFormat: 'float32',
|
|
207
200
|
sampleRate: 100 * Math.random(),
|
|
208
201
|
} as StreamInfoOptions
|
|
202
|
+
|
|
203
|
+
private static LslStreamInfo(options?: Partial<StreamInfoOptions>) {
|
|
204
|
+
return LslStreamInfo.Create({
|
|
205
|
+
...this.defaultOptions,
|
|
206
|
+
...options,
|
|
207
|
+
}) as SpyStreamInfo
|
|
208
|
+
}
|
|
209
209
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { test, assert, errorAssert } from '@sprucelabs/test-utils'
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
2
|
+
import LslStreamInlet, { LslInletOptions } from '../components/LslStreamInlet'
|
|
3
|
+
import { SpyLslInlet } from '../testDoubles/LslInlet/SpyLslInlet'
|
|
4
|
+
import FakeStreamInfo from '../testDoubles/StreamInfo/FakeStreamInfo'
|
|
5
|
+
import AbstractLslTest from './AbstractLslTest'
|
|
6
6
|
|
|
7
|
-
export default class
|
|
7
|
+
export default class LslStreamInletTest extends AbstractLslTest {
|
|
8
8
|
private static instance: SpyLslInlet
|
|
9
9
|
|
|
10
10
|
protected static async beforeEach() {
|
|
@@ -13,11 +13,11 @@ export default class LslInletTest extends AbstractNodeLslTest {
|
|
|
13
13
|
this.setSpyLslInlet()
|
|
14
14
|
this.setFakeStreamInfo()
|
|
15
15
|
|
|
16
|
-
this.instance = this.
|
|
16
|
+
this.instance = this.LslStreamInlet()
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
@test()
|
|
20
|
-
protected static async
|
|
20
|
+
protected static async canCreateLslStreamInlet() {
|
|
21
21
|
assert.isTruthy(this.instance, 'Instance should be created!')
|
|
22
22
|
}
|
|
23
23
|
|
|
@@ -25,7 +25,7 @@ export default class LslInletTest extends AbstractNodeLslTest {
|
|
|
25
25
|
protected static async throwsWithMissingRequiredOptions() {
|
|
26
26
|
const err = assert.doesThrow(
|
|
27
27
|
// @ts-ignore
|
|
28
|
-
() =>
|
|
28
|
+
() => LslStreamInlet.Create()
|
|
29
29
|
)
|
|
30
30
|
errorAssert.assertError(err, 'MISSING_PARAMETERS', {
|
|
31
31
|
parameters: [
|
|
@@ -56,7 +56,7 @@ export default class LslInletTest extends AbstractNodeLslTest {
|
|
|
56
56
|
|
|
57
57
|
@test()
|
|
58
58
|
protected static async uniqueNameHasSetPrefix() {
|
|
59
|
-
const instance = this.
|
|
59
|
+
const instance = this.LslStreamInlet({ name: undefined })
|
|
60
60
|
|
|
61
61
|
assert.doesInclude(
|
|
62
62
|
instance.getName(),
|
|
@@ -82,7 +82,7 @@ export default class LslInletTest extends AbstractNodeLslTest {
|
|
|
82
82
|
)
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
private static
|
|
85
|
+
private static LslStreamInlet(options?: Partial<LslInletOptions>) {
|
|
86
86
|
const defaultOptions = {
|
|
87
87
|
channelNames: this.channelNames,
|
|
88
88
|
channelFormat: 'float32',
|
|
@@ -94,6 +94,6 @@ export default class LslInletTest extends AbstractNodeLslTest {
|
|
|
94
94
|
maxBuffered: this.maxBuffered,
|
|
95
95
|
...options,
|
|
96
96
|
} as LslInletOptions
|
|
97
|
-
return
|
|
97
|
+
return LslStreamInlet.Create(defaultOptions) as SpyLslInlet
|
|
98
98
|
}
|
|
99
99
|
}
|