@neurodevs/node-lsl 17.1.1 → 18.0.0
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/.claude/settings.local.json +10 -0
- package/.regressionproof.json +7 -0
- package/.vscode/launch.json +3 -2
- package/README.md +9 -35
- package/build/.spruce/settings.json +5 -1
- package/build/__tests__/AbstractPackageTest.d.ts +4 -4
- package/build/__tests__/AbstractPackageTest.js +9 -11
- package/build/__tests__/AbstractPackageTest.js.map +1 -1
- package/build/__tests__/impl/LslBackpressureMonitor.test.d.ts +7 -0
- package/build/__tests__/impl/LslBackpressureMonitor.test.js +26 -0
- package/build/__tests__/impl/LslBackpressureMonitor.test.js.map +1 -0
- package/build/__tests__/impl/LslEventMarkerEmitter.test.d.ts +34 -0
- package/build/__tests__/impl/LslEventMarkerEmitter.test.js +243 -0
- package/build/__tests__/impl/LslEventMarkerEmitter.test.js.map +1 -0
- package/build/__tests__/impl/LslStreamInfo.test.d.ts +0 -3
- package/build/__tests__/impl/LslStreamInfo.test.js +2 -27
- package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamInlet.test.d.ts +20 -8
- package/build/__tests__/impl/LslStreamInlet.test.js +224 -69
- package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamOutlet.test.d.ts +3 -7
- package/build/__tests__/impl/LslStreamOutlet.test.js +36 -46
- package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
- package/build/__tests__/impl/LslWebSocketBridge.test.js +16 -17
- package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
- package/build/assertions.d.ts +1 -1
- package/build/assertions.js.map +1 -1
- package/build/impl/LslBackpressureMonitor.d.ts +8 -0
- package/build/impl/LslBackpressureMonitor.js +8 -0
- package/build/impl/LslBackpressureMonitor.js.map +1 -0
- package/build/impl/LslEventMarkerEmitter.d.ts +35 -0
- package/build/impl/LslEventMarkerEmitter.js +86 -0
- package/build/impl/LslEventMarkerEmitter.js.map +1 -0
- package/build/impl/LslStreamInfo.d.ts +4 -8
- package/build/impl/LslStreamInfo.js +8 -21
- package/build/impl/LslStreamInfo.js.map +1 -1
- package/build/impl/LslStreamInlet.d.ts +31 -50
- package/build/impl/LslStreamInlet.js +79 -149
- package/build/impl/LslStreamInlet.js.map +1 -1
- package/build/impl/LslStreamOutlet.d.ts +15 -18
- package/build/impl/LslStreamOutlet.js +39 -47
- package/build/impl/LslStreamOutlet.js.map +1 -1
- package/build/impl/LslWebSocketBridge.d.ts +4 -5
- package/build/impl/LslWebSocketBridge.js +8 -8
- package/build/impl/LslWebSocketBridge.js.map +1 -1
- package/build/impl/workers/inlet/LslStreamInlet.worker.d.ts +22 -0
- package/build/impl/workers/inlet/LslStreamInlet.worker.js +42 -0
- package/build/impl/workers/inlet/LslStreamInlet.worker.js.map +1 -0
- package/build/impl/workers/inlet/StreamInletWorker.d.ts +73 -0
- package/build/impl/workers/inlet/StreamInletWorker.js +253 -0
- package/build/impl/workers/inlet/StreamInletWorker.js.map +1 -0
- package/build/impl/workers/outlet/LslStreamOutlet.worker.d.ts +32 -0
- package/build/impl/workers/outlet/LslStreamOutlet.worker.js +82 -0
- package/build/impl/workers/outlet/LslStreamOutlet.worker.js.map +1 -0
- package/build/index.d.ts +12 -14
- package/build/index.js +14 -16
- package/build/index.js.map +1 -1
- package/build/scripts/finalizeHandles.d.ts +2 -0
- package/build/scripts/finalizeHandles.js +48 -0
- package/build/scripts/finalizeHandles.js.map +1 -0
- package/build/scripts/runLslEventMarkerEmitter.js +11 -0
- package/build/scripts/runLslEventMarkerEmitter.js.map +1 -0
- package/build/scripts/runOutletToInlet.js +7 -6
- package/build/scripts/runOutletToInlet.js.map +1 -1
- package/build/scripts/testDestroyOutlet.d.ts +1 -0
- package/build/scripts/testDestroyOutlet.js +4 -0
- package/build/scripts/testDestroyOutlet.js.map +1 -0
- package/build/testDoubles/BackpressureMonitor/FakeBackpressureMonitor.d.ts +6 -0
- package/build/testDoubles/BackpressureMonitor/FakeBackpressureMonitor.js +10 -0
- package/build/testDoubles/BackpressureMonitor/FakeBackpressureMonitor.js.map +1 -0
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.d.ts +17 -0
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js +30 -0
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js.map +1 -0
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.d.ts +10 -0
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js +23 -0
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js.map +1 -0
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.d.ts +9 -0
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js +19 -0
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js.map +1 -0
- package/build/testDoubles/StreamInfo/FakeStreamInfo.d.ts +3 -3
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js +3 -3
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +1 -1
- package/build/testDoubles/StreamInlet/FakeStreamInlet.d.ts +8 -10
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js +6 -7
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +1 -1
- package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +2 -5
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js +2 -8
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +1 -1
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.d.ts +7 -9
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js +5 -8
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +1 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.d.ts +1 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js +1 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js.map +1 -1
- package/build/testDoubles/WorkerThreads/FakeWorker.d.ts +27 -0
- package/build/testDoubles/WorkerThreads/FakeWorker.js +67 -0
- package/build/testDoubles/WorkerThreads/FakeWorker.js.map +1 -0
- package/build/validations.js +0 -2
- package/build/validations.js.map +1 -1
- package/package.json +23 -7
- package/src/.spruce/settings.json +5 -1
- package/src/__tests__/AbstractPackageTest.ts +12 -14
- package/src/__tests__/impl/LslBackpressureMonitor.test.ts +25 -0
- package/src/__tests__/impl/LslEventMarkerEmitter.test.ts +322 -0
- package/src/__tests__/impl/LslStreamInfo.test.ts +3 -40
- package/src/__tests__/impl/LslStreamInlet.test.ts +344 -97
- package/src/__tests__/impl/LslStreamOutlet.test.ts +61 -69
- package/src/__tests__/impl/LslWebSocketBridge.test.ts +18 -18
- package/src/assertions.ts +2 -1
- package/src/impl/LslBackpressureMonitor.ts +13 -0
- package/src/impl/LslEventMarkerEmitter.ts +133 -0
- package/src/impl/LslStreamInfo.ts +17 -29
- package/src/impl/LslStreamInlet.ts +102 -215
- package/src/impl/LslStreamOutlet.ts +54 -78
- package/src/impl/LslWebSocketBridge.ts +12 -12
- package/src/impl/workers/inlet/LslStreamInlet.worker.ts +74 -0
- package/src/impl/workers/inlet/StreamInletWorker.ts +348 -0
- package/src/impl/workers/outlet/LslStreamOutlet.worker.ts +144 -0
- package/src/index.ts +14 -17
- package/src/scripts/finalizeHandles.ts +63 -0
- package/src/scripts/runLslEventMarkerEmitter.ts +15 -0
- package/src/scripts/runOutletToInlet.ts +10 -8
- package/src/scripts/testDestroyOutlet.ts +5 -0
- package/src/testDoubles/BackpressureMonitor/FakeBackpressureMonitor.ts +13 -0
- package/src/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.ts +46 -0
- package/src/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.ts +31 -0
- package/src/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.ts +29 -0
- package/src/testDoubles/StreamInfo/FakeStreamInfo.ts +4 -4
- package/src/testDoubles/StreamInlet/FakeStreamInlet.ts +11 -17
- package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +3 -16
- package/src/testDoubles/StreamOutlet/FakeStreamOutlet.ts +12 -15
- package/src/testDoubles/WebSocketBridge/FakeWebSocketBridge.ts +1 -1
- package/src/testDoubles/WorkerThreads/FakeWorker.ts +99 -0
- package/src/validations.ts +0 -2
- package/build/__tests__/impl/LiblslAdapter.test.d.ts +0 -79
- package/build/__tests__/impl/LiblslAdapter.test.js +0 -688
- package/build/__tests__/impl/LiblslAdapter.test.js.map +0 -1
- package/build/__tests__/impl/LslEventMarkerOutlet.test.d.ts +0 -21
- package/build/__tests__/impl/LslEventMarkerOutlet.test.js +0 -160
- package/build/__tests__/impl/LslEventMarkerOutlet.test.js.map +0 -1
- package/build/handleError.d.ts +0 -8
- package/build/handleError.js +0 -25
- package/build/handleError.js.map +0 -1
- package/build/impl/LiblslAdapter.d.ts +0 -154
- package/build/impl/LiblslAdapter.js +0 -317
- package/build/impl/LiblslAdapter.js.map +0 -1
- package/build/impl/LslEventMarkerOutlet.d.ts +0 -28
- package/build/impl/LslEventMarkerOutlet.js +0 -63
- package/build/impl/LslEventMarkerOutlet.js.map +0 -1
- package/build/scripts/runLslEventMarkerOutlet.js +0 -18
- package/build/scripts/runLslEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.d.ts +0 -13
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js +0 -26
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.d.ts +0 -17
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js +0 -46
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.d.ts +0 -9
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js +0 -19
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.d.ts +0 -9
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js +0 -19
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/Liblsl/FakeLiblsl.d.ts +0 -50
- package/build/testDoubles/Liblsl/FakeLiblsl.js +0 -126
- package/build/testDoubles/Liblsl/FakeLiblsl.js.map +0 -1
- package/src/__tests__/impl/LiblslAdapter.test.ts +0 -817
- package/src/__tests__/impl/LslEventMarkerOutlet.test.ts +0 -195
- package/src/handleError.ts +0 -24
- package/src/impl/LiblslAdapter.ts +0 -543
- package/src/impl/LslEventMarkerOutlet.ts +0 -97
- package/src/scripts/runLslEventMarkerOutlet.ts +0 -23
- package/src/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.ts +0 -36
- package/src/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.ts +0 -75
- package/src/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.ts +0 -24
- package/src/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.ts +0 -28
- package/src/testDoubles/Liblsl/FakeLiblsl.ts +0 -182
- /package/build/scripts/{runLslEventMarkerOutlet.d.ts → runLslEventMarkerEmitter.d.ts} +0 -0
package/.vscode/launch.json
CHANGED
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
"runtimeArgs": [
|
|
18
18
|
"--inspect-brk",
|
|
19
19
|
"--trace-warnings",
|
|
20
|
-
"
|
|
20
|
+
"--experimental-vm-modules",
|
|
21
|
+
"${workspaceFolder}/node_modules/jest/bin/jest.js",
|
|
21
22
|
"${fileBasenameNoExtension}",
|
|
22
23
|
"--detectOpenHandles"
|
|
23
24
|
],
|
|
@@ -33,7 +34,7 @@
|
|
|
33
34
|
"runtimeArgs": [
|
|
34
35
|
"--inspect-brk",
|
|
35
36
|
"--trace-warnings",
|
|
36
|
-
"${workspaceFolder}/node_modules
|
|
37
|
+
"${workspaceFolder}/node_modules/jest/bin/jest.js"
|
|
37
38
|
],
|
|
38
39
|
"cwd": "${workspaceFolder}",
|
|
39
40
|
"console": "integratedTerminal",
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@ Lab Streaming Layer (LSL) for synchronized streaming of multi-modal, time-series
|
|
|
6
6
|
- [Installation](#installation)
|
|
7
7
|
- [Usage](#usage)
|
|
8
8
|
- [LslStreamOutlet](#lslstreamoutlet)
|
|
9
|
-
- [
|
|
9
|
+
- [LslEventMarkerEmitter](#LslEventMarkerEmitter)
|
|
10
10
|
- [Test Doubles](#test-doubles)
|
|
11
11
|
|
|
12
12
|
## Overview
|
|
@@ -57,47 +57,21 @@ const outlet = await LslStreamOutlet.Create({
|
|
|
57
57
|
outlet.pushSample([1, 2, 3, 4, 5])
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
###
|
|
60
|
+
### LslEventMarkerEmitter
|
|
61
61
|
|
|
62
|
-
LSL is also often used to push event markers that mark different phases of an experiment or session. The `
|
|
62
|
+
LSL is also often used to push event markers that mark different phases of an experiment or session. The `emitMany` method pushes an event marker, waits for a specified duration, then pushes the next marker. From experience, each event marker should have a `waitAfterMs` of at least 100 ms or so to ensure LSL receives the event markers in the right order.
|
|
63
63
|
|
|
64
64
|
```typescript
|
|
65
|
-
import {
|
|
65
|
+
import { LslEventMarkerEmitter } from '@neurodevs/node-lsl'
|
|
66
66
|
|
|
67
|
-
const
|
|
67
|
+
const emitter = await LslEventMarkerEmitter.Create()
|
|
68
68
|
|
|
69
69
|
const markers = [
|
|
70
|
-
{ name: 'phase-1-begin',
|
|
71
|
-
{ name: 'phase-1-end',
|
|
70
|
+
{ name: 'phase-1-begin', waitAfterMs: 5000 },
|
|
71
|
+
{ name: 'phase-1-end', waitAfterMs: 100 },
|
|
72
72
|
]
|
|
73
73
|
|
|
74
|
-
|
|
75
|
-
await outlet.pushMarkers(markers)
|
|
74
|
+
const promise = emitter.emitMany(markers)
|
|
76
75
|
|
|
77
|
-
|
|
78
|
-
void outlet.pushMarkers(markers)
|
|
79
|
-
|
|
80
|
-
// Interrupts the above pushMarkers process
|
|
81
|
-
outlet.stop()
|
|
76
|
+
emitter.interrupt()
|
|
82
77
|
```
|
|
83
|
-
|
|
84
|
-
## Test Doubles
|
|
85
|
-
|
|
86
|
-
This package was developed using test-driven development (TDD). If you also follow TDD, you'll likely want test doubles to fake or mock certain behaviors for these classes.
|
|
87
|
-
|
|
88
|
-
For example, the `MockEventMarkerOutlet` class lets you test whether your application appropriately calls its methods without actually doing anything. Set this mock in your test code like this:
|
|
89
|
-
|
|
90
|
-
```typescript
|
|
91
|
-
import { LslEventMarkerOutlet, MockEventMarkerOutlet } from '@neurodevs/node-lsl'
|
|
92
|
-
|
|
93
|
-
// In your tests / beforeEach
|
|
94
|
-
LslEventMarkerOutlet.Class = MockEventMarkerOutlet
|
|
95
|
-
const mock = await LslEventMarkerOutlet.Create()
|
|
96
|
-
|
|
97
|
-
// Do something in your application that should start the outlet
|
|
98
|
-
|
|
99
|
-
const expectedMarkers = ['phase-1-begin', ...]
|
|
100
|
-
mock.assertDidPushSamples(expectedMarkers)
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
Now, you'll have a failing test. There will be a helpful error message to guide you towards the solution. Basically, you just need to call the `pushSample` method in your application with the expected markers. See examples above for how to do so.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { FakeLiblsl } from '@neurodevs/ndx-native';
|
|
1
2
|
import AbstractModuleTest from '@neurodevs/node-tdd';
|
|
2
3
|
import { OnDataCallback, StreamInletOptions } from '../impl/LslStreamInlet.js';
|
|
3
|
-
import FakeLiblsl from '../testDoubles/Liblsl/FakeLiblsl.js';
|
|
4
4
|
import FakeStreamInfo from '../testDoubles/StreamInfo/FakeStreamInfo.js';
|
|
5
5
|
export default class AbstractPackageTest extends AbstractModuleTest {
|
|
6
6
|
protected static fakeLiblsl: FakeLiblsl;
|
|
@@ -11,17 +11,17 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
11
11
|
protected static setSpyStreamInlet(): void;
|
|
12
12
|
protected static setFakeStreamInlet(): void;
|
|
13
13
|
protected static setFakeStreamOutlet(): void;
|
|
14
|
-
protected static
|
|
14
|
+
protected static setSpyEventMarkerEmitter(): void;
|
|
15
15
|
protected static setSpyLslWebSocketBridge(): void;
|
|
16
16
|
protected static setFakeWebSocket(): void;
|
|
17
17
|
protected static setFakeWebSocketServer(): void;
|
|
18
|
-
protected static readonly
|
|
18
|
+
protected static readonly fakeStreamInfo: FakeStreamInfo;
|
|
19
19
|
protected static readonly name_: string;
|
|
20
20
|
protected static readonly type: string;
|
|
21
21
|
protected static readonly sourceId: string;
|
|
22
22
|
protected static readonly units: string;
|
|
23
23
|
protected static readonly channelNames: string[];
|
|
24
|
-
protected static
|
|
24
|
+
protected static readonly channelCount: number;
|
|
25
25
|
protected static readonly chunkSize = 2;
|
|
26
26
|
protected static readonly sampleRateHz: number;
|
|
27
27
|
protected static readonly maxBufferedMs: number;
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
+
import { FakeLiblsl, LiblslAdapter } from '@neurodevs/ndx-native';
|
|
1
2
|
import AbstractModuleTest from '@neurodevs/node-tdd';
|
|
2
|
-
import
|
|
3
|
-
import LslEventMarkerOutlet from '../impl/LslEventMarkerOutlet.js';
|
|
3
|
+
import LslEventMarkerEmitter from '../impl/LslEventMarkerEmitter.js';
|
|
4
4
|
import LslStreamInfo from '../impl/LslStreamInfo.js';
|
|
5
5
|
import LslStreamInlet from '../impl/LslStreamInlet.js';
|
|
6
6
|
import LslStreamOutlet from '../impl/LslStreamOutlet.js';
|
|
7
7
|
import LslWebSocketBridge from '../impl/LslWebSocketBridge.js';
|
|
8
|
-
import
|
|
9
|
-
import FakeLiblsl from '../testDoubles/Liblsl/FakeLiblsl.js';
|
|
8
|
+
import SpyEventMarkerEmitter from '../testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js';
|
|
10
9
|
import FakeStreamInfo from '../testDoubles/StreamInfo/FakeStreamInfo.js';
|
|
11
10
|
import SpyStreamInfo from '../testDoubles/StreamInfo/SpyStreamInfo.js';
|
|
12
11
|
import FakeStreamInlet from '../testDoubles/StreamInlet/FakeStreamInlet.js';
|
|
@@ -24,6 +23,7 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
24
23
|
this.fakeLiblsl = new FakeLiblsl();
|
|
25
24
|
LiblslAdapter.setInstance(this.fakeLiblsl);
|
|
26
25
|
FakeLiblsl.fakeErrorCode = 0;
|
|
26
|
+
FakeLiblsl.fakeInfoHandles = [{}];
|
|
27
27
|
}
|
|
28
28
|
static setSpyStreamInfo() {
|
|
29
29
|
LslStreamInfo.Class = SpyStreamInfo;
|
|
@@ -44,8 +44,8 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
44
44
|
LslStreamOutlet.Class = FakeStreamOutlet;
|
|
45
45
|
FakeStreamOutlet.resetTestDouble();
|
|
46
46
|
}
|
|
47
|
-
static
|
|
48
|
-
|
|
47
|
+
static setSpyEventMarkerEmitter() {
|
|
48
|
+
LslEventMarkerEmitter.Class = SpyEventMarkerEmitter;
|
|
49
49
|
}
|
|
50
50
|
static setSpyLslWebSocketBridge() {
|
|
51
51
|
LslWebSocketBridge.Class = SpyLslWebSocketBridge;
|
|
@@ -58,7 +58,7 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
58
58
|
LslWebSocketBridge.WSS = FakeWebSocketServer;
|
|
59
59
|
FakeWebSocketServer.resetTestDouble();
|
|
60
60
|
}
|
|
61
|
-
static
|
|
61
|
+
static fakeStreamInfo = new FakeStreamInfo();
|
|
62
62
|
static name_ = this.generateId();
|
|
63
63
|
static type = this.generateId();
|
|
64
64
|
static sourceId = this.generateId();
|
|
@@ -68,15 +68,13 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
68
68
|
this.generateId(),
|
|
69
69
|
this.generateId(),
|
|
70
70
|
];
|
|
71
|
-
static
|
|
72
|
-
return this.channelNames.length;
|
|
73
|
-
}
|
|
71
|
+
static channelCount = this.channelNames.length;
|
|
74
72
|
static chunkSize = 2;
|
|
75
73
|
static sampleRateHz = Math.floor(Math.random() * 100);
|
|
76
74
|
static maxBufferedMs = Math.floor(Math.random() * 1000);
|
|
77
75
|
static async LslStreamInlet(options, onData) {
|
|
78
76
|
const defaultOptions = {
|
|
79
|
-
|
|
77
|
+
sourceId: this.sourceId,
|
|
80
78
|
chunkSize: this.chunkSize,
|
|
81
79
|
maxBufferedMs: this.maxBufferedMs,
|
|
82
80
|
...options,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractPackageTest.js","sourceRoot":"","sources":["../../src/__tests__/AbstractPackageTest.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"AbstractPackageTest.js","sourceRoot":"","sources":["../../src/__tests__/AbstractPackageTest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import AbstractPackageTest from '../AbstractPackageTest.js';
|
|
2
|
+
export default class LslBackpressureMonitorTest extends AbstractPackageTest {
|
|
3
|
+
private static instance;
|
|
4
|
+
protected static beforeEach(): Promise<void>;
|
|
5
|
+
protected static createsInstance(): Promise<void>;
|
|
6
|
+
private static LslBackpressureMonitor;
|
|
7
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { test, assert } from '@neurodevs/node-tdd';
|
|
8
|
+
import LslBackpressureMonitor from '../../impl/LslBackpressureMonitor.js';
|
|
9
|
+
import AbstractPackageTest from '../AbstractPackageTest.js';
|
|
10
|
+
export default class LslBackpressureMonitorTest extends AbstractPackageTest {
|
|
11
|
+
static instance;
|
|
12
|
+
static async beforeEach() {
|
|
13
|
+
await super.beforeEach();
|
|
14
|
+
this.instance = this.LslBackpressureMonitor();
|
|
15
|
+
}
|
|
16
|
+
static async createsInstance() {
|
|
17
|
+
assert.isTruthy(this.instance, 'Failed to create instance!');
|
|
18
|
+
}
|
|
19
|
+
static LslBackpressureMonitor() {
|
|
20
|
+
return LslBackpressureMonitor.Create();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
__decorate([
|
|
24
|
+
test()
|
|
25
|
+
], LslBackpressureMonitorTest, "createsInstance", null);
|
|
26
|
+
//# sourceMappingURL=LslBackpressureMonitor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LslBackpressureMonitor.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/LslBackpressureMonitor.test.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,sBAEN,MAAM,sCAAsC,CAAA;AAC7C,OAAO,mBAAmB,MAAM,2BAA2B,CAAA;AAE3D,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,mBAAmB;IAC/D,MAAM,CAAC,QAAQ,CAAqB;IAElC,MAAM,CAAC,KAAK,CAAC,UAAU;QAC7B,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;QAExB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAA;IACjD,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,eAAe;QAClC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,4BAA4B,CAAC,CAAA;IAChE,CAAC;IAEO,MAAM,CAAC,sBAAsB;QACjC,OAAO,sBAAsB,CAAC,MAAM,EAAE,CAAA;IAC1C,CAAC;CACJ;AAP0B;IADtB,IAAI,EAAE;uDAGN"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import AbstractPackageTest from '../AbstractPackageTest.js';
|
|
2
|
+
export default class EventMarkerEmitterTest extends AbstractPackageTest {
|
|
3
|
+
private static instance;
|
|
4
|
+
protected static beforeEach(): Promise<void>;
|
|
5
|
+
private static readonly markerName;
|
|
6
|
+
protected static createsInstance(): Promise<void>;
|
|
7
|
+
protected static loadsWithEventMarkerSpecificOptions(): Promise<void>;
|
|
8
|
+
protected static canOverrideDefaultOptions(): Promise<void>;
|
|
9
|
+
protected static emittingSingleMarkerIncrementsHitCountAndWaitTime(): Promise<void>;
|
|
10
|
+
protected static emittingTwoMarkersIncrementsHitCountAndWaitTimeTwice(): Promise<void>;
|
|
11
|
+
protected static emitterIsInterruptable(bailIdx: number): Promise<void>;
|
|
12
|
+
protected static canStartAgainAfterInterrupting(): Promise<void>;
|
|
13
|
+
protected static doesNotWaitIfInterrupted(): Promise<void>;
|
|
14
|
+
protected static clearsTimeoutOnInterrupt(): Promise<void>;
|
|
15
|
+
protected static emitCallsPushSampleOnStreamOutlet(): Promise<void>;
|
|
16
|
+
protected static emitWaitsForMsIfPassed(): Promise<void>;
|
|
17
|
+
protected static destroyCallsDestroyOnInternalStreamOutlet(): Promise<void>;
|
|
18
|
+
protected static destroyInterruptsIfRunning(): Promise<void>;
|
|
19
|
+
protected static sourceIdIsUniqueAcrossInstances(): Promise<void>;
|
|
20
|
+
protected static emitThrowsIfCalledWhileAlreadyRunning(): Promise<void>;
|
|
21
|
+
protected static emitManyThrowsIfCalledWhileAlreadyRunning(): Promise<void>;
|
|
22
|
+
protected static emitSetsIsRunningFalseOnceDone(): Promise<void>;
|
|
23
|
+
protected static emitManySetsIsRunningFalseOnceDone(): Promise<void>;
|
|
24
|
+
private static emitOnce;
|
|
25
|
+
private static emit;
|
|
26
|
+
private static emitManyOnce;
|
|
27
|
+
private static emitManyFor;
|
|
28
|
+
private static generateEventMarker;
|
|
29
|
+
private static interrupt;
|
|
30
|
+
private static destroy;
|
|
31
|
+
private static get streamOutlet();
|
|
32
|
+
private static setupOutlet;
|
|
33
|
+
private static LslEventMarkerEmitter;
|
|
34
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { randomInt } from 'crypto';
|
|
8
|
+
import { assert, test } from '@neurodevs/node-tdd';
|
|
9
|
+
import LslEventMarkerEmitter from '../../impl/LslEventMarkerEmitter.js';
|
|
10
|
+
import SpyEventMarkerEmitter from '../../testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js';
|
|
11
|
+
import generateRandomOutletOptions from '../../testDoubles/generateRandomOutletOptions.js';
|
|
12
|
+
import FakeStreamOutlet from '../../testDoubles/StreamOutlet/FakeStreamOutlet.js';
|
|
13
|
+
import AbstractPackageTest from '../AbstractPackageTest.js';
|
|
14
|
+
export default class EventMarkerEmitterTest extends AbstractPackageTest {
|
|
15
|
+
static instance;
|
|
16
|
+
static async beforeEach() {
|
|
17
|
+
await super.beforeEach();
|
|
18
|
+
this.setFakeLiblsl();
|
|
19
|
+
this.setFakeStreamOutlet();
|
|
20
|
+
this.setSpyEventMarkerEmitter();
|
|
21
|
+
this.instance = await this.LslEventMarkerEmitter();
|
|
22
|
+
}
|
|
23
|
+
static markerName = this.generateId();
|
|
24
|
+
static async createsInstance() {
|
|
25
|
+
assert.isTruthy(this.instance, 'Failed to create instance!');
|
|
26
|
+
}
|
|
27
|
+
static async loadsWithEventMarkerSpecificOptions() {
|
|
28
|
+
assert.isEqualDeep({
|
|
29
|
+
...FakeStreamOutlet.callsToConstructor[0],
|
|
30
|
+
name: undefined,
|
|
31
|
+
sourceId: undefined,
|
|
32
|
+
}, {
|
|
33
|
+
name: undefined,
|
|
34
|
+
type: 'Markers',
|
|
35
|
+
sourceId: undefined,
|
|
36
|
+
channelNames: ['Markers'],
|
|
37
|
+
channelFormat: 'string',
|
|
38
|
+
sampleRateHz: 0,
|
|
39
|
+
chunkSize: 1,
|
|
40
|
+
});
|
|
41
|
+
assert.isTrue(FakeStreamOutlet.callsToConstructor[0]?.sourceId.startsWith('event-markers-'), 'Source ID was not generated uniquely!');
|
|
42
|
+
assert.isTrue(FakeStreamOutlet.callsToConstructor[0]?.name.startsWith('Event markers ('), 'Name was not generated uniquely!');
|
|
43
|
+
}
|
|
44
|
+
static async canOverrideDefaultOptions() {
|
|
45
|
+
const options = generateRandomOutletOptions();
|
|
46
|
+
await this.LslEventMarkerEmitter(options);
|
|
47
|
+
assert.isEqualDeep(FakeStreamOutlet.callsToConstructor[1], options);
|
|
48
|
+
}
|
|
49
|
+
static async emittingSingleMarkerIncrementsHitCountAndWaitTime() {
|
|
50
|
+
const markers = [this.generateEventMarker()];
|
|
51
|
+
await this.instance.emitMany(markers);
|
|
52
|
+
const marker = markers[0];
|
|
53
|
+
assert.isEqual(FakeStreamOutlet.callsToPushSample[0]?.sample[0], marker.name, 'Pushed the wrong marker!');
|
|
54
|
+
assert.isEqual(this.instance.totalwaitAfterMs, marker.waitAfterMs);
|
|
55
|
+
}
|
|
56
|
+
static async emittingTwoMarkersIncrementsHitCountAndWaitTimeTwice() {
|
|
57
|
+
const markers = await this.emitManyFor(2);
|
|
58
|
+
assert.isEqual(FakeStreamOutlet.callsToPushSample.length, 2);
|
|
59
|
+
assert.isEqual(this.instance.totalwaitAfterMs, markers[0].waitAfterMs + markers[1].waitAfterMs);
|
|
60
|
+
}
|
|
61
|
+
static async emitterIsInterruptable(bailIdx) {
|
|
62
|
+
let hitCount = 0;
|
|
63
|
+
this.streamOutlet.pushSample = () => {
|
|
64
|
+
hitCount += 1;
|
|
65
|
+
if (hitCount === bailIdx) {
|
|
66
|
+
this.interrupt();
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
await this.emitManyFor(10);
|
|
70
|
+
assert.isEqual(hitCount, bailIdx);
|
|
71
|
+
}
|
|
72
|
+
static async canStartAgainAfterInterrupting() {
|
|
73
|
+
this.interrupt();
|
|
74
|
+
let hitCount = 0;
|
|
75
|
+
this.streamOutlet.pushSample = () => {
|
|
76
|
+
hitCount++;
|
|
77
|
+
};
|
|
78
|
+
await this.emitManyFor(10);
|
|
79
|
+
assert.isEqual(hitCount, 10);
|
|
80
|
+
}
|
|
81
|
+
static async doesNotWaitIfInterrupted() {
|
|
82
|
+
await this.setupOutlet();
|
|
83
|
+
const startMs = Date.now();
|
|
84
|
+
const promise = this.emitManyFor(2, 1000);
|
|
85
|
+
this.interrupt();
|
|
86
|
+
await promise;
|
|
87
|
+
const endMs = Date.now();
|
|
88
|
+
assert.isBelow(endMs - startMs, 10);
|
|
89
|
+
}
|
|
90
|
+
static async clearsTimeoutOnInterrupt() {
|
|
91
|
+
void this.emitManyFor(2, 100);
|
|
92
|
+
this.interrupt();
|
|
93
|
+
this.streamOutlet.pushSample = () => assert.fail('Should not have been called');
|
|
94
|
+
}
|
|
95
|
+
static async emitCallsPushSampleOnStreamOutlet() {
|
|
96
|
+
const markerName = this.generateId();
|
|
97
|
+
await this.emit(markerName);
|
|
98
|
+
assert.isEqualDeep(FakeStreamOutlet.callsToPushSample[0]?.sample, [markerName], 'Pushed the wrong sample!');
|
|
99
|
+
}
|
|
100
|
+
static async emitWaitsForMsIfPassed() {
|
|
101
|
+
SpyEventMarkerEmitter.shouldCallWaitOnSuper = true;
|
|
102
|
+
const waitAfterMs = 10;
|
|
103
|
+
const startMs = Date.now();
|
|
104
|
+
await this.instance.emit(this.markerName, { waitAfterMs });
|
|
105
|
+
const endMs = Date.now();
|
|
106
|
+
assert.isAbove(endMs - startMs, 0.8 * waitAfterMs, 'Did not wait for the specified time!');
|
|
107
|
+
}
|
|
108
|
+
static async destroyCallsDestroyOnInternalStreamOutlet() {
|
|
109
|
+
this.destroy();
|
|
110
|
+
assert.isEqual(FakeStreamOutlet.numCallsToDestroy, 1, 'Did not call destroy on outlet!');
|
|
111
|
+
}
|
|
112
|
+
static async destroyInterruptsIfRunning() {
|
|
113
|
+
let wasHit = false;
|
|
114
|
+
const original = this.instance.interrupt.bind(this.instance);
|
|
115
|
+
this.instance.interrupt = () => {
|
|
116
|
+
wasHit = true;
|
|
117
|
+
original();
|
|
118
|
+
};
|
|
119
|
+
const promise = this.emitManyFor(5, 10);
|
|
120
|
+
this.destroy();
|
|
121
|
+
assert.isTrue(wasHit, 'Did not call interrupt on destroy!');
|
|
122
|
+
await promise;
|
|
123
|
+
}
|
|
124
|
+
static async sourceIdIsUniqueAcrossInstances() {
|
|
125
|
+
const instance = await this.LslEventMarkerEmitter();
|
|
126
|
+
assert.isNotEqual(instance['outlet'].sourceId, this.instance['outlet'].sourceId, 'Source IDs are not unique!');
|
|
127
|
+
}
|
|
128
|
+
static async emitThrowsIfCalledWhileAlreadyRunning() {
|
|
129
|
+
void this.instance.emit(this.markerName, { waitAfterMs: 10 });
|
|
130
|
+
await assert.doesThrowAsync(async () => {
|
|
131
|
+
await this.emit(this.generateId());
|
|
132
|
+
}, 'Cannot call emit while already running!');
|
|
133
|
+
}
|
|
134
|
+
static async emitManyThrowsIfCalledWhileAlreadyRunning() {
|
|
135
|
+
void EventMarkerEmitterTest.emitManyOnce();
|
|
136
|
+
await assert.doesThrowAsync(async () => {
|
|
137
|
+
await this.emitManyFor(5, 1);
|
|
138
|
+
}, 'Cannot call emitMany while already running!');
|
|
139
|
+
}
|
|
140
|
+
static async emitSetsIsRunningFalseOnceDone() {
|
|
141
|
+
await this.emitOnce();
|
|
142
|
+
assert.isFalse(this.instance['isRunning'], 'emit did not set isRunning to false once done!');
|
|
143
|
+
}
|
|
144
|
+
static async emitManySetsIsRunningFalseOnceDone() {
|
|
145
|
+
await this.emitManyOnce();
|
|
146
|
+
assert.isFalse(this.instance['isRunning'], 'emitMany did not set isRunning to false once done! ');
|
|
147
|
+
}
|
|
148
|
+
static async emitOnce() {
|
|
149
|
+
await this.emit(this.markerName);
|
|
150
|
+
}
|
|
151
|
+
static async emit(markerName, options) {
|
|
152
|
+
return this.instance.emit(markerName, options);
|
|
153
|
+
}
|
|
154
|
+
static async emitManyOnce() {
|
|
155
|
+
return this.emitManyFor(5, 1);
|
|
156
|
+
}
|
|
157
|
+
static async emitManyFor(total, waitAfterMs) {
|
|
158
|
+
const markers = new Array(total)
|
|
159
|
+
.fill(null)
|
|
160
|
+
.map(() => this.generateEventMarker(waitAfterMs));
|
|
161
|
+
await this.instance.emitMany(markers);
|
|
162
|
+
return markers;
|
|
163
|
+
}
|
|
164
|
+
static generateEventMarker(waitAfterMs) {
|
|
165
|
+
return {
|
|
166
|
+
name: this.generateId(),
|
|
167
|
+
waitAfterMs: waitAfterMs ?? randomInt(100, 1000),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
static interrupt() {
|
|
171
|
+
this.instance.interrupt();
|
|
172
|
+
}
|
|
173
|
+
static destroy() {
|
|
174
|
+
this.instance.destroy();
|
|
175
|
+
}
|
|
176
|
+
static get streamOutlet() {
|
|
177
|
+
return this.instance.getStreamOutlet();
|
|
178
|
+
}
|
|
179
|
+
static async setupOutlet() {
|
|
180
|
+
LslEventMarkerEmitter.Class = LslEventMarkerEmitter;
|
|
181
|
+
this.instance = await this.LslEventMarkerEmitter();
|
|
182
|
+
}
|
|
183
|
+
static async LslEventMarkerEmitter(options) {
|
|
184
|
+
return (await LslEventMarkerEmitter.Create(options));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
__decorate([
|
|
188
|
+
test()
|
|
189
|
+
], EventMarkerEmitterTest, "createsInstance", null);
|
|
190
|
+
__decorate([
|
|
191
|
+
test()
|
|
192
|
+
], EventMarkerEmitterTest, "loadsWithEventMarkerSpecificOptions", null);
|
|
193
|
+
__decorate([
|
|
194
|
+
test()
|
|
195
|
+
], EventMarkerEmitterTest, "canOverrideDefaultOptions", null);
|
|
196
|
+
__decorate([
|
|
197
|
+
test()
|
|
198
|
+
], EventMarkerEmitterTest, "emittingSingleMarkerIncrementsHitCountAndWaitTime", null);
|
|
199
|
+
__decorate([
|
|
200
|
+
test()
|
|
201
|
+
], EventMarkerEmitterTest, "emittingTwoMarkersIncrementsHitCountAndWaitTimeTwice", null);
|
|
202
|
+
__decorate([
|
|
203
|
+
test('interrupts on first marker', 1),
|
|
204
|
+
test('interrupts on second marker', 2),
|
|
205
|
+
test('interrupts on third marker', 3)
|
|
206
|
+
], EventMarkerEmitterTest, "emitterIsInterruptable", null);
|
|
207
|
+
__decorate([
|
|
208
|
+
test()
|
|
209
|
+
], EventMarkerEmitterTest, "canStartAgainAfterInterrupting", null);
|
|
210
|
+
__decorate([
|
|
211
|
+
test()
|
|
212
|
+
], EventMarkerEmitterTest, "doesNotWaitIfInterrupted", null);
|
|
213
|
+
__decorate([
|
|
214
|
+
test()
|
|
215
|
+
], EventMarkerEmitterTest, "clearsTimeoutOnInterrupt", null);
|
|
216
|
+
__decorate([
|
|
217
|
+
test()
|
|
218
|
+
], EventMarkerEmitterTest, "emitCallsPushSampleOnStreamOutlet", null);
|
|
219
|
+
__decorate([
|
|
220
|
+
test()
|
|
221
|
+
], EventMarkerEmitterTest, "emitWaitsForMsIfPassed", null);
|
|
222
|
+
__decorate([
|
|
223
|
+
test()
|
|
224
|
+
], EventMarkerEmitterTest, "destroyCallsDestroyOnInternalStreamOutlet", null);
|
|
225
|
+
__decorate([
|
|
226
|
+
test()
|
|
227
|
+
], EventMarkerEmitterTest, "destroyInterruptsIfRunning", null);
|
|
228
|
+
__decorate([
|
|
229
|
+
test()
|
|
230
|
+
], EventMarkerEmitterTest, "sourceIdIsUniqueAcrossInstances", null);
|
|
231
|
+
__decorate([
|
|
232
|
+
test()
|
|
233
|
+
], EventMarkerEmitterTest, "emitThrowsIfCalledWhileAlreadyRunning", null);
|
|
234
|
+
__decorate([
|
|
235
|
+
test()
|
|
236
|
+
], EventMarkerEmitterTest, "emitManyThrowsIfCalledWhileAlreadyRunning", null);
|
|
237
|
+
__decorate([
|
|
238
|
+
test()
|
|
239
|
+
], EventMarkerEmitterTest, "emitSetsIsRunningFalseOnceDone", null);
|
|
240
|
+
__decorate([
|
|
241
|
+
test()
|
|
242
|
+
], EventMarkerEmitterTest, "emitManySetsIsRunningFalseOnceDone", null);
|
|
243
|
+
//# sourceMappingURL=LslEventMarkerEmitter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LslEventMarkerEmitter.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/LslEventMarkerEmitter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,9 +16,6 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
|
|
|
16
16
|
protected static passesOptionsToStreamInfo(): Promise<void>;
|
|
17
17
|
protected static appendsChannelsToStreamInfo(): Promise<void>;
|
|
18
18
|
protected static callsBindingsToDestroyStreamInfo(): Promise<void>;
|
|
19
|
-
protected static doesNotCreateNewStreamInfoIfPassedBoundInfo(): Promise<void>;
|
|
20
|
-
protected static setsBoundInfoWhenPassed(): Promise<void>;
|
|
21
|
-
protected static cachesInfoAttributesByBoundInfo(): Promise<void>;
|
|
22
19
|
private static readonly defaultOptions;
|
|
23
20
|
private static LslStreamInfo;
|
|
24
21
|
}
|
|
@@ -105,7 +105,7 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
|
|
|
105
105
|
static async appendsChannelsToStreamInfo() {
|
|
106
106
|
this.LslStreamInfo({ units: this.units, type: this.type });
|
|
107
107
|
assert.isEqualDeep(this.fakeLiblsl.lastAppendChannelsToStreamInfoOptions, {
|
|
108
|
-
|
|
108
|
+
infoHandle: this.instance.infoHandle,
|
|
109
109
|
channels: this.channelNames.map((label) => ({
|
|
110
110
|
label,
|
|
111
111
|
units: this.units,
|
|
@@ -115,23 +115,7 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
|
|
|
115
115
|
}
|
|
116
116
|
static async callsBindingsToDestroyStreamInfo() {
|
|
117
117
|
this.instance.destroy();
|
|
118
|
-
assert.isEqualDeep(this.fakeLiblsl.lastDestroyStreamInfoOptions?.
|
|
119
|
-
}
|
|
120
|
-
static async doesNotCreateNewStreamInfoIfPassedBoundInfo() {
|
|
121
|
-
this.LslStreamInfo({
|
|
122
|
-
boundInfo: this.instance.boundInfo,
|
|
123
|
-
});
|
|
124
|
-
assert.isEqual(this.fakeLiblsl.createStreamInfoHitCount, 1, 'Should not have created new stream info!');
|
|
125
|
-
}
|
|
126
|
-
static async setsBoundInfoWhenPassed() {
|
|
127
|
-
const instance = this.LslStreamInfo({
|
|
128
|
-
boundInfo: this.instance.boundInfo,
|
|
129
|
-
});
|
|
130
|
-
assert.isEqualDeep(instance.boundInfo, this.instance.boundInfo, 'Should have set bound stream info!');
|
|
131
|
-
}
|
|
132
|
-
static async cachesInfoAttributesByBoundInfo() {
|
|
133
|
-
const cached = LslStreamInfo.From(this.instance.boundInfo);
|
|
134
|
-
assert.isEqualDeep(cached, this.instance, 'Should have set bound stream info!');
|
|
118
|
+
assert.isEqualDeep(this.fakeLiblsl.lastDestroyStreamInfoOptions?.infoHandle, this.instance.infoHandle, 'Should have called destroyStreamInfo!');
|
|
135
119
|
}
|
|
136
120
|
static defaultOptions = {
|
|
137
121
|
name: this.name,
|
|
@@ -190,13 +174,4 @@ __decorate([
|
|
|
190
174
|
__decorate([
|
|
191
175
|
test()
|
|
192
176
|
], LslStreamInfoTest, "callsBindingsToDestroyStreamInfo", null);
|
|
193
|
-
__decorate([
|
|
194
|
-
test()
|
|
195
|
-
], LslStreamInfoTest, "doesNotCreateNewStreamInfoIfPassedBoundInfo", null);
|
|
196
|
-
__decorate([
|
|
197
|
-
test()
|
|
198
|
-
], LslStreamInfoTest, "setsBoundInfoWhenPassed", null);
|
|
199
|
-
__decorate([
|
|
200
|
-
test()
|
|
201
|
-
], LslStreamInfoTest, "cachesInfoAttributesByBoundInfo", null);
|
|
202
177
|
//# sourceMappingURL=LslStreamInfo.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LslStreamInfo.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/LslStreamInfo.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"LslStreamInfo.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/LslStreamInfo.test.ts"],"names":[],"mappings":"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"}
|