@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
package/README.md
CHANGED
|
@@ -5,8 +5,8 @@ Lab Streaming Layer (LSL) for synchronized streaming of multi-modal, time-series
|
|
|
5
5
|
- [Overview](#overview)
|
|
6
6
|
- [Installation](#installation)
|
|
7
7
|
- [Usage](#usage)
|
|
8
|
-
- [
|
|
9
|
-
- [
|
|
8
|
+
- [LslStreamOutlet](#lslstreamoutlet)
|
|
9
|
+
- [EventMarkerOutlet](#eventmarkeroutlet)
|
|
10
10
|
- [Test Doubles](#test-doubles)
|
|
11
11
|
|
|
12
12
|
## Overview
|
|
@@ -37,14 +37,14 @@ LIBLSL_PATH=/opt/homebrew/Cellar/lsl/1.16.2/lib/liblsl.1.16.2.dylib
|
|
|
37
37
|
|
|
38
38
|
## Usage
|
|
39
39
|
|
|
40
|
-
###
|
|
40
|
+
### LslStreamOutlet
|
|
41
41
|
|
|
42
42
|
LSL is often used to stream EEG data over a network. For example, to instantiate an LSL outlet for the [Muse S 2nd generation](https://choosemuse.com/products/muse-s-gen-2) headband:
|
|
43
43
|
|
|
44
44
|
```typescript
|
|
45
|
-
import {
|
|
45
|
+
import { LslStreamOutlet } from '@neurodevs/node-lsl'
|
|
46
46
|
|
|
47
|
-
const
|
|
47
|
+
const instance = LslStreamOutlet.Create({
|
|
48
48
|
name: 'Muse S (2nd gen)',
|
|
49
49
|
type: 'EEG',
|
|
50
50
|
channelNames: ['TP9', 'AF7', 'AF8', 'TP10', 'AUX'],
|
|
@@ -58,29 +58,18 @@ const outlet = LslOutletImpl.Outlet({
|
|
|
58
58
|
})
|
|
59
59
|
|
|
60
60
|
// Must be in async function
|
|
61
|
-
await
|
|
61
|
+
await instance.pushSample(...)
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
###
|
|
64
|
+
### EventMarkerOutlet
|
|
65
65
|
|
|
66
|
-
LSL is also often used to push
|
|
66
|
+
LSL is also often used to push event markers that mark different phases of an experiment or session. The `pushMarkers` method pushes an event marker, waits for a specified duration, then pushes the next marker. I recommend that each event marker has a duration of at least 100 ms so that LSL receives the markers in the right order.
|
|
67
67
|
|
|
68
68
|
```typescript
|
|
69
|
-
import {
|
|
69
|
+
import { EventMarkerOutlet } from '@neurodevs/node-lsl'
|
|
70
70
|
|
|
71
|
-
const
|
|
71
|
+
const instance = EventMarkerOutlet.Create()
|
|
72
72
|
|
|
73
|
-
// Must be in async function
|
|
74
|
-
await outlet.pushSample('phase-1-begin')
|
|
75
|
-
|
|
76
|
-
// Wait for phase to end
|
|
77
|
-
|
|
78
|
-
await outlet.pushSample('phase-1-end')
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
There is also a `pushMarkers` method that pushes a time marker, waits for a specified duration, then pushes the next marker. I recommend that each time marker has a duration of at least 100 ms so that LSL receives the markers in the right order.
|
|
82
|
-
|
|
83
|
-
```typescript
|
|
84
73
|
const markers = [
|
|
85
74
|
{ name: 'phase-1-begin', durationMs: 30 * 1000 },
|
|
86
75
|
{ name: 'phase-1-end', durationMs: 0.1 * 1000 },
|
|
@@ -89,38 +78,28 @@ const markers = [
|
|
|
89
78
|
]
|
|
90
79
|
|
|
91
80
|
// Must be in async function, hangs until complete
|
|
92
|
-
await
|
|
81
|
+
await instance.pushMarkers(markers)
|
|
93
82
|
```
|
|
94
83
|
|
|
95
|
-
If you then want to stop the
|
|
84
|
+
If you then want to stop the `EventMarkerOutlet` early, you simply do:
|
|
96
85
|
|
|
97
86
|
```typescript
|
|
98
|
-
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
You can optionally pass any LslOutlet options to the time marker outlet during instantiation. For example, if you want to override the type:
|
|
102
|
-
|
|
103
|
-
```typescript
|
|
104
|
-
import { TimeMarkerOutletImpl } from '@neurodevs/node-lsl'
|
|
105
|
-
|
|
106
|
-
const outlet = TimeMarkerOutletImpl.Outlet({
|
|
107
|
-
type: 'custom-type'
|
|
108
|
-
})
|
|
87
|
+
instance.stop()
|
|
109
88
|
```
|
|
110
89
|
|
|
111
90
|
## Test Doubles
|
|
112
91
|
|
|
113
92
|
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.
|
|
114
93
|
|
|
115
|
-
For example, the `
|
|
94
|
+
For example, the `MockMarkerOutlet` class lets you test whether your application appropriately calls its methods without actually doing anything. Set this mock in your test code like this:
|
|
116
95
|
|
|
117
96
|
```typescript
|
|
118
|
-
import {
|
|
97
|
+
import { EventMarkerOutlet, MockMarkerOutlet } from '@neurodevs/node-lsl'
|
|
119
98
|
|
|
120
99
|
// In your tests / beforeEach
|
|
121
|
-
|
|
100
|
+
EventMarkerOutlet.Class = MockMarkerOutlet
|
|
122
101
|
|
|
123
|
-
const mock =
|
|
102
|
+
const mock = EventMarkerOutlet.Create()
|
|
124
103
|
|
|
125
104
|
// Do something in your application that should start the outlet
|
|
126
105
|
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import AbstractSpruceTest from '@sprucelabs/test-utils';
|
|
2
|
-
import FakeLiblsl from '../testDoubles/FakeLiblsl';
|
|
3
|
-
export default class
|
|
2
|
+
import FakeLiblsl from '../testDoubles/Liblsl/FakeLiblsl';
|
|
3
|
+
export default class AbstractLslTest extends AbstractSpruceTest {
|
|
4
4
|
protected static fakeLiblsl: FakeLiblsl;
|
|
5
5
|
protected static beforeEach(): Promise<void>;
|
|
6
6
|
protected static setFakeLiblsl(): void;
|
|
7
|
-
protected static
|
|
7
|
+
protected static setSpyStreamInfo(): void;
|
|
8
8
|
protected static setFakeStreamInfo(): void;
|
|
9
9
|
protected static setSpyLslInlet(): void;
|
|
10
|
-
protected static
|
|
10
|
+
protected static setFakeLslOutlet(): void;
|
|
11
|
+
protected static setSpyMarkerOutlet(): void;
|
|
11
12
|
protected static readonly name_: string;
|
|
12
13
|
protected static readonly type: string;
|
|
13
14
|
protected static readonly sourceId: string;
|
|
@@ -37,44 +37,50 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
const test_utils_1 = __importStar(require("@sprucelabs/test-utils"));
|
|
40
|
-
const
|
|
41
|
-
const
|
|
40
|
+
const LiblslAdapter_1 = __importDefault(require("../adapters/LiblslAdapter"));
|
|
41
|
+
const EventMarkerOutlet_1 = __importDefault(require("../components/EventMarkerOutlet"));
|
|
42
42
|
const LslStreamInfo_1 = __importDefault(require("../components/LslStreamInfo"));
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
-
const SpyLslInlet_1 = require("../testDoubles/SpyLslInlet");
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
|
|
43
|
+
const LslStreamInlet_1 = __importDefault(require("../components/LslStreamInlet"));
|
|
44
|
+
const LslStreamOutlet_1 = __importDefault(require("../components/LslStreamOutlet"));
|
|
45
|
+
const FakeLiblsl_1 = __importDefault(require("../testDoubles/Liblsl/FakeLiblsl"));
|
|
46
|
+
const SpyLslInlet_1 = require("../testDoubles/LslInlet/SpyLslInlet");
|
|
47
|
+
const FakeLslOutlet_1 = __importDefault(require("../testDoubles/LslOutlet/FakeLslOutlet"));
|
|
48
|
+
const SpyMarkerOutlet_1 = __importDefault(require("../testDoubles/MarkerOutlet/SpyMarkerOutlet"));
|
|
49
|
+
const FakeStreamInfo_1 = __importDefault(require("../testDoubles/StreamInfo/FakeStreamInfo"));
|
|
50
|
+
const SpyStreamInfo_1 = __importDefault(require("../testDoubles/StreamInfo/SpyStreamInfo"));
|
|
51
|
+
class AbstractLslTest extends test_utils_1.default {
|
|
50
52
|
static async beforeEach() {
|
|
51
53
|
await super.beforeEach();
|
|
52
54
|
this.setFakeLiblsl();
|
|
53
55
|
}
|
|
54
56
|
static setFakeLiblsl() {
|
|
55
57
|
this.fakeLiblsl = new FakeLiblsl_1.default();
|
|
56
|
-
|
|
58
|
+
LiblslAdapter_1.default.setInstance(this.fakeLiblsl);
|
|
57
59
|
}
|
|
58
|
-
static
|
|
59
|
-
LslStreamInfo_1.default.Class =
|
|
60
|
+
static setSpyStreamInfo() {
|
|
61
|
+
LslStreamInfo_1.default.Class = SpyStreamInfo_1.default;
|
|
60
62
|
}
|
|
61
63
|
static setFakeStreamInfo() {
|
|
62
64
|
LslStreamInfo_1.default.Class = FakeStreamInfo_1.default;
|
|
63
65
|
FakeStreamInfo_1.default.resetTestDouble();
|
|
64
66
|
}
|
|
65
67
|
static setSpyLslInlet() {
|
|
66
|
-
|
|
68
|
+
LslStreamInlet_1.default.Class = SpyLslInlet_1.SpyLslInlet;
|
|
67
69
|
}
|
|
68
|
-
static
|
|
69
|
-
|
|
70
|
+
static setFakeLslOutlet() {
|
|
71
|
+
LslStreamOutlet_1.default.Class = FakeLslOutlet_1.default;
|
|
72
|
+
FakeLslOutlet_1.default.resetTestDouble();
|
|
73
|
+
}
|
|
74
|
+
static setSpyMarkerOutlet() {
|
|
75
|
+
EventMarkerOutlet_1.default.Class = SpyMarkerOutlet_1.default;
|
|
70
76
|
}
|
|
71
77
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
exports.default =
|
|
80
|
-
//# sourceMappingURL=
|
|
78
|
+
AbstractLslTest.name_ = (0, test_utils_1.generateId)();
|
|
79
|
+
AbstractLslTest.type = (0, test_utils_1.generateId)();
|
|
80
|
+
AbstractLslTest.sourceId = (0, test_utils_1.generateId)();
|
|
81
|
+
AbstractLslTest.units = (0, test_utils_1.generateId)();
|
|
82
|
+
AbstractLslTest.channelNames = [(0, test_utils_1.generateId)(), (0, test_utils_1.generateId)()];
|
|
83
|
+
AbstractLslTest.chunkSize = Math.floor(Math.random() * 100);
|
|
84
|
+
AbstractLslTest.maxBuffered = Math.floor(Math.random() * 100);
|
|
85
|
+
exports.default = AbstractLslTest;
|
|
86
|
+
//# sourceMappingURL=AbstractLslTest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractLslTest.js","sourceRoot":"","sources":["../../src/__tests__/AbstractLslTest.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qEAAuE;AACvE,8EAAqD;AACrD,wFAA+D;AAC/D,gFAAuD;AACvD,kFAAyD;AAEzD,oFAA2D;AAC3D,kFAAyD;AACzD,qEAAiE;AACjE,2FAAkE;AAClE,kGAAyE;AACzE,8FAAqE;AACrE,4FAAmE;AAEnE,MAAqB,eAAgB,SAAQ,oBAAkB;IAGjD,MAAM,CAAC,KAAK,CAAC,UAAU;QAC7B,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;QAExB,IAAI,CAAC,aAAa,EAAE,CAAA;IACxB,CAAC;IAES,MAAM,CAAC,aAAa;QAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAU,EAAE,CAAA;QAClC,uBAAa,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC9C,CAAC;IAES,MAAM,CAAC,gBAAgB;QAC7B,uBAAa,CAAC,KAAK,GAAG,uBAAa,CAAA;IACvC,CAAC;IAES,MAAM,CAAC,iBAAiB;QAC9B,uBAAa,CAAC,KAAK,GAAG,wBAAc,CAAA;QACpC,wBAAc,CAAC,eAAe,EAAE,CAAA;IACpC,CAAC;IAES,MAAM,CAAC,cAAc;QAC3B,wBAAc,CAAC,KAAK,GAAG,yBAAW,CAAA;IACtC,CAAC;IAES,MAAM,CAAC,gBAAgB;QAC7B,yBAAe,CAAC,KAAK,GAAG,uBAAa,CAAA;QACrC,uBAAa,CAAC,eAAe,EAAE,CAAA;IACnC,CAAC;IAES,MAAM,CAAC,kBAAkB;QAC/B,2BAAiB,CAAC,KAAK,GAAG,yBAAe,CAAA;IAC7C,CAAC;;AAEyB,qBAAK,GAAG,IAAA,uBAAU,GAAE,CAAA;AACpB,oBAAI,GAAG,IAAA,uBAAU,GAAE,CAAA;AACnB,wBAAQ,GAAG,IAAA,uBAAU,GAAE,CAAA;AACvB,qBAAK,GAAG,IAAA,uBAAU,GAAE,CAAA;AACpB,4BAAY,GAAG,CAAC,IAAA,uBAAU,GAAE,EAAE,IAAA,uBAAU,GAAE,CAAC,CAAA;AAC3C,yBAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;AAC3C,2BAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;kBA1CtD,eAAe"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import AbstractLslTest from './AbstractLslTest';
|
|
2
|
+
export default class EventMarkerOutletTest extends AbstractLslTest {
|
|
3
|
+
private static instance;
|
|
4
|
+
protected static beforeEach(): Promise<void>;
|
|
5
|
+
protected static loadsWithEventMarkerSpecificOptions(): Promise<void>;
|
|
6
|
+
protected static canOverrideDefaultOptions(): Promise<void>;
|
|
7
|
+
protected static pushingSingleMarkerIncrementsHitCountAndWaitTime(): Promise<void>;
|
|
8
|
+
protected static pushingTwoMarkersIncrementsHitCountAndWaitTimeTwice(): Promise<void>;
|
|
9
|
+
protected static canStopEventMarkersMidPush(bailIdx: number): Promise<void>;
|
|
10
|
+
protected static canStartAgainAfterStopping(): Promise<void>;
|
|
11
|
+
protected static doesNotWaitIfStopped(): Promise<void>;
|
|
12
|
+
protected static clearsTheTimeoutOnStop(): Promise<void>;
|
|
13
|
+
private static get lslOutlet();
|
|
14
|
+
private static setupOutlet;
|
|
15
|
+
private static pushTotalMarkers;
|
|
16
|
+
private static generateDurationMarker;
|
|
17
|
+
private static EventMarkerOutlet;
|
|
18
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const crypto_1 = require("crypto");
|
|
13
|
+
const test_utils_1 = require("@sprucelabs/test-utils");
|
|
14
|
+
const EventMarkerOutlet_1 = __importDefault(require("../components/EventMarkerOutlet"));
|
|
15
|
+
const generateRandomOutletOptions_1 = __importDefault(require("../testDoubles/generateRandomOutletOptions"));
|
|
16
|
+
const FakeLslOutlet_1 = __importDefault(require("../testDoubles/LslOutlet/FakeLslOutlet"));
|
|
17
|
+
const AbstractLslTest_1 = __importDefault(require("./AbstractLslTest"));
|
|
18
|
+
class EventMarkerOutletTest extends AbstractLslTest_1.default {
|
|
19
|
+
static async beforeEach() {
|
|
20
|
+
await super.beforeEach();
|
|
21
|
+
this.setFakeLiblsl();
|
|
22
|
+
this.setFakeLslOutlet();
|
|
23
|
+
this.setSpyMarkerOutlet();
|
|
24
|
+
this.instance = await this.EventMarkerOutlet();
|
|
25
|
+
}
|
|
26
|
+
static async loadsWithEventMarkerSpecificOptions() {
|
|
27
|
+
test_utils_1.assert.isEqualDeep(FakeLslOutlet_1.default.callsToConstructor[0].options, {
|
|
28
|
+
name: 'Event markers',
|
|
29
|
+
type: 'Markers',
|
|
30
|
+
channelNames: ['Markers'],
|
|
31
|
+
sampleRate: 0,
|
|
32
|
+
channelFormat: 'string',
|
|
33
|
+
sourceId: 'event-markers',
|
|
34
|
+
manufacturer: 'N/A',
|
|
35
|
+
unit: 'N/A',
|
|
36
|
+
chunkSize: 0,
|
|
37
|
+
maxBuffered: 0,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
static async canOverrideDefaultOptions() {
|
|
41
|
+
const options = (0, generateRandomOutletOptions_1.default)();
|
|
42
|
+
await this.EventMarkerOutlet(options);
|
|
43
|
+
test_utils_1.assert.isEqualDeep(FakeLslOutlet_1.default.callsToConstructor[1].options, options);
|
|
44
|
+
}
|
|
45
|
+
static async pushingSingleMarkerIncrementsHitCountAndWaitTime() {
|
|
46
|
+
const markers = [this.generateDurationMarker()];
|
|
47
|
+
await this.instance.pushMarkers(markers);
|
|
48
|
+
const marker = markers[0];
|
|
49
|
+
test_utils_1.assert.isEqual(FakeLslOutlet_1.default.callsToPushSample[0][0], marker.name, 'Pushed the wrong marker!');
|
|
50
|
+
test_utils_1.assert.isEqual(this.instance.totalWaitTimeMs, marker.durationMs);
|
|
51
|
+
}
|
|
52
|
+
static async pushingTwoMarkersIncrementsHitCountAndWaitTimeTwice() {
|
|
53
|
+
const markers = await this.pushTotalMarkers(2);
|
|
54
|
+
test_utils_1.assert.isEqual(FakeLslOutlet_1.default.callsToPushSample.length, 2);
|
|
55
|
+
test_utils_1.assert.isEqual(this.instance.totalWaitTimeMs, markers[0].durationMs + markers[1].durationMs);
|
|
56
|
+
}
|
|
57
|
+
static async canStopEventMarkersMidPush(bailIdx) {
|
|
58
|
+
let hitCount = 0;
|
|
59
|
+
const outlet = this.instance.getLslOutlet();
|
|
60
|
+
outlet.pushSample = () => {
|
|
61
|
+
hitCount += 1;
|
|
62
|
+
if (hitCount === bailIdx) {
|
|
63
|
+
this.instance.stop();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
await this.pushTotalMarkers(10);
|
|
67
|
+
test_utils_1.assert.isEqual(hitCount, bailIdx);
|
|
68
|
+
}
|
|
69
|
+
static async canStartAgainAfterStopping() {
|
|
70
|
+
this.instance.stop();
|
|
71
|
+
let hitCount = 0;
|
|
72
|
+
const outlet = this.instance.getLslOutlet();
|
|
73
|
+
outlet.pushSample = () => {
|
|
74
|
+
hitCount++;
|
|
75
|
+
};
|
|
76
|
+
await this.pushTotalMarkers(10);
|
|
77
|
+
test_utils_1.assert.isEqual(hitCount, 10);
|
|
78
|
+
}
|
|
79
|
+
static async doesNotWaitIfStopped() {
|
|
80
|
+
await this.setupOutlet();
|
|
81
|
+
const startMs = Date.now();
|
|
82
|
+
const promise = this.pushTotalMarkers(2, 1000);
|
|
83
|
+
this.instance.stop();
|
|
84
|
+
await promise;
|
|
85
|
+
const endMs = Date.now();
|
|
86
|
+
test_utils_1.assert.isBelow(endMs - startMs, 10);
|
|
87
|
+
}
|
|
88
|
+
static async clearsTheTimeoutOnStop() {
|
|
89
|
+
void this.pushTotalMarkers(2, 100);
|
|
90
|
+
this.instance.stop();
|
|
91
|
+
this.lslOutlet.pushSample = () => test_utils_1.assert.fail('Should not have been called');
|
|
92
|
+
}
|
|
93
|
+
static get lslOutlet() {
|
|
94
|
+
return this.instance.getLslOutlet();
|
|
95
|
+
}
|
|
96
|
+
static async setupOutlet() {
|
|
97
|
+
EventMarkerOutlet_1.default.Class = EventMarkerOutlet_1.default;
|
|
98
|
+
this.instance = await this.EventMarkerOutlet();
|
|
99
|
+
}
|
|
100
|
+
static async pushTotalMarkers(total, durationMs) {
|
|
101
|
+
const markers = new Array(total)
|
|
102
|
+
.fill(null)
|
|
103
|
+
.map(() => this.generateDurationMarker(durationMs));
|
|
104
|
+
await this.instance.pushMarkers(markers);
|
|
105
|
+
return markers;
|
|
106
|
+
}
|
|
107
|
+
static generateDurationMarker(durationMs) {
|
|
108
|
+
return {
|
|
109
|
+
name: (0, test_utils_1.generateId)(),
|
|
110
|
+
durationMs: durationMs ?? (0, crypto_1.randomInt)(100, 1000),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
static async EventMarkerOutlet(options) {
|
|
114
|
+
return (await EventMarkerOutlet_1.default.Create(options));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.default = EventMarkerOutletTest;
|
|
118
|
+
__decorate([
|
|
119
|
+
(0, test_utils_1.test)()
|
|
120
|
+
], EventMarkerOutletTest, "loadsWithEventMarkerSpecificOptions", null);
|
|
121
|
+
__decorate([
|
|
122
|
+
(0, test_utils_1.test)()
|
|
123
|
+
], EventMarkerOutletTest, "canOverrideDefaultOptions", null);
|
|
124
|
+
__decorate([
|
|
125
|
+
(0, test_utils_1.test)()
|
|
126
|
+
], EventMarkerOutletTest, "pushingSingleMarkerIncrementsHitCountAndWaitTime", null);
|
|
127
|
+
__decorate([
|
|
128
|
+
(0, test_utils_1.test)()
|
|
129
|
+
], EventMarkerOutletTest, "pushingTwoMarkersIncrementsHitCountAndWaitTimeTwice", null);
|
|
130
|
+
__decorate([
|
|
131
|
+
(0, test_utils_1.test)('can stop on the first marker', 1),
|
|
132
|
+
(0, test_utils_1.test)('can stop on the second marker', 2),
|
|
133
|
+
(0, test_utils_1.test)('can stop on the third marker', 3)
|
|
134
|
+
], EventMarkerOutletTest, "canStopEventMarkersMidPush", null);
|
|
135
|
+
__decorate([
|
|
136
|
+
(0, test_utils_1.test)()
|
|
137
|
+
], EventMarkerOutletTest, "canStartAgainAfterStopping", null);
|
|
138
|
+
__decorate([
|
|
139
|
+
(0, test_utils_1.test)()
|
|
140
|
+
], EventMarkerOutletTest, "doesNotWaitIfStopped", null);
|
|
141
|
+
__decorate([
|
|
142
|
+
(0, test_utils_1.test)()
|
|
143
|
+
], EventMarkerOutletTest, "clearsTheTimeoutOnStop", null);
|
|
144
|
+
//# sourceMappingURL=EventMarkerOutlet.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventMarkerOutlet.test.js","sourceRoot":"","sources":["../../src/__tests__/EventMarkerOutlet.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
export default class
|
|
1
|
+
import AbstractLslTest from './AbstractLslTest';
|
|
2
|
+
export default class LiblslAdapterTest extends AbstractLslTest {
|
|
3
3
|
private static lsl;
|
|
4
4
|
private static libraryPath?;
|
|
5
5
|
private static libraryOptions?;
|
|
@@ -1,52 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
2
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
3
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
4
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
5
|
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;
|
|
22
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
7
|
};
|
|
24
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
-
var ownKeys = function(o) {
|
|
26
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
8
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
42
9
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
43
10
|
};
|
|
44
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
12
|
const crypto_1 = require("crypto");
|
|
46
|
-
const test_utils_1 =
|
|
47
|
-
const
|
|
48
|
-
const FakeLiblsl_1 = __importDefault(require("../testDoubles/FakeLiblsl"));
|
|
49
|
-
|
|
13
|
+
const test_utils_1 = require("@sprucelabs/test-utils");
|
|
14
|
+
const LiblslAdapter_1 = __importDefault(require("../adapters/LiblslAdapter"));
|
|
15
|
+
const FakeLiblsl_1 = __importDefault(require("../testDoubles/Liblsl/FakeLiblsl"));
|
|
16
|
+
const AbstractLslTest_1 = __importDefault(require("./AbstractLslTest"));
|
|
17
|
+
class LiblslAdapterTest extends AbstractLslTest_1.default {
|
|
50
18
|
static async beforeEach() {
|
|
51
19
|
await super.beforeEach();
|
|
52
20
|
delete this.libraryPath;
|
|
@@ -70,23 +38,23 @@ class LiblslTest extends test_utils_1.default {
|
|
|
70
38
|
this.shouldThrowWhenCreatingBindings = false;
|
|
71
39
|
this.appendChildHitCount = 0;
|
|
72
40
|
delete this.ffiRsOpenOptions;
|
|
73
|
-
|
|
41
|
+
LiblslAdapter_1.default.ffiRsOpen = (options) => {
|
|
74
42
|
this.ffiRsOpenOptions = options;
|
|
75
43
|
};
|
|
76
|
-
|
|
44
|
+
LiblslAdapter_1.default.ffiRsDefine = (options) => {
|
|
77
45
|
this.ffiRsDefineOptions = options;
|
|
78
46
|
if (this.shouldThrowWhenCreatingBindings) {
|
|
79
47
|
throw new Error('Failed to create bindings!');
|
|
80
48
|
}
|
|
81
49
|
return this.fakeBindings;
|
|
82
50
|
};
|
|
83
|
-
|
|
84
|
-
this.lsl =
|
|
51
|
+
LiblslAdapter_1.default.resetInstance();
|
|
52
|
+
this.lsl = LiblslAdapter_1.default.getInstance();
|
|
85
53
|
}
|
|
86
54
|
static async throwsWhenBindingsFailToLoad() {
|
|
87
55
|
this.shouldThrowWhenCreatingBindings = true;
|
|
88
|
-
|
|
89
|
-
const err = test_utils_1.assert.doesThrow(() =>
|
|
56
|
+
LiblslAdapter_1.default.resetInstance();
|
|
57
|
+
const err = test_utils_1.assert.doesThrow(() => LiblslAdapter_1.default.getInstance());
|
|
90
58
|
test_utils_1.errorAssert.assertError(err, 'FAILED_TO_LOAD_LIBLSL', {
|
|
91
59
|
liblslPath: process.env.LIBLSL_PATH,
|
|
92
60
|
});
|
|
@@ -141,17 +109,17 @@ class LiblslTest extends test_utils_1.default {
|
|
|
141
109
|
});
|
|
142
110
|
}
|
|
143
111
|
static async worksAsASingleton() {
|
|
144
|
-
const liblsl =
|
|
112
|
+
const liblsl = LiblslAdapter_1.default.getInstance();
|
|
145
113
|
//@ts-ignore
|
|
146
|
-
test_utils_1.assert.isInstanceOf(liblsl,
|
|
114
|
+
test_utils_1.assert.isInstanceOf(liblsl, LiblslAdapter_1.default);
|
|
147
115
|
}
|
|
148
116
|
static async singletonIsTheSame() {
|
|
149
|
-
test_utils_1.assert.isEqual(
|
|
117
|
+
test_utils_1.assert.isEqual(LiblslAdapter_1.default.getInstance(), LiblslAdapter_1.default.getInstance());
|
|
150
118
|
}
|
|
151
119
|
static canSetInstance() {
|
|
152
120
|
const fake = new FakeLiblsl_1.default();
|
|
153
|
-
|
|
154
|
-
test_utils_1.assert.isEqual(
|
|
121
|
+
LiblslAdapter_1.default.setInstance(fake);
|
|
122
|
+
test_utils_1.assert.isEqual(LiblslAdapter_1.default.getInstance(), fake);
|
|
155
123
|
}
|
|
156
124
|
static async createsExpectedBindingsWithFfiRs() {
|
|
157
125
|
test_utils_1.assert.isEqualDeep(this.ffiRsDefineOptions, {
|
|
@@ -327,8 +295,8 @@ class LiblslTest extends test_utils_1.default {
|
|
|
327
295
|
}
|
|
328
296
|
static async defaultsToMacOsPath() {
|
|
329
297
|
delete process.env.LIBLSL_PATH;
|
|
330
|
-
|
|
331
|
-
this.lsl =
|
|
298
|
+
LiblslAdapter_1.default.resetInstance();
|
|
299
|
+
this.lsl = LiblslAdapter_1.default.getInstance();
|
|
332
300
|
test_utils_1.assert.isEqual(this.ffiRsOpenOptions?.path, '/opt/homebrew/Cellar/lsl/1.16.2/lib/liblsl.1.16.2.dylib');
|
|
333
301
|
}
|
|
334
302
|
static async canCreateInletWithRequiredParams() {
|
|
@@ -423,72 +391,72 @@ class LiblslTest extends test_utils_1.default {
|
|
|
423
391
|
};
|
|
424
392
|
}
|
|
425
393
|
}
|
|
426
|
-
|
|
427
|
-
exports.default =
|
|
394
|
+
LiblslAdapterTest.appendChildParams = [];
|
|
395
|
+
exports.default = LiblslAdapterTest;
|
|
428
396
|
__decorate([
|
|
429
397
|
(0, test_utils_1.test)()
|
|
430
|
-
],
|
|
398
|
+
], LiblslAdapterTest, "throwsWhenBindingsFailToLoad", null);
|
|
431
399
|
__decorate([
|
|
432
400
|
(0, test_utils_1.test)()
|
|
433
|
-
],
|
|
401
|
+
], LiblslAdapterTest, "callsOpenOnFfiRs", null);
|
|
434
402
|
__decorate([
|
|
435
403
|
(0, test_utils_1.test)()
|
|
436
|
-
],
|
|
404
|
+
], LiblslAdapterTest, "throwsWhenCreateStreamInfoIsMissingRequiredParams", null);
|
|
437
405
|
__decorate([
|
|
438
406
|
(0, test_utils_1.test)()
|
|
439
|
-
],
|
|
407
|
+
], LiblslAdapterTest, "throwsWhenAppendChannelsIsMissingRequiredParams", null);
|
|
440
408
|
__decorate([
|
|
441
409
|
(0, test_utils_1.test)()
|
|
442
|
-
],
|
|
410
|
+
], LiblslAdapterTest, "throwsWhenCreateOutletIsMissingRequiredParams", null);
|
|
443
411
|
__decorate([
|
|
444
412
|
(0, test_utils_1.test)()
|
|
445
|
-
],
|
|
413
|
+
], LiblslAdapterTest, "throwsWhenPushSampleFloatTimestampIsMissingRequiredParams", null);
|
|
446
414
|
__decorate([
|
|
447
415
|
(0, test_utils_1.test)()
|
|
448
|
-
],
|
|
416
|
+
], LiblslAdapterTest, "throwsWhenPushSampleStringTimestampIsMissingRequiredParams", null);
|
|
449
417
|
__decorate([
|
|
450
418
|
(0, test_utils_1.test)()
|
|
451
|
-
],
|
|
419
|
+
], LiblslAdapterTest, "worksAsASingleton", null);
|
|
452
420
|
__decorate([
|
|
453
421
|
(0, test_utils_1.test)()
|
|
454
|
-
],
|
|
422
|
+
], LiblslAdapterTest, "singletonIsTheSame", null);
|
|
455
423
|
__decorate([
|
|
456
424
|
(0, test_utils_1.test)()
|
|
457
|
-
],
|
|
425
|
+
], LiblslAdapterTest, "canSetInstance", null);
|
|
458
426
|
__decorate([
|
|
459
427
|
(0, test_utils_1.test)()
|
|
460
|
-
],
|
|
428
|
+
], LiblslAdapterTest, "createsExpectedBindingsWithFfiRs", null);
|
|
461
429
|
__decorate([
|
|
462
430
|
(0, test_utils_1.test)()
|
|
463
|
-
],
|
|
431
|
+
], LiblslAdapterTest, "canCreateStreamInfoWithRequiredParams", null);
|
|
464
432
|
__decorate([
|
|
465
433
|
(0, test_utils_1.test)()
|
|
466
|
-
],
|
|
434
|
+
], LiblslAdapterTest, "canCreateOutletWithRequiredParams", null);
|
|
467
435
|
__decorate([
|
|
468
436
|
(0, test_utils_1.test)()
|
|
469
|
-
],
|
|
437
|
+
], LiblslAdapterTest, "canPushFloatSample", null);
|
|
470
438
|
__decorate([
|
|
471
439
|
(0, test_utils_1.test)()
|
|
472
|
-
],
|
|
440
|
+
], LiblslAdapterTest, "canPushStringSample", null);
|
|
473
441
|
__decorate([
|
|
474
442
|
(0, test_utils_1.test)()
|
|
475
|
-
],
|
|
443
|
+
], LiblslAdapterTest, "addingSingleChannelGetsDescription", null);
|
|
476
444
|
__decorate([
|
|
477
445
|
(0, test_utils_1.test)()
|
|
478
|
-
],
|
|
446
|
+
], LiblslAdapterTest, "addingMultpleChannelsAddsChildrenToChannelsChild", null);
|
|
479
447
|
__decorate([
|
|
480
448
|
(0, test_utils_1.test)()
|
|
481
|
-
],
|
|
449
|
+
], LiblslAdapterTest, "canDestroyOutlet", null);
|
|
482
450
|
__decorate([
|
|
483
451
|
(0, test_utils_1.test)()
|
|
484
|
-
],
|
|
452
|
+
], LiblslAdapterTest, "callingLocalClockTwiceReturnsDifferentTimestamps", null);
|
|
485
453
|
__decorate([
|
|
486
454
|
(0, test_utils_1.test)()
|
|
487
|
-
],
|
|
455
|
+
], LiblslAdapterTest, "localClockBindingReceivesEmptyArray", null);
|
|
488
456
|
__decorate([
|
|
489
457
|
(0, test_utils_1.test)()
|
|
490
|
-
],
|
|
458
|
+
], LiblslAdapterTest, "defaultsToMacOsPath", null);
|
|
491
459
|
__decorate([
|
|
492
460
|
(0, test_utils_1.test)()
|
|
493
|
-
],
|
|
494
|
-
//# sourceMappingURL=
|
|
461
|
+
], LiblslAdapterTest, "canCreateInletWithRequiredParams", null);
|
|
462
|
+
//# sourceMappingURL=LiblslAdapter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiblslAdapter.test.js","sourceRoot":"","sources":["../../src/__tests__/LiblslAdapter.test.ts"],"names":[],"mappings":"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"}
|