motion-master-client 0.0.21 → 0.0.22
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/.babelrc +3 -0
- package/.eslintrc.json +18 -0
- package/jest.config.ts +16 -0
- package/motion-master.proto +1822 -0
- package/package.json +2 -17
- package/project.json +45 -0
- package/src/lib/cia402.spec.ts +77 -0
- package/src/lib/cia402.ts +414 -0
- package/src/lib/config-file.spec.ts +114 -0
- package/src/lib/config-file.ts +63 -0
- package/src/lib/device-log-line.ts +5 -0
- package/src/lib/device-parameter.spec.ts +85 -0
- package/src/lib/device-parameter.ts +79 -0
- package/src/lib/device.ts +10 -0
- package/src/lib/hardware-description.spec.ts +253 -0
- package/src/lib/hardware-description.ts +129 -0
- package/src/lib/logger.ts +5 -0
- package/src/lib/monitoring-config.ts +6 -0
- package/src/lib/{monitoring-entry.d.ts → monitoring-entry.ts} +5 -4
- package/src/lib/motion-master-client.ts +221 -0
- package/src/lib/motion-master-pub-sub-client.ts +95 -0
- package/src/lib/motion-master-pub-sub-socket.ts +40 -0
- package/src/lib/motion-master-pub-sub-web-socket.ts +78 -0
- package/src/lib/motion-master-pub-sub-worker-socket.ts +51 -0
- package/src/lib/motion-master-req-res-client.spec.ts +740 -0
- package/src/lib/motion-master-req-res-client.ts +2120 -0
- package/src/lib/motion-master-req-res-socket.ts +62 -0
- package/src/lib/motion-master-req-res-web-socket.ts +124 -0
- package/src/lib/motion-master-req-res-worker-socket.ts +87 -0
- package/src/lib/motion-master.proto.js +2 -2
- package/src/lib/operators.ts +90 -0
- package/src/lib/options.ts +12 -0
- package/src/lib/parameter.spec.ts +160 -0
- package/src/lib/parameter.ts +170 -0
- package/src/lib/product-id-range.ts +8 -0
- package/src/lib/request-status-resolver.ts +403 -0
- package/src/lib/system-log-line.ts +9 -0
- package/src/lib/{types.d.ts → types.ts} +74 -143
- package/src/lib/urls.ts +6 -0
- package/src/lib/util.ts +305 -0
- package/tsconfig.json +23 -0
- package/tsconfig.lib.json +10 -0
- package/tsconfig.spec.json +20 -0
- package/typedoc.json +10 -0
- package/src/index.js +0 -29
- package/src/index.js.map +0 -1
- package/src/lib/cia402.d.ts +0 -182
- package/src/lib/cia402.js +0 -392
- package/src/lib/cia402.js.map +0 -1
- package/src/lib/config-file.d.ts +0 -13
- package/src/lib/config-file.js +0 -50
- package/src/lib/config-file.js.map +0 -1
- package/src/lib/device-log-line.d.ts +0 -5
- package/src/lib/device-log-line.js +0 -3
- package/src/lib/device-log-line.js.map +0 -1
- package/src/lib/device-parameter.d.ts +0 -56
- package/src/lib/device-parameter.js +0 -39
- package/src/lib/device-parameter.js.map +0 -1
- package/src/lib/device.d.ts +0 -9
- package/src/lib/device.js +0 -3
- package/src/lib/device.js.map +0 -1
- package/src/lib/hardware-description.d.ts +0 -41
- package/src/lib/hardware-description.js +0 -94
- package/src/lib/hardware-description.js.map +0 -1
- package/src/lib/logger.d.ts +0 -1
- package/src/lib/logger.js +0 -8
- package/src/lib/logger.js.map +0 -1
- package/src/lib/monitoring-config.d.ts +0 -6
- package/src/lib/monitoring-config.js +0 -3
- package/src/lib/monitoring-config.js.map +0 -1
- package/src/lib/monitoring-entry.js +0 -3
- package/src/lib/monitoring-entry.js.map +0 -1
- package/src/lib/motion-master-client.d.ts +0 -52
- package/src/lib/motion-master-client.js +0 -151
- package/src/lib/motion-master-client.js.map +0 -1
- package/src/lib/motion-master-pub-sub-client.d.ts +0 -16
- package/src/lib/motion-master-pub-sub-client.js +0 -68
- package/src/lib/motion-master-pub-sub-client.js.map +0 -1
- package/src/lib/motion-master-pub-sub-socket.d.ts +0 -34
- package/src/lib/motion-master-pub-sub-socket.js +0 -3
- package/src/lib/motion-master-pub-sub-socket.js.map +0 -1
- package/src/lib/motion-master-pub-sub-web-socket.d.ts +0 -14
- package/src/lib/motion-master-pub-sub-web-socket.js +0 -67
- package/src/lib/motion-master-pub-sub-web-socket.js.map +0 -1
- package/src/lib/motion-master-pub-sub-worker-socket.d.ts +0 -14
- package/src/lib/motion-master-pub-sub-worker-socket.js +0 -42
- package/src/lib/motion-master-pub-sub-worker-socket.js.map +0 -1
- package/src/lib/motion-master-req-res-client.d.ts +0 -920
- package/src/lib/motion-master-req-res-client.js +0 -1680
- package/src/lib/motion-master-req-res-client.js.map +0 -1
- package/src/lib/motion-master-req-res-socket.d.ts +0 -52
- package/src/lib/motion-master-req-res-socket.js +0 -3
- package/src/lib/motion-master-req-res-socket.js.map +0 -1
- package/src/lib/motion-master-req-res-web-socket.d.ts +0 -24
- package/src/lib/motion-master-req-res-web-socket.js +0 -99
- package/src/lib/motion-master-req-res-web-socket.js.map +0 -1
- package/src/lib/motion-master-req-res-worker-socket.d.ts +0 -20
- package/src/lib/motion-master-req-res-worker-socket.js +0 -69
- package/src/lib/motion-master-req-res-worker-socket.js.map +0 -1
- package/src/lib/operators.d.ts +0 -18
- package/src/lib/operators.js +0 -76
- package/src/lib/operators.js.map +0 -1
- package/src/lib/options.d.ts +0 -10
- package/src/lib/options.js +0 -14
- package/src/lib/options.js.map +0 -1
- package/src/lib/parameter.d.ts +0 -72
- package/src/lib/parameter.js +0 -119
- package/src/lib/parameter.js.map +0 -1
- package/src/lib/product-id-range.d.ts +0 -7
- package/src/lib/product-id-range.js +0 -12
- package/src/lib/product-id-range.js.map +0 -1
- package/src/lib/request-status-resolver.d.ts +0 -4
- package/src/lib/request-status-resolver.js +0 -345
- package/src/lib/request-status-resolver.js.map +0 -1
- package/src/lib/system-log-line.d.ts +0 -9
- package/src/lib/system-log-line.js +0 -3
- package/src/lib/system-log-line.js.map +0 -1
- package/src/lib/types.js +0 -28
- package/src/lib/types.js.map +0 -1
- package/src/lib/urls.d.ts +0 -3
- package/src/lib/urls.js +0 -10
- package/src/lib/urls.js.map +0 -1
- package/src/lib/util.d.ts +0 -40
- package/src/lib/util.js +0 -316
- package/src/lib/util.js.map +0 -1
- /package/src/{index.d.ts → index.ts} +0 -0
|
@@ -0,0 +1,740 @@
|
|
|
1
|
+
import { of } from "rxjs";
|
|
2
|
+
import { TestScheduler } from "rxjs/testing";
|
|
3
|
+
import { Device } from "./device";
|
|
4
|
+
import { MotionMasterReqResClient } from "./motion-master-req-res-client";
|
|
5
|
+
import { MotionMasterReqResSocket } from "./motion-master-req-res-socket";
|
|
6
|
+
|
|
7
|
+
// jest.setTimeout(10000);
|
|
8
|
+
|
|
9
|
+
describe('MotionMasterReqResClient', () => {
|
|
10
|
+
|
|
11
|
+
let request: MotionMasterReqResClient;
|
|
12
|
+
let scheduler: TestScheduler;
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
const socket = jest.fn() as unknown as MotionMasterReqResSocket;
|
|
16
|
+
socket.send = jest.fn();
|
|
17
|
+
request = new MotionMasterReqResClient(socket);
|
|
18
|
+
|
|
19
|
+
scheduler = new TestScheduler((actual, expected) => {
|
|
20
|
+
return expect(actual).toEqual(expected);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
afterEach(() => {
|
|
25
|
+
scheduler.flush();
|
|
26
|
+
jest.restoreAllMocks();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe('pingSystem', () => {
|
|
30
|
+
it('should send PingSystem request message and return EMPTY observable', () => {
|
|
31
|
+
scheduler.run(({ expectObservable }) => {
|
|
32
|
+
const result = request.pingSystem('pingSystemMessageId');
|
|
33
|
+
|
|
34
|
+
expect(request.socket.send).toBeCalledTimes(1);
|
|
35
|
+
expect(request.socket.send).toBeCalledWith({
|
|
36
|
+
id: 'pingSystemMessageId',
|
|
37
|
+
request: {
|
|
38
|
+
pingSystem: {},
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
expectObservable(result).toBe('|');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
describe('getSystemVersion', () => {
|
|
47
|
+
it('should send GetSystemVersion request message and return an observable of SystemVersion status', () => {
|
|
48
|
+
scheduler.run(({ hot, expectObservable }) => {
|
|
49
|
+
const message$ = hot('a', {
|
|
50
|
+
a: {
|
|
51
|
+
"id": "getSystemVersionMessageId",
|
|
52
|
+
"status": {
|
|
53
|
+
"systemVersion": {
|
|
54
|
+
"version": "4.8.4"
|
|
55
|
+
},
|
|
56
|
+
"type": "systemVersion"
|
|
57
|
+
},
|
|
58
|
+
"type": "status"
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
Object.defineProperty(request.socket, 'message$', { value: message$ });
|
|
62
|
+
|
|
63
|
+
const result = request.getSystemVersion(1000, 'getSystemVersionMessageId');
|
|
64
|
+
|
|
65
|
+
expect(request.socket.send).toBeCalledTimes(1);
|
|
66
|
+
expect(request.socket.send).toBeCalledWith({
|
|
67
|
+
id: 'getSystemVersionMessageId',
|
|
68
|
+
request: {
|
|
69
|
+
getSystemVersion: {},
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
expectObservable(result).toBe('(a|)', {
|
|
73
|
+
a: {
|
|
74
|
+
version: '4.8.4',
|
|
75
|
+
request: 'succeeded',
|
|
76
|
+
messageId: 'getSystemVersionMessageId'
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
describe('resolveDeviceAddress', () => {
|
|
84
|
+
const device: Device = {
|
|
85
|
+
"id": "9500-02-0008895-1950",
|
|
86
|
+
"deviceAddress": 3139914318,
|
|
87
|
+
"hardwareDescription": {
|
|
88
|
+
"fileVersion": "1.0.0",
|
|
89
|
+
"device": {
|
|
90
|
+
"macAddress": "40:49:8A:01:0d:75",
|
|
91
|
+
"serialNumber": "9500-02-0008895-1950",
|
|
92
|
+
"name": "SOMANET Servo Node 1000-D EtherCAT",
|
|
93
|
+
"id": "9500",
|
|
94
|
+
"version": "02",
|
|
95
|
+
"keyId": "2310",
|
|
96
|
+
"components": []
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
it('should throw an error if deviceRefObj is not valid', () => {
|
|
101
|
+
return scheduler.run(({ expectObservable }) => {
|
|
102
|
+
const result$ = request.resolveDeviceAddress({});
|
|
103
|
+
|
|
104
|
+
expectObservable(result$).toBe('#', null, new Error('Device ref object is not valid {}'));
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('should just return device address if deviceRefObj contains one', () => {
|
|
109
|
+
return scheduler.run(({ expectObservable }) => {
|
|
110
|
+
const result$ = request.resolveDeviceAddress({ deviceAddress: 3139914318 });
|
|
111
|
+
|
|
112
|
+
const getCachedDeviceByDeviceRefObj = jest.spyOn(request, 'getCachedDeviceByDeviceRefObj');
|
|
113
|
+
const getDevices = jest.spyOn(request, 'getDevices');
|
|
114
|
+
|
|
115
|
+
expectObservable(result$).toBe('(a|)', { a: 3139914318 });
|
|
116
|
+
expect(getCachedDeviceByDeviceRefObj).not.toBeCalled();
|
|
117
|
+
expect(getDevices).not.toBeCalled();
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
xit('should return device address by position from the cached devices without making request to get devices', () => {
|
|
122
|
+
return scheduler.run(async ({ expectObservable }) => {
|
|
123
|
+
request.deviceMap.set('9500-02-0008895-1950', { deviceAddress: 3139914318, id: '9500-02-0008895-1950' });
|
|
124
|
+
|
|
125
|
+
const getCachedDeviceByDeviceRefObj = jest.spyOn(request, 'getCachedDeviceByDeviceRefObj');
|
|
126
|
+
const getDevices = jest.spyOn(request, 'getDevices');
|
|
127
|
+
|
|
128
|
+
const result$ = request.resolveDeviceAddress({ devicePosition: 0 });
|
|
129
|
+
|
|
130
|
+
expectObservable(result$).toBe('(a|)', { a: 3139914318 });
|
|
131
|
+
expect(getCachedDeviceByDeviceRefObj).toBeCalledTimes(1);
|
|
132
|
+
expect(getDevices).not.toBeCalled();
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('should return device address by serial number from the cached devices without making request to get devices', () => {
|
|
137
|
+
return scheduler.run(async ({ expectObservable }) => {
|
|
138
|
+
request.deviceMap.set('9500-02-0008895-1950', { deviceAddress: 3139914318, id: '9500-02-0008895-1950' });
|
|
139
|
+
|
|
140
|
+
const getCachedDeviceByDeviceRefObj = jest.spyOn(request, 'getCachedDeviceByDeviceRefObj');
|
|
141
|
+
const getDevices = jest.spyOn(request, 'getDevices');
|
|
142
|
+
|
|
143
|
+
const result$ = request.resolveDeviceAddress({ deviceSerialNumber: '9500-02-0008895-1950' });
|
|
144
|
+
|
|
145
|
+
expectObservable(result$).toBe('(a|)', { a: 3139914318 });
|
|
146
|
+
expect(getCachedDeviceByDeviceRefObj).toBeCalledTimes(1);
|
|
147
|
+
expect(getDevices).not.toBeCalled();
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it('should update the cached devices and return device address by serial number', () => {
|
|
152
|
+
return scheduler.run(async ({ expectObservable }) => {
|
|
153
|
+
const getCachedDeviceByDeviceRefObj = jest.spyOn(request, 'getCachedDeviceByDeviceRefObj');
|
|
154
|
+
const getDevices = jest.spyOn(request, 'getDevices').mockReturnValue(of([device]));
|
|
155
|
+
|
|
156
|
+
const result$ = request.resolveDeviceAddress({ deviceSerialNumber: '9500-02-0008895-1950' });
|
|
157
|
+
|
|
158
|
+
expectObservable(result$).toBe('(a|)', { a: 3139914318 });
|
|
159
|
+
expect(getCachedDeviceByDeviceRefObj).toBeCalledTimes(1);
|
|
160
|
+
expect(getDevices).toBeCalledTimes(1);
|
|
161
|
+
|
|
162
|
+
result$.subscribe(() => {
|
|
163
|
+
expect(request.deviceMap.size).toBe(1);
|
|
164
|
+
expect(request.deviceMap.values().next().value).toBe(device);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('should update the cached devices and throw an error when device address is not found by serial number', () => {
|
|
170
|
+
return scheduler.run(async ({ expectObservable }) => {
|
|
171
|
+
const getCachedDeviceByDeviceRefObj = jest.spyOn(request, 'getCachedDeviceByDeviceRefObj');
|
|
172
|
+
const getDevices = jest.spyOn(request, 'getDevices').mockReturnValue(of([device]));
|
|
173
|
+
|
|
174
|
+
const result$ = request.resolveDeviceAddress({ deviceSerialNumber: 'invalid-serial-number' });
|
|
175
|
+
|
|
176
|
+
expectObservable(result$).toBe('#', null, new Error('Device is not found by deviceRefObj {"deviceSerialNumber":"invalid-serial-number"}'));
|
|
177
|
+
expect(getDevices).toBeCalledTimes(1);
|
|
178
|
+
|
|
179
|
+
result$.subscribe({
|
|
180
|
+
error: () => {
|
|
181
|
+
expect(getCachedDeviceByDeviceRefObj).toBeCalledTimes(2);
|
|
182
|
+
expect(request.deviceMap.size).toBe(1);
|
|
183
|
+
expect(request.deviceMap.values().next().value).toBe(device);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
xit('should update the cached devices and return device address by position', () => {
|
|
190
|
+
return scheduler.run(async ({ expectObservable }) => {
|
|
191
|
+
const getCachedDeviceByDeviceRefObj = jest.spyOn(request, 'getCachedDeviceByDeviceRefObj');
|
|
192
|
+
const getDevices = jest.spyOn(request, 'getDevices').mockReturnValue(of([device]));
|
|
193
|
+
|
|
194
|
+
const result$ = request.resolveDeviceAddress({ devicePosition: 0 });
|
|
195
|
+
|
|
196
|
+
expectObservable(result$).toBe('(a|)', { a: 3139914318 });
|
|
197
|
+
expect(getCachedDeviceByDeviceRefObj).toBeCalledTimes(1);
|
|
198
|
+
expect(getDevices).toBeCalledTimes(1);
|
|
199
|
+
|
|
200
|
+
result$.subscribe(() => {
|
|
201
|
+
expect(request.deviceMap.size).toBe(1);
|
|
202
|
+
expect(request.deviceMap.values().next().value).toBe(device);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it('should update the cached devices and throw an error when device address is not found by position', () => {
|
|
208
|
+
return scheduler.run(async ({ expectObservable }) => {
|
|
209
|
+
const getCachedDeviceByDeviceRefObj = jest.spyOn(request, 'getCachedDeviceByDeviceRefObj');
|
|
210
|
+
const getDevices = jest.spyOn(request, 'getDevices').mockReturnValue(of([device]));
|
|
211
|
+
|
|
212
|
+
const result$ = request.resolveDeviceAddress({ devicePosition: 54 });
|
|
213
|
+
|
|
214
|
+
expectObservable(result$).toBe('#', null, new Error('Device is not found by deviceRefObj {"devicePosition":54}'));
|
|
215
|
+
expect(getDevices).toBeCalledTimes(1);
|
|
216
|
+
|
|
217
|
+
result$.subscribe({
|
|
218
|
+
error: () => {
|
|
219
|
+
expect(getCachedDeviceByDeviceRefObj).toBeCalledTimes(2);
|
|
220
|
+
expect(request.deviceMap.size).toBe(1);
|
|
221
|
+
expect(request.deviceMap.values().next().value).toBe(device);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it('should clear the previously cached devices and return device address by serial number', () => {
|
|
228
|
+
return scheduler.run(async ({ expectObservable }) => {
|
|
229
|
+
request.deviceMap.set('invalid-serial-number', { deviceAddress: 1234567890, id: '9500-02-0008895-1950' });
|
|
230
|
+
|
|
231
|
+
const getCachedDeviceByDeviceRefObj = jest.spyOn(request, 'getCachedDeviceByDeviceRefObj');
|
|
232
|
+
const getDevices = jest.spyOn(request, 'getDevices').mockReturnValue(of([device]));
|
|
233
|
+
|
|
234
|
+
const result$ = request.resolveDeviceAddress({ deviceSerialNumber: '9500-02-0008895-1950' });
|
|
235
|
+
|
|
236
|
+
expectObservable(result$).toBe('(a|)', { a: 3139914318 });
|
|
237
|
+
expect(getCachedDeviceByDeviceRefObj).toBeCalledTimes(1);
|
|
238
|
+
expect(getDevices).toBeCalledTimes(1);
|
|
239
|
+
|
|
240
|
+
result$.subscribe(() => {
|
|
241
|
+
expect(request.deviceMap.size).toBe(1);
|
|
242
|
+
expect(request.deviceMap.values().next().value).toBe(device);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
describe('getParameterValue', () => {
|
|
249
|
+
it('should return number value for the provided device parameter id', () => {
|
|
250
|
+
return scheduler.run(async ({ hot, expectObservable }) => {
|
|
251
|
+
const message$ = hot('a', {
|
|
252
|
+
a: {
|
|
253
|
+
"id": "682f5065-92c0-4879-b22a-599e828f5907",
|
|
254
|
+
"status": {
|
|
255
|
+
"deviceParameterValues": {
|
|
256
|
+
"parameterValues": [
|
|
257
|
+
{
|
|
258
|
+
"index": 8240,
|
|
259
|
+
"subindex": 1,
|
|
260
|
+
"intValue": 62250,
|
|
261
|
+
"typeValue": "intValue",
|
|
262
|
+
"success": {
|
|
263
|
+
"code": 1,
|
|
264
|
+
"message": ""
|
|
265
|
+
},
|
|
266
|
+
"status": "success"
|
|
267
|
+
}
|
|
268
|
+
],
|
|
269
|
+
"deviceAddress": 3139914318,
|
|
270
|
+
"progress": null
|
|
271
|
+
},
|
|
272
|
+
"type": "deviceParameterValues"
|
|
273
|
+
},
|
|
274
|
+
"type": "status"
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
Object.defineProperty(request.socket, 'message$', { value: message$ });
|
|
278
|
+
|
|
279
|
+
const mock = jest.spyOn(request, 'resolveDeviceAddress');
|
|
280
|
+
mock.mockReturnValue(of(3139914318));
|
|
281
|
+
const getDeviceParameterValues = jest.spyOn(request, 'getDeviceParameterValues')
|
|
282
|
+
|
|
283
|
+
const result$ = request.getParameterValue('0x6072:00.9500-02-0008895-1950', false, 2000, '682f5065-92c0-4879-b22a-599e828f5907');
|
|
284
|
+
|
|
285
|
+
expectObservable(result$).toBe('(a|)', { a: 62250 });
|
|
286
|
+
result$.subscribe(() => {
|
|
287
|
+
expect(getDeviceParameterValues).toBeCalledWith({
|
|
288
|
+
"deviceSerialNumber": "9500-02-0008895-1950",
|
|
289
|
+
"parameters": [{ "index": 24690, "loadFromCache": false, "subindex": 0 }],
|
|
290
|
+
}, 2000, "682f5065-92c0-4879-b22a-599e828f5907")
|
|
291
|
+
})
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
it('should return number value for the provided device address, index, and subindex', () => {
|
|
296
|
+
return scheduler.run(async ({ hot, expectObservable }) => {
|
|
297
|
+
const message$ = hot('a', {
|
|
298
|
+
a: {
|
|
299
|
+
"id": "682f5065-92c0-4879-b22a-599e828f5907",
|
|
300
|
+
"status": {
|
|
301
|
+
"deviceParameterValues": {
|
|
302
|
+
"parameterValues": [
|
|
303
|
+
{
|
|
304
|
+
"index": 8240,
|
|
305
|
+
"subindex": 1,
|
|
306
|
+
"intValue": 62250,
|
|
307
|
+
"typeValue": "intValue",
|
|
308
|
+
"success": {
|
|
309
|
+
"code": 1,
|
|
310
|
+
"message": ""
|
|
311
|
+
},
|
|
312
|
+
"status": "success"
|
|
313
|
+
}
|
|
314
|
+
],
|
|
315
|
+
"deviceAddress": 3139914318,
|
|
316
|
+
"progress": null
|
|
317
|
+
},
|
|
318
|
+
"type": "deviceParameterValues"
|
|
319
|
+
},
|
|
320
|
+
"type": "status"
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
Object.defineProperty(request.socket, 'message$', { value: message$ });
|
|
324
|
+
|
|
325
|
+
const mock = jest.spyOn(request, 'resolveDeviceAddress');
|
|
326
|
+
mock.mockReturnValue(of(3139914318));
|
|
327
|
+
|
|
328
|
+
const result = request.getParameterValue(3139914318, 0x6072, 0, false, 2000, '682f5065-92c0-4879-b22a-599e828f5907');
|
|
329
|
+
|
|
330
|
+
expectObservable(result).toBe('(a|)', { a: 62250 });
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
it('should return string value for the provided device parameter id', () => {
|
|
335
|
+
return scheduler.run(async ({ hot, expectObservable }) => {
|
|
336
|
+
const message$ = hot('a', {
|
|
337
|
+
a: {
|
|
338
|
+
"id": "682f5065-92c0-4879-b22a-599e828f5907",
|
|
339
|
+
"status": {
|
|
340
|
+
"deviceParameterValues": {
|
|
341
|
+
"parameterValues": [
|
|
342
|
+
{
|
|
343
|
+
"index": 4106,
|
|
344
|
+
"subindex": 0,
|
|
345
|
+
"stringValue": 'v5.0.6',
|
|
346
|
+
"typeValue": "stringValue",
|
|
347
|
+
"success": {
|
|
348
|
+
"code": 1,
|
|
349
|
+
"message": ""
|
|
350
|
+
},
|
|
351
|
+
"status": "success"
|
|
352
|
+
}
|
|
353
|
+
],
|
|
354
|
+
"deviceAddress": 3139914318,
|
|
355
|
+
"progress": null
|
|
356
|
+
},
|
|
357
|
+
"type": "deviceParameterValues"
|
|
358
|
+
},
|
|
359
|
+
"type": "status"
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
Object.defineProperty(request.socket, 'message$', { value: message$ });
|
|
363
|
+
|
|
364
|
+
const mock = jest.spyOn(request, 'resolveDeviceAddress');
|
|
365
|
+
mock.mockReturnValue(of(3139914318));
|
|
366
|
+
|
|
367
|
+
const result = request.getParameterValue<string>('0x100A:00.9500-02-0008895-1950', false, 2000, '682f5065-92c0-4879-b22a-599e828f5907');
|
|
368
|
+
|
|
369
|
+
expectObservable(result).toBe('(a|)', { a: 'v5.0.6' });
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
it('should return string value for the provided device address, index and subindex', () => {
|
|
374
|
+
return scheduler.run(async ({ hot, expectObservable }) => {
|
|
375
|
+
const message$ = hot('a', {
|
|
376
|
+
a: {
|
|
377
|
+
"id": "682f5065-92c0-4879-b22a-599e828f5907",
|
|
378
|
+
"status": {
|
|
379
|
+
"deviceParameterValues": {
|
|
380
|
+
"parameterValues": [
|
|
381
|
+
{
|
|
382
|
+
"index": 4106,
|
|
383
|
+
"subindex": 0,
|
|
384
|
+
"stringValue": 'v5.0.6',
|
|
385
|
+
"typeValue": "stringValue",
|
|
386
|
+
"success": {
|
|
387
|
+
"code": 1,
|
|
388
|
+
"message": ""
|
|
389
|
+
},
|
|
390
|
+
"status": "success"
|
|
391
|
+
}
|
|
392
|
+
],
|
|
393
|
+
"deviceAddress": 3139914318,
|
|
394
|
+
"progress": null
|
|
395
|
+
},
|
|
396
|
+
"type": "deviceParameterValues"
|
|
397
|
+
},
|
|
398
|
+
"type": "status"
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
Object.defineProperty(request.socket, 'message$', { value: message$ });
|
|
402
|
+
|
|
403
|
+
const mock = jest.spyOn(request, 'resolveDeviceAddress');
|
|
404
|
+
mock.mockReturnValue(of(3139914318));
|
|
405
|
+
|
|
406
|
+
const result = request.getParameterValue<string>(3139914318, 0x100A, 0x0, false, 2000, '682f5065-92c0-4879-b22a-599e828f5907');
|
|
407
|
+
|
|
408
|
+
expectObservable(result).toBe('(a|)', { a: 'v5.0.6' });
|
|
409
|
+
});
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
it('should throw an error if device parameter does not exist', () => {
|
|
413
|
+
return scheduler.run(async ({ hot, expectObservable }) => {
|
|
414
|
+
const message$ = hot('a', {
|
|
415
|
+
a: {
|
|
416
|
+
"id": "682f5065-92c0-4879-b22a-599e828f5907",
|
|
417
|
+
"status": {
|
|
418
|
+
"deviceParameterValues": {
|
|
419
|
+
"parameterValues": [
|
|
420
|
+
{
|
|
421
|
+
"index": 4660,
|
|
422
|
+
"subindex": 1,
|
|
423
|
+
"error": {
|
|
424
|
+
"code": 1,
|
|
425
|
+
"message": ""
|
|
426
|
+
},
|
|
427
|
+
"status": "error"
|
|
428
|
+
}
|
|
429
|
+
],
|
|
430
|
+
"deviceAddress": 3856364449,
|
|
431
|
+
"progress": null
|
|
432
|
+
},
|
|
433
|
+
"type": "deviceParameterValues"
|
|
434
|
+
},
|
|
435
|
+
"type": "status"
|
|
436
|
+
}
|
|
437
|
+
});
|
|
438
|
+
Object.defineProperty(request.socket, 'message$', { value: message$ });
|
|
439
|
+
|
|
440
|
+
const mock = jest.spyOn(request, 'resolveDeviceAddress');
|
|
441
|
+
mock.mockReturnValue(of(3139914318));
|
|
442
|
+
|
|
443
|
+
const result$ = request.getParameterValue<string>(3139914318, 0x100A, 0x0, false, 2000, '682f5065-92c0-4879-b22a-599e828f5907');
|
|
444
|
+
|
|
445
|
+
expectObservable(result$).toBe('#', null, new Error('Failed to get parameter value (NOT_FOUND) for {"deviceAddress":3139914318,"index":4106,"subindex":0,"loadFromCache":false,"requestTimeout":2000,"messageId":"682f5065-92c0-4879-b22a-599e828f5907"}'));
|
|
446
|
+
});
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
it('should throw an error if request times out', () => {
|
|
450
|
+
return scheduler.run(async ({ hot }) => {
|
|
451
|
+
const message$ = hot('a', {
|
|
452
|
+
a: {
|
|
453
|
+
"id": "i-will-timeout",
|
|
454
|
+
"status": {
|
|
455
|
+
"deviceParameterValues": {
|
|
456
|
+
"parameterValues": [
|
|
457
|
+
{
|
|
458
|
+
"index": 4660,
|
|
459
|
+
"subindex": 1,
|
|
460
|
+
"error": {
|
|
461
|
+
"code": 1,
|
|
462
|
+
"message": ""
|
|
463
|
+
},
|
|
464
|
+
"status": "error"
|
|
465
|
+
}
|
|
466
|
+
],
|
|
467
|
+
"deviceAddress": 3856364449,
|
|
468
|
+
"progress": null
|
|
469
|
+
},
|
|
470
|
+
"type": "deviceParameterValues"
|
|
471
|
+
},
|
|
472
|
+
"type": "status"
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
Object.defineProperty(request.socket, 'message$', { value: message$ });
|
|
476
|
+
|
|
477
|
+
const mock = jest.spyOn(request, 'resolveDeviceAddress');
|
|
478
|
+
mock.mockReturnValue(of(3139914318));
|
|
479
|
+
|
|
480
|
+
const result$ = request.getParameterValue<string>(3139914318, 0x100A, 0x0, false, 2000, '682f5065-92c0-4879-b22a-599e828f5907');
|
|
481
|
+
|
|
482
|
+
result$.subscribe({
|
|
483
|
+
error: (err) => {
|
|
484
|
+
expect(err.message).toBe('Timeout has occurred');
|
|
485
|
+
},
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
describe('getParameterValues', () => {
|
|
492
|
+
// it('should return an Observable of empty array if the props are empty', async () => {
|
|
493
|
+
// const values = await lastValueFrom(reqResClient.getParameterValues([]));
|
|
494
|
+
|
|
495
|
+
// expect(values).toEqual([]);
|
|
496
|
+
|
|
497
|
+
// expect(reqResClient.socket.send).not.toBeCalled();
|
|
498
|
+
// });
|
|
499
|
+
|
|
500
|
+
it('should return an array of values for the provided device parameter ids', () => {
|
|
501
|
+
return scheduler.run(async ({ hot, expectObservable }) => {
|
|
502
|
+
const message$ = hot('a', {
|
|
503
|
+
a: {
|
|
504
|
+
"id": "99db7b72-fec6-4282-8744-3dfb3526e3ed",
|
|
505
|
+
"status": {
|
|
506
|
+
"multiDeviceParameterValues": {
|
|
507
|
+
"collection": [
|
|
508
|
+
{
|
|
509
|
+
"parameterValues": [
|
|
510
|
+
{
|
|
511
|
+
"index": 8240,
|
|
512
|
+
"subindex": 1,
|
|
513
|
+
"intValue": 62125,
|
|
514
|
+
"typeValue": "intValue",
|
|
515
|
+
"success": {
|
|
516
|
+
"code": 1,
|
|
517
|
+
"message": ""
|
|
518
|
+
},
|
|
519
|
+
"status": "success"
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
"index": 8241,
|
|
523
|
+
"subindex": 1,
|
|
524
|
+
"intValue": 56033,
|
|
525
|
+
"typeValue": "intValue",
|
|
526
|
+
"success": {
|
|
527
|
+
"code": 1,
|
|
528
|
+
"message": ""
|
|
529
|
+
},
|
|
530
|
+
"status": "success"
|
|
531
|
+
}
|
|
532
|
+
],
|
|
533
|
+
"deviceAddress": 3139914318,
|
|
534
|
+
"progress": null
|
|
535
|
+
}
|
|
536
|
+
]
|
|
537
|
+
},
|
|
538
|
+
"type": "multiDeviceParameterValues"
|
|
539
|
+
},
|
|
540
|
+
"type": "status"
|
|
541
|
+
}
|
|
542
|
+
});
|
|
543
|
+
Object.defineProperty(request.socket, 'message$', { value: message$ });
|
|
544
|
+
|
|
545
|
+
const mock = jest.spyOn(request, 'resolveDeviceAddress');
|
|
546
|
+
mock.mockReturnValue(of(3139914318));
|
|
547
|
+
|
|
548
|
+
const result = request.getParameterValues([
|
|
549
|
+
'0x6072:00.9500-02-0008895-1950',
|
|
550
|
+
'0x6073:00.9500-02-0008895-1950',
|
|
551
|
+
], false, 2000, '99db7b72-fec6-4282-8744-3dfb3526e3ed');
|
|
552
|
+
|
|
553
|
+
expectObservable(result).toBe('(r|)', {
|
|
554
|
+
r: [62125, 56033],
|
|
555
|
+
});
|
|
556
|
+
});
|
|
557
|
+
});
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
describe('setParameterValue', () => {
|
|
561
|
+
it('should set device parameter value', () => {
|
|
562
|
+
return scheduler.run(async ({ hot, expectObservable }) => {
|
|
563
|
+
const message$ = hot('a', {
|
|
564
|
+
a: {
|
|
565
|
+
"id": "bf1abc47-85e9-4c07-bc02-c41227cb7cef",
|
|
566
|
+
"status": {
|
|
567
|
+
"deviceParameterValues": {
|
|
568
|
+
"parameterValues": [
|
|
569
|
+
{
|
|
570
|
+
"index": 24693,
|
|
571
|
+
"subindex": 0,
|
|
572
|
+
"intValue": 323,
|
|
573
|
+
"typeValue": "intValue",
|
|
574
|
+
"success": {
|
|
575
|
+
"code": 2,
|
|
576
|
+
"message": ""
|
|
577
|
+
},
|
|
578
|
+
"status": "success"
|
|
579
|
+
}
|
|
580
|
+
],
|
|
581
|
+
"deviceAddress": 3856364449,
|
|
582
|
+
"progress": null
|
|
583
|
+
},
|
|
584
|
+
"type": "deviceParameterValues"
|
|
585
|
+
},
|
|
586
|
+
"type": "status"
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
Object.defineProperty(request.socket, 'message$', { value: message$ });
|
|
590
|
+
|
|
591
|
+
const resolveDeviceAddress = jest.spyOn(request, 'resolveDeviceAddress');
|
|
592
|
+
resolveDeviceAddress.mockReturnValue(of(3139914318));
|
|
593
|
+
const setDeviceParameterValues = jest.spyOn(request, 'setDeviceParameterValues');
|
|
594
|
+
|
|
595
|
+
const result$ = request.setParameterValue('0x6075:00.9500-02-0008895-1950', 6000, 'intValue', 1000, 'bf1abc47-85e9-4c07-bc02-c41227cb7cef');
|
|
596
|
+
|
|
597
|
+
expectObservable(result$).toBe('(a|)', { a: undefined });
|
|
598
|
+
result$.subscribe(() => {
|
|
599
|
+
expect(setDeviceParameterValues).toBeCalledWith({
|
|
600
|
+
"deviceSerialNumber": "9500-02-0008895-1950",
|
|
601
|
+
"parameterValues": [{ "index": 24693, "intValue": 6000, "subindex": 0 }],
|
|
602
|
+
}, 1000, "bf1abc47-85e9-4c07-bc02-c41227cb7cef");
|
|
603
|
+
})
|
|
604
|
+
});
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
it('should thrown an error when parameter does not change', () => {
|
|
608
|
+
return scheduler.run(async ({ hot, expectObservable }) => {
|
|
609
|
+
const message$ = hot('a', {
|
|
610
|
+
a: {
|
|
611
|
+
"id": "bf1abc47-85e9-4c07-bc02-c41227cb7cef",
|
|
612
|
+
"status": {
|
|
613
|
+
"deviceParameterValues": {
|
|
614
|
+
"parameterValues": [
|
|
615
|
+
{
|
|
616
|
+
"index": 8240,
|
|
617
|
+
"subindex": 1,
|
|
618
|
+
"intValue": 61875,
|
|
619
|
+
"typeValue": "intValue",
|
|
620
|
+
"error": {
|
|
621
|
+
"code": 3,
|
|
622
|
+
"message": ""
|
|
623
|
+
},
|
|
624
|
+
"status": "error"
|
|
625
|
+
}
|
|
626
|
+
],
|
|
627
|
+
"deviceAddress": 3856364449,
|
|
628
|
+
"progress": null
|
|
629
|
+
},
|
|
630
|
+
"type": "deviceParameterValues"
|
|
631
|
+
},
|
|
632
|
+
"type": "status"
|
|
633
|
+
}
|
|
634
|
+
});
|
|
635
|
+
Object.defineProperty(request.socket, 'message$', { value: message$ });
|
|
636
|
+
|
|
637
|
+
const resolveDeviceAddress = jest.spyOn(request, 'resolveDeviceAddress');
|
|
638
|
+
resolveDeviceAddress.mockReturnValue(of(3139914318));
|
|
639
|
+
// const setDeviceParameterValues = jest.spyOn(request, 'setDeviceParameterValues');
|
|
640
|
+
|
|
641
|
+
const result$ = request.setParameterValue('0x6075:00.9500-02-0008895-1950', 6000, 'intValue', 1000, 'bf1abc47-85e9-4c07-bc02-c41227cb7cef');
|
|
642
|
+
|
|
643
|
+
expectObservable(result$).toBe('#', null, new Error('Failed to set parameter value (NOT_CHANGED) for {"deviceSerialNumber":"9500-02-0008895-1950","index":24693,"subindex":0,"value":6000,"valueTypeKey":"intValue","requestTimeout":1000,"messageId":"bf1abc47-85e9-4c07-bc02-c41227cb7cef"}'));
|
|
644
|
+
});
|
|
645
|
+
});
|
|
646
|
+
});
|
|
647
|
+
|
|
648
|
+
// describe('setParameterValues', () => {
|
|
649
|
+
// it('should do nothing if values array is empty', () => {
|
|
650
|
+
// reqResClient.setParameterValues([]);
|
|
651
|
+
|
|
652
|
+
// expect(reqResClient.socket.send).not.toBeCalled();
|
|
653
|
+
// });
|
|
654
|
+
|
|
655
|
+
// fit('should set parameter values when values is an array of objects that map device parameter id to value', async () => {
|
|
656
|
+
// return testScheduler.run(async ({ hot }) => {
|
|
657
|
+
// const message$ = hot('a', {
|
|
658
|
+
// a: {
|
|
659
|
+
// "id": "setMultiDeviceParameterValuesMessageId",
|
|
660
|
+
// "status": {
|
|
661
|
+
// "multiDeviceParameterValues": {
|
|
662
|
+
// "collection": [
|
|
663
|
+
// {
|
|
664
|
+
// "parameterValues": [
|
|
665
|
+
// {
|
|
666
|
+
// "index": 24690,
|
|
667
|
+
// "subindex": 0,
|
|
668
|
+
// "uintValue": 2000,
|
|
669
|
+
// "typeValue": "uintValue",
|
|
670
|
+
// "success": {
|
|
671
|
+
// "code": 2,
|
|
672
|
+
// "message": ""
|
|
673
|
+
// },
|
|
674
|
+
// "status": "success"
|
|
675
|
+
// }
|
|
676
|
+
// ],
|
|
677
|
+
// "deviceAddress": 1234567890,
|
|
678
|
+
// "progress": null
|
|
679
|
+
// },
|
|
680
|
+
// {
|
|
681
|
+
// "parameterValues": [
|
|
682
|
+
// {
|
|
683
|
+
// "index": 24691,
|
|
684
|
+
// "subindex": 0,
|
|
685
|
+
// "uintValue": 1000,
|
|
686
|
+
// "typeValue": "uintValue",
|
|
687
|
+
// "success": {
|
|
688
|
+
// "code": 2,
|
|
689
|
+
// "message": ""
|
|
690
|
+
// },
|
|
691
|
+
// "status": "success"
|
|
692
|
+
// }
|
|
693
|
+
// ],
|
|
694
|
+
// "deviceAddress": 1234567890,
|
|
695
|
+
// "progress": null
|
|
696
|
+
// }
|
|
697
|
+
// ]
|
|
698
|
+
// },
|
|
699
|
+
// "type": "multiDeviceParameterValues"
|
|
700
|
+
// },
|
|
701
|
+
// "type": "status"
|
|
702
|
+
// },
|
|
703
|
+
// });
|
|
704
|
+
// Object.defineProperty(reqResClient.socket, 'message$', { value: message$ });
|
|
705
|
+
|
|
706
|
+
// const mock = jest.spyOn(reqResClient, 'resolveDeviceAddress');
|
|
707
|
+
// mock.mockReturnValue(Promise.resolve(3139914318));
|
|
708
|
+
|
|
709
|
+
// reqResClient.parameterTypeValueKeyMap.set(3139914318,
|
|
710
|
+
// new Map([['0x6072:00', 'uintValue'], ['0x6073:00', 'uintValue']]))
|
|
711
|
+
|
|
712
|
+
// await reqResClient.setParameterValues({
|
|
713
|
+
// '0x6072:00.9500-02-0008895-1950': 2000,
|
|
714
|
+
// '0x6073:00.9500-02-0008895-1950': 1000,
|
|
715
|
+
// }, 3000, 'setMultiDeviceParameterValuesMessageId');
|
|
716
|
+
|
|
717
|
+
// expect(reqResClient.socket.send).toBeCalledTimes(1);
|
|
718
|
+
// expect(reqResClient.socket.send).toBeCalledWith({
|
|
719
|
+
// id: 'setMultiDeviceParameterValuesMessageId',
|
|
720
|
+
// request: {
|
|
721
|
+
// setMultiDeviceParameterValues: {
|
|
722
|
+
// collection: [
|
|
723
|
+
// {
|
|
724
|
+
// deviceAddress: 3139914318,
|
|
725
|
+
// parameterValues: [
|
|
726
|
+
// { index: 24690, subindex: 0, uintValue: 2000 },
|
|
727
|
+
// { index: 24691, subindex: 0, uintValue: 1000 },
|
|
728
|
+
// ]
|
|
729
|
+
// }
|
|
730
|
+
// ],
|
|
731
|
+
// },
|
|
732
|
+
// },
|
|
733
|
+
// });
|
|
734
|
+
|
|
735
|
+
// return;
|
|
736
|
+
// });
|
|
737
|
+
// });
|
|
738
|
+
// });
|
|
739
|
+
|
|
740
|
+
});
|