@symbiote-native/sensors 0.2.0 → 0.3.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/README.md +5 -5
- package/build/angular/services/accelerometer.service/index.js +7 -12
- package/build/angular/services/barometer.service/index.js +7 -12
- package/build/angular/services/device-motion.service/index.js +7 -12
- package/build/angular/services/gyroscope.service/index.js +7 -12
- package/build/angular/services/light-sensor.service/index.js +7 -12
- package/build/angular/services/magnetometer-uncalibrated.service/index.js +8 -12
- package/build/angular/services/magnetometer.service/index.js +7 -12
- package/build/angular/services/pedometer.service/index.js +6 -10
- package/build/core/device-motion.js +3 -4
- package/build/svelte/index.d.ts +16 -0
- package/build/svelte/index.js +14 -0
- package/build/svelte/runes/use-accelerometer.svelte.d.ts +4 -0
- package/build/svelte/runes/use-accelerometer.svelte.js +31 -0
- package/build/svelte/runes/use-barometer.svelte.d.ts +4 -0
- package/build/svelte/runes/use-barometer.svelte.js +22 -0
- package/build/svelte/runes/use-device-motion.svelte.d.ts +4 -0
- package/build/svelte/runes/use-device-motion.svelte.js +22 -0
- package/build/svelte/runes/use-gyroscope.svelte.d.ts +4 -0
- package/build/svelte/runes/use-gyroscope.svelte.js +22 -0
- package/build/svelte/runes/use-light-sensor.svelte.d.ts +4 -0
- package/build/svelte/runes/use-light-sensor.svelte.js +22 -0
- package/build/svelte/runes/use-magnetometer-uncalibrated.svelte.d.ts +4 -0
- package/build/svelte/runes/use-magnetometer-uncalibrated.svelte.js +22 -0
- package/build/svelte/runes/use-magnetometer.svelte.d.ts +4 -0
- package/build/svelte/runes/use-magnetometer.svelte.js +22 -0
- package/build/svelte/runes/use-pedometer.svelte.d.ts +4 -0
- package/build/svelte/runes/use-pedometer.svelte.js +20 -0
- package/build-ngc/angular/services/accelerometer.service/index.js +10 -15
- package/build-ngc/angular/services/accelerometer.service/index.js.map +1 -1
- package/build-ngc/angular/services/barometer.service/index.js +10 -15
- package/build-ngc/angular/services/barometer.service/index.js.map +1 -1
- package/build-ngc/angular/services/device-motion.service/index.js +10 -15
- package/build-ngc/angular/services/device-motion.service/index.js.map +1 -1
- package/build-ngc/angular/services/gyroscope.service/index.js +10 -15
- package/build-ngc/angular/services/gyroscope.service/index.js.map +1 -1
- package/build-ngc/angular/services/light-sensor.service/index.js +10 -15
- package/build-ngc/angular/services/light-sensor.service/index.js.map +1 -1
- package/build-ngc/angular/services/magnetometer-uncalibrated.service/index.js +11 -15
- package/build-ngc/angular/services/magnetometer-uncalibrated.service/index.js.map +1 -1
- package/build-ngc/angular/services/magnetometer.service/index.js +10 -15
- package/build-ngc/angular/services/magnetometer.service/index.js.map +1 -1
- package/build-ngc/angular/services/pedometer.service/index.js +9 -13
- package/build-ngc/angular/services/pedometer.service/index.js.map +1 -1
- package/build-ngc/core/device-motion.js +3 -4
- package/build-ngc/core/device-motion.js.map +1 -1
- package/native-link.json +52 -0
- package/package.json +31 -13
- package/src/angular/services/accelerometer.service/index.ts +7 -12
- package/src/angular/services/barometer.service/index.ts +7 -12
- package/src/angular/services/device-motion.service/index.ts +7 -12
- package/src/angular/services/gyroscope.service/index.ts +7 -12
- package/src/angular/services/light-sensor.service/index.ts +7 -12
- package/src/angular/services/magnetometer-uncalibrated.service/index.ts +8 -12
- package/src/angular/services/magnetometer.service/index.ts +7 -12
- package/src/angular/services/pedometer.service/index.ts +6 -10
- package/src/core/device-motion.ts +3 -4
- package/src/svelte/index.ts +29 -0
- package/src/svelte/runes/use-accelerometer.svelte.ts +36 -0
- package/src/svelte/runes/use-barometer.svelte.ts +27 -0
- package/src/svelte/runes/use-device-motion.svelte.ts +27 -0
- package/src/svelte/runes/use-gyroscope.svelte.ts +27 -0
- package/src/svelte/runes/use-light-sensor.svelte.ts +27 -0
- package/src/svelte/runes/use-magnetometer-uncalibrated.svelte.ts +31 -0
- package/src/svelte/runes/use-magnetometer.svelte.ts +27 -0
- package/src/svelte/runes/use-pedometer.svelte.ts +23 -0
- package/src/svelte/svelte-ambient.d.ts +6 -0
- package/src/angular/services/accelerometer.service/accelerometer.service.test.ts +0 -118
- package/src/angular/services/barometer.service/barometer.service.test.ts +0 -122
- package/src/angular/services/device-motion.service/device-motion.service.test.ts +0 -125
- package/src/angular/services/gyroscope.service/gyroscope.service.test.ts +0 -118
- package/src/angular/services/light-sensor.service/light-sensor.service.test.ts +0 -118
- package/src/angular/services/magnetometer-uncalibrated.service/magnetometer-uncalibrated.service.test.ts +0 -123
- package/src/angular/services/magnetometer.service/magnetometer.service.test.ts +0 -118
- package/src/angular/services/pedometer.service/pedometer.service.test.ts +0 -86
- package/src/core/accelerometer.test.ts +0 -49
- package/src/core/barometer.test.ts +0 -46
- package/src/core/device-motion.test.ts +0 -60
- package/src/core/device-sensor.test.ts +0 -76
- package/src/core/gyroscope.test.ts +0 -46
- package/src/core/light-sensor.test.ts +0 -49
- package/src/core/magnetometer-uncalibrated.test.ts +0 -49
- package/src/core/magnetometer.test.ts +0 -49
- package/src/core/pedometer.test.ts +0 -118
- package/src/react/hooks/use-accelerometer/use-accelerometer.test.tsx +0 -81
- package/src/react/hooks/use-barometer/use-barometer.test.tsx +0 -83
- package/src/react/hooks/use-device-motion/use-device-motion.test.tsx +0 -88
- package/src/react/hooks/use-gyroscope/use-gyroscope.test.tsx +0 -79
- package/src/react/hooks/use-light-sensor/use-light-sensor.test.tsx +0 -79
- package/src/react/hooks/use-magnetometer/use-magnetometer.test.tsx +0 -81
- package/src/react/hooks/use-magnetometer-uncalibrated/use-magnetometer-uncalibrated.test.tsx +0 -88
- package/src/react/hooks/use-pedometer/use-pedometer.test.tsx +0 -69
- package/src/vue/composables/use-accelerometer/use-accelerometer.test.ts +0 -96
- package/src/vue/composables/use-barometer/use-barometer.test.ts +0 -100
- package/src/vue/composables/use-device-motion/use-device-motion.test.ts +0 -104
- package/src/vue/composables/use-gyroscope/use-gyroscope.test.ts +0 -96
- package/src/vue/composables/use-light-sensor/use-light-sensor.test.ts +0 -96
- package/src/vue/composables/use-magnetometer/use-magnetometer.test.ts +0 -96
- package/src/vue/composables/use-magnetometer-uncalibrated/use-magnetometer-uncalibrated.test.ts +0 -103
- package/src/vue/composables/use-pedometer/use-pedometer.test.ts +0 -77
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
// Co-located React-driven test (ADR 0025) for useMagnetometer. Mocks the whole `core`
|
|
2
|
-
// module rather than expo-modules-core internals — this hook's own lifecycle wiring
|
|
3
|
-
// (subscribe/unsubscribe/interval) is what's under test, not the core port itself, which
|
|
4
|
-
// already has its own coverage in packages/sensors/src/core/*.test.ts.
|
|
5
|
-
|
|
6
|
-
import { createElement, type ReactElement } from 'react';
|
|
7
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
8
|
-
import { mount, unmount, View } from '@symbiote-native/react';
|
|
9
|
-
import { installFabric } from '@symbiote-native/test-utils';
|
|
10
|
-
import { useMagnetometer } from './index';
|
|
11
|
-
import type { IMagnetometerMeasurement } from '../../../core';
|
|
12
|
-
|
|
13
|
-
const { addListener, removeAllListeners, setUpdateInterval, remove } = vi.hoisted(() => {
|
|
14
|
-
const remove = vi.fn();
|
|
15
|
-
return {
|
|
16
|
-
addListener: vi.fn((_listener: (measurement: IMagnetometerMeasurement) => void) => ({
|
|
17
|
-
remove,
|
|
18
|
-
})),
|
|
19
|
-
removeAllListeners: vi.fn(),
|
|
20
|
-
setUpdateInterval: vi.fn(),
|
|
21
|
-
remove,
|
|
22
|
-
};
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
vi.mock('../../../core', () => ({
|
|
26
|
-
Magnetometer: { addListener, removeAllListeners, setUpdateInterval },
|
|
27
|
-
}));
|
|
28
|
-
|
|
29
|
-
const ROOT_TAG = 902;
|
|
30
|
-
|
|
31
|
-
const results: Array<IMagnetometerMeasurement | null> = [];
|
|
32
|
-
|
|
33
|
-
function Probe(props: { updateIntervalMs?: number }): ReactElement {
|
|
34
|
-
results.push(useMagnetometer(props.updateIntervalMs));
|
|
35
|
-
return createElement(View);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const fabric = installFabric();
|
|
39
|
-
|
|
40
|
-
beforeEach(() => {
|
|
41
|
-
fabric.reset();
|
|
42
|
-
results.length = 0;
|
|
43
|
-
vi.clearAllMocks();
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
afterEach(() => unmount(ROOT_TAG));
|
|
47
|
-
|
|
48
|
-
describe('useMagnetometer', () => {
|
|
49
|
-
it('reports null before any native measurement arrives', () => {
|
|
50
|
-
mount(ROOT_TAG, createElement(Probe, {}));
|
|
51
|
-
|
|
52
|
-
expect(results[results.length - 1]).toBeNull();
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('updates to the latest measurement once the native listener fires', async () => {
|
|
56
|
-
mount(ROOT_TAG, createElement(Probe, {}));
|
|
57
|
-
|
|
58
|
-
const measurement: IMagnetometerMeasurement = { x: 0.1, y: 0.2, z: 0.3, timestamp: 123 };
|
|
59
|
-
const listener = addListener.mock.calls[0][0];
|
|
60
|
-
listener(measurement);
|
|
61
|
-
|
|
62
|
-
// The mock invokes the listener directly, outside the engine's event dispatcher
|
|
63
|
-
// (setEventDispatcher in render.ts), which is what normally flushes a native-driven
|
|
64
|
-
// setState synchronously — so the resulting re-render lands on a later microtask here.
|
|
65
|
-
await vi.waitFor(() => expect(results[results.length - 1]).toEqual(measurement));
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('unsubscribes from the native listener on unmount', () => {
|
|
69
|
-
mount(ROOT_TAG, createElement(Probe, {}));
|
|
70
|
-
|
|
71
|
-
unmount(ROOT_TAG);
|
|
72
|
-
|
|
73
|
-
expect(remove).toHaveBeenCalledTimes(1);
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it('sets the native update interval when updateIntervalMs is provided', () => {
|
|
77
|
-
mount(ROOT_TAG, createElement(Probe, { updateIntervalMs: 100 }));
|
|
78
|
-
|
|
79
|
-
expect(setUpdateInterval).toHaveBeenCalledWith(100);
|
|
80
|
-
});
|
|
81
|
-
});
|
package/src/react/hooks/use-magnetometer-uncalibrated/use-magnetometer-uncalibrated.test.tsx
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
// Co-located React-driven test (ADR 0025) for useMagnetometerUncalibrated. Mocks the whole
|
|
2
|
-
// `core` module rather than expo-modules-core internals — this hook's own lifecycle wiring
|
|
3
|
-
// (subscribe/unsubscribe/interval) is what's under test, not the core port itself, which
|
|
4
|
-
// already has its own coverage in packages/sensors/src/core/*.test.ts.
|
|
5
|
-
|
|
6
|
-
import { createElement, type ReactElement } from 'react';
|
|
7
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
8
|
-
import { mount, unmount, View } from '@symbiote-native/react';
|
|
9
|
-
import { installFabric } from '@symbiote-native/test-utils';
|
|
10
|
-
import { useMagnetometerUncalibrated } from './index';
|
|
11
|
-
import type { IMagnetometerUncalibratedMeasurement } from '../../../core';
|
|
12
|
-
|
|
13
|
-
const { addListener, removeAllListeners, setUpdateInterval, remove } = vi.hoisted(() => {
|
|
14
|
-
const remove = vi.fn();
|
|
15
|
-
return {
|
|
16
|
-
addListener: vi.fn(
|
|
17
|
-
(_listener: (measurement: IMagnetometerUncalibratedMeasurement) => void) => ({
|
|
18
|
-
remove,
|
|
19
|
-
}),
|
|
20
|
-
),
|
|
21
|
-
removeAllListeners: vi.fn(),
|
|
22
|
-
setUpdateInterval: vi.fn(),
|
|
23
|
-
remove,
|
|
24
|
-
};
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
vi.mock('../../../core', () => ({
|
|
28
|
-
MagnetometerUncalibrated: { addListener, removeAllListeners, setUpdateInterval },
|
|
29
|
-
}));
|
|
30
|
-
|
|
31
|
-
const ROOT_TAG = 902;
|
|
32
|
-
|
|
33
|
-
const results: Array<IMagnetometerUncalibratedMeasurement | null> = [];
|
|
34
|
-
|
|
35
|
-
function Probe(props: { updateIntervalMs?: number }): ReactElement {
|
|
36
|
-
results.push(useMagnetometerUncalibrated(props.updateIntervalMs));
|
|
37
|
-
return createElement(View);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const fabric = installFabric();
|
|
41
|
-
|
|
42
|
-
beforeEach(() => {
|
|
43
|
-
fabric.reset();
|
|
44
|
-
results.length = 0;
|
|
45
|
-
vi.clearAllMocks();
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
afterEach(() => unmount(ROOT_TAG));
|
|
49
|
-
|
|
50
|
-
describe('useMagnetometerUncalibrated', () => {
|
|
51
|
-
it('reports null before any native measurement arrives', () => {
|
|
52
|
-
mount(ROOT_TAG, createElement(Probe, {}));
|
|
53
|
-
|
|
54
|
-
expect(results[results.length - 1]).toBeNull();
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('updates to the latest measurement once the native listener fires', async () => {
|
|
58
|
-
mount(ROOT_TAG, createElement(Probe, {}));
|
|
59
|
-
|
|
60
|
-
const measurement: IMagnetometerUncalibratedMeasurement = {
|
|
61
|
-
x: 0.1,
|
|
62
|
-
y: 0.2,
|
|
63
|
-
z: 0.3,
|
|
64
|
-
timestamp: 123,
|
|
65
|
-
};
|
|
66
|
-
const listener = addListener.mock.calls[0][0];
|
|
67
|
-
listener(measurement);
|
|
68
|
-
|
|
69
|
-
// The mock invokes the listener directly, outside the engine's event dispatcher
|
|
70
|
-
// (setEventDispatcher in render.ts), which is what normally flushes a native-driven
|
|
71
|
-
// setState synchronously — so the resulting re-render lands on a later microtask here.
|
|
72
|
-
await vi.waitFor(() => expect(results[results.length - 1]).toEqual(measurement));
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('unsubscribes from the native listener on unmount', () => {
|
|
76
|
-
mount(ROOT_TAG, createElement(Probe, {}));
|
|
77
|
-
|
|
78
|
-
unmount(ROOT_TAG);
|
|
79
|
-
|
|
80
|
-
expect(remove).toHaveBeenCalledTimes(1);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it('sets the native update interval when updateIntervalMs is provided', () => {
|
|
84
|
-
mount(ROOT_TAG, createElement(Probe, { updateIntervalMs: 100 }));
|
|
85
|
-
|
|
86
|
-
expect(setUpdateInterval).toHaveBeenCalledWith(100);
|
|
87
|
-
});
|
|
88
|
-
});
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
// Co-located React-driven test (ADR 0025) for usePedometer. Mocks the whole `core` module
|
|
2
|
-
// rather than expo-modules-core internals — this hook's own lifecycle wiring (subscribe/
|
|
3
|
-
// unsubscribe) is what's under test, not the core port itself, which already has its own
|
|
4
|
-
// coverage in packages/sensors/src/core/pedometer.test.ts.
|
|
5
|
-
|
|
6
|
-
import { createElement, type ReactElement } from 'react';
|
|
7
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
8
|
-
import { mount, unmount, View } from '@symbiote-native/react';
|
|
9
|
-
import { installFabric } from '@symbiote-native/test-utils';
|
|
10
|
-
import { usePedometer } from './index';
|
|
11
|
-
import type { IPedometerResult } from '../../../core';
|
|
12
|
-
|
|
13
|
-
const { watchStepCount, remove } = vi.hoisted(() => {
|
|
14
|
-
const remove = vi.fn();
|
|
15
|
-
return {
|
|
16
|
-
watchStepCount: vi.fn((_callback: (result: IPedometerResult) => void) => ({ remove })),
|
|
17
|
-
remove,
|
|
18
|
-
};
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
vi.mock('../../../core', () => ({ watchStepCount }));
|
|
22
|
-
|
|
23
|
-
const ROOT_TAG = 902;
|
|
24
|
-
|
|
25
|
-
const results: Array<IPedometerResult | null> = [];
|
|
26
|
-
|
|
27
|
-
function Probe(): ReactElement {
|
|
28
|
-
results.push(usePedometer());
|
|
29
|
-
return createElement(View);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const fabric = installFabric();
|
|
33
|
-
|
|
34
|
-
beforeEach(() => {
|
|
35
|
-
fabric.reset();
|
|
36
|
-
results.length = 0;
|
|
37
|
-
vi.clearAllMocks();
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
afterEach(() => unmount(ROOT_TAG));
|
|
41
|
-
|
|
42
|
-
describe('usePedometer', () => {
|
|
43
|
-
it('reports null before any native step count arrives', () => {
|
|
44
|
-
mount(ROOT_TAG, createElement(Probe));
|
|
45
|
-
|
|
46
|
-
expect(results[results.length - 1]).toBeNull();
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it('updates to the latest result once the native listener fires', async () => {
|
|
50
|
-
mount(ROOT_TAG, createElement(Probe));
|
|
51
|
-
|
|
52
|
-
const result: IPedometerResult = { steps: 123 };
|
|
53
|
-
const listener = watchStepCount.mock.calls[0][0];
|
|
54
|
-
listener(result);
|
|
55
|
-
|
|
56
|
-
// The mock invokes the listener directly, outside the engine's event dispatcher
|
|
57
|
-
// (setEventDispatcher in render.ts), which is what normally flushes a native-driven
|
|
58
|
-
// setState synchronously — so the resulting re-render lands on a later microtask here.
|
|
59
|
-
await vi.waitFor(() => expect(results[results.length - 1]).toEqual(result));
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('unsubscribes from the native listener on unmount', () => {
|
|
63
|
-
mount(ROOT_TAG, createElement(Probe));
|
|
64
|
-
|
|
65
|
-
unmount(ROOT_TAG);
|
|
66
|
-
|
|
67
|
-
expect(remove).toHaveBeenCalledTimes(1);
|
|
68
|
-
});
|
|
69
|
-
});
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
// Co-located Vue-driven test (ADR 0025) for useAccelerometer. Mocks the whole core module
|
|
2
|
-
// (never expo-modules-core internals) since this exercises composable mount/unmount lifecycle
|
|
3
|
-
// timing, not any native view — there is none here, so no ViewConfig fixture is needed.
|
|
4
|
-
|
|
5
|
-
import { defineComponent, h, type Ref } from '@vue/runtime-core';
|
|
6
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
7
|
-
import { mount, unmount } from '@symbiote-native/vue';
|
|
8
|
-
import { installFabric } from '@symbiote-native/test-utils';
|
|
9
|
-
import type { IAccelerometerMeasurement } from '../../../core';
|
|
10
|
-
import { useAccelerometer } from './index';
|
|
11
|
-
|
|
12
|
-
const ROOT_TAG = 9821;
|
|
13
|
-
|
|
14
|
-
type IListener = (measurement: IAccelerometerMeasurement) => void;
|
|
15
|
-
|
|
16
|
-
let registeredListener: IListener | undefined;
|
|
17
|
-
const removeMock = vi.fn();
|
|
18
|
-
const addListenerMock = vi.fn((listener: IListener) => {
|
|
19
|
-
registeredListener = listener;
|
|
20
|
-
return { remove: removeMock };
|
|
21
|
-
});
|
|
22
|
-
const setUpdateIntervalMock = vi.fn();
|
|
23
|
-
|
|
24
|
-
vi.mock('../../../core', () => ({
|
|
25
|
-
Accelerometer: {
|
|
26
|
-
addListener: (listener: IListener) => addListenerMock(listener),
|
|
27
|
-
removeAllListeners: vi.fn(),
|
|
28
|
-
setUpdateInterval: (intervalMs: number) => setUpdateIntervalMock(intervalMs),
|
|
29
|
-
},
|
|
30
|
-
}));
|
|
31
|
-
|
|
32
|
-
const fabric = installFabric();
|
|
33
|
-
|
|
34
|
-
beforeEach(() => {
|
|
35
|
-
fabric.reset();
|
|
36
|
-
registeredListener = undefined;
|
|
37
|
-
addListenerMock.mockClear();
|
|
38
|
-
removeMock.mockClear();
|
|
39
|
-
setUpdateIntervalMock.mockClear();
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
afterEach(() => unmount(ROOT_TAG));
|
|
43
|
-
|
|
44
|
-
function mountAccelerometer(updateIntervalMs?: number): Ref<IAccelerometerMeasurement | null> {
|
|
45
|
-
let measurement: Ref<IAccelerometerMeasurement | null> | undefined;
|
|
46
|
-
mount(
|
|
47
|
-
ROOT_TAG,
|
|
48
|
-
defineComponent({
|
|
49
|
-
setup: () => {
|
|
50
|
-
measurement = useAccelerometer(updateIntervalMs);
|
|
51
|
-
return () => h('symbiote-text', {}, 'sensor');
|
|
52
|
-
},
|
|
53
|
-
}),
|
|
54
|
-
);
|
|
55
|
-
if (measurement === undefined) {
|
|
56
|
-
throw new Error('setup() did not run');
|
|
57
|
-
}
|
|
58
|
-
return measurement;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
describe('useAccelerometer (Vue)', () => {
|
|
62
|
-
it('starts null before any measurement arrives', () => {
|
|
63
|
-
const measurement = mountAccelerometer();
|
|
64
|
-
|
|
65
|
-
expect(measurement.value).toBeNull();
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('updates the ref when the native listener fires', () => {
|
|
69
|
-
const measurement = mountAccelerometer();
|
|
70
|
-
const reading: IAccelerometerMeasurement = { x: 0.1, y: 0.2, z: 0.9, timestamp: 123 };
|
|
71
|
-
|
|
72
|
-
registeredListener?.(reading);
|
|
73
|
-
|
|
74
|
-
expect(measurement.value).toEqual(reading);
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('removes the subscription on unmount', () => {
|
|
78
|
-
mountAccelerometer();
|
|
79
|
-
unmount(ROOT_TAG);
|
|
80
|
-
|
|
81
|
-
expect(removeMock).toHaveBeenCalledTimes(1);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('sets the update interval once at subscribe time when provided', () => {
|
|
85
|
-
mountAccelerometer(50);
|
|
86
|
-
|
|
87
|
-
expect(setUpdateIntervalMock).toHaveBeenCalledWith(50);
|
|
88
|
-
expect(setUpdateIntervalMock).toHaveBeenCalledTimes(1);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('does not touch the update interval when omitted', () => {
|
|
92
|
-
mountAccelerometer();
|
|
93
|
-
|
|
94
|
-
expect(setUpdateIntervalMock).not.toHaveBeenCalled();
|
|
95
|
-
});
|
|
96
|
-
});
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
// Co-located Vue-driven test (ADR 0025) for useBarometer. Mocks the whole core module
|
|
2
|
-
// (never expo-modules-core internals) since this exercises composable mount/unmount lifecycle
|
|
3
|
-
// timing, not any native view — there is none here, so no ViewConfig fixture is needed.
|
|
4
|
-
|
|
5
|
-
import { defineComponent, h, type Ref } from '@vue/runtime-core';
|
|
6
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
7
|
-
import { mount, unmount } from '@symbiote-native/vue';
|
|
8
|
-
import { installFabric } from '@symbiote-native/test-utils';
|
|
9
|
-
import type { IBarometerMeasurement } from '../../../core';
|
|
10
|
-
import { useBarometer } from './index';
|
|
11
|
-
|
|
12
|
-
const ROOT_TAG = 9822;
|
|
13
|
-
|
|
14
|
-
type IListener = (measurement: IBarometerMeasurement) => void;
|
|
15
|
-
|
|
16
|
-
let registeredListener: IListener | undefined;
|
|
17
|
-
const removeMock = vi.fn();
|
|
18
|
-
const addListenerMock = vi.fn((listener: IListener) => {
|
|
19
|
-
registeredListener = listener;
|
|
20
|
-
return { remove: removeMock };
|
|
21
|
-
});
|
|
22
|
-
const setUpdateIntervalMock = vi.fn();
|
|
23
|
-
|
|
24
|
-
vi.mock('../../../core', () => ({
|
|
25
|
-
Barometer: {
|
|
26
|
-
addListener: (listener: IListener) => addListenerMock(listener),
|
|
27
|
-
removeAllListeners: vi.fn(),
|
|
28
|
-
setUpdateInterval: (intervalMs: number) => setUpdateIntervalMock(intervalMs),
|
|
29
|
-
},
|
|
30
|
-
}));
|
|
31
|
-
|
|
32
|
-
const fabric = installFabric();
|
|
33
|
-
|
|
34
|
-
beforeEach(() => {
|
|
35
|
-
fabric.reset();
|
|
36
|
-
registeredListener = undefined;
|
|
37
|
-
addListenerMock.mockClear();
|
|
38
|
-
removeMock.mockClear();
|
|
39
|
-
setUpdateIntervalMock.mockClear();
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
afterEach(() => unmount(ROOT_TAG));
|
|
43
|
-
|
|
44
|
-
function mountBarometer(updateIntervalMs?: number): Ref<IBarometerMeasurement | null> {
|
|
45
|
-
let measurement: Ref<IBarometerMeasurement | null> | undefined;
|
|
46
|
-
mount(
|
|
47
|
-
ROOT_TAG,
|
|
48
|
-
defineComponent({
|
|
49
|
-
setup: () => {
|
|
50
|
-
measurement = useBarometer(updateIntervalMs);
|
|
51
|
-
return () => h('symbiote-text', {}, 'sensor');
|
|
52
|
-
},
|
|
53
|
-
}),
|
|
54
|
-
);
|
|
55
|
-
if (measurement === undefined) {
|
|
56
|
-
throw new Error('setup() did not run');
|
|
57
|
-
}
|
|
58
|
-
return measurement;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
describe('useBarometer (Vue)', () => {
|
|
62
|
-
it('starts null before any measurement arrives', () => {
|
|
63
|
-
const measurement = mountBarometer();
|
|
64
|
-
|
|
65
|
-
expect(measurement.value).toBeNull();
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('updates the ref when the native listener fires', () => {
|
|
69
|
-
const measurement = mountBarometer();
|
|
70
|
-
const reading: IBarometerMeasurement = {
|
|
71
|
-
pressure: 1013.25,
|
|
72
|
-
relativeAltitude: 12.3,
|
|
73
|
-
timestamp: 123,
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
registeredListener?.(reading);
|
|
77
|
-
|
|
78
|
-
expect(measurement.value).toEqual(reading);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('removes the subscription on unmount', () => {
|
|
82
|
-
mountBarometer();
|
|
83
|
-
unmount(ROOT_TAG);
|
|
84
|
-
|
|
85
|
-
expect(removeMock).toHaveBeenCalledTimes(1);
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
it('sets the update interval once at subscribe time when provided', () => {
|
|
89
|
-
mountBarometer(50);
|
|
90
|
-
|
|
91
|
-
expect(setUpdateIntervalMock).toHaveBeenCalledWith(50);
|
|
92
|
-
expect(setUpdateIntervalMock).toHaveBeenCalledTimes(1);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it('does not touch the update interval when omitted', () => {
|
|
96
|
-
mountBarometer();
|
|
97
|
-
|
|
98
|
-
expect(setUpdateIntervalMock).not.toHaveBeenCalled();
|
|
99
|
-
});
|
|
100
|
-
});
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
// Co-located Vue-driven test (ADR 0025) for useDeviceMotion. Mocks the whole core module
|
|
2
|
-
// (never expo-modules-core internals) since this exercises composable mount/unmount lifecycle
|
|
3
|
-
// timing, not any native view — there is none here, so no ViewConfig fixture is needed.
|
|
4
|
-
|
|
5
|
-
import { defineComponent, h, type Ref } from '@vue/runtime-core';
|
|
6
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
7
|
-
import { mount, unmount } from '@symbiote-native/vue';
|
|
8
|
-
import { installFabric } from '@symbiote-native/test-utils';
|
|
9
|
-
import type { IDeviceMotionMeasurement } from '../../../core';
|
|
10
|
-
import { useDeviceMotion } from './index';
|
|
11
|
-
|
|
12
|
-
const ROOT_TAG = 9822;
|
|
13
|
-
|
|
14
|
-
type IListener = (measurement: IDeviceMotionMeasurement) => void;
|
|
15
|
-
|
|
16
|
-
let registeredListener: IListener | undefined;
|
|
17
|
-
const removeMock = vi.fn();
|
|
18
|
-
const addListenerMock = vi.fn((listener: IListener) => {
|
|
19
|
-
registeredListener = listener;
|
|
20
|
-
return { remove: removeMock };
|
|
21
|
-
});
|
|
22
|
-
const setUpdateIntervalMock = vi.fn();
|
|
23
|
-
|
|
24
|
-
vi.mock('../../../core', () => ({
|
|
25
|
-
DeviceMotion: {
|
|
26
|
-
addListener: (listener: IListener) => addListenerMock(listener),
|
|
27
|
-
removeAllListeners: vi.fn(),
|
|
28
|
-
setUpdateInterval: (intervalMs: number) => setUpdateIntervalMock(intervalMs),
|
|
29
|
-
},
|
|
30
|
-
}));
|
|
31
|
-
|
|
32
|
-
const fabric = installFabric();
|
|
33
|
-
|
|
34
|
-
beforeEach(() => {
|
|
35
|
-
fabric.reset();
|
|
36
|
-
registeredListener = undefined;
|
|
37
|
-
addListenerMock.mockClear();
|
|
38
|
-
removeMock.mockClear();
|
|
39
|
-
setUpdateIntervalMock.mockClear();
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
afterEach(() => unmount(ROOT_TAG));
|
|
43
|
-
|
|
44
|
-
function mountDeviceMotion(updateIntervalMs?: number): Ref<IDeviceMotionMeasurement | null> {
|
|
45
|
-
let measurement: Ref<IDeviceMotionMeasurement | null> | undefined;
|
|
46
|
-
mount(
|
|
47
|
-
ROOT_TAG,
|
|
48
|
-
defineComponent({
|
|
49
|
-
setup: () => {
|
|
50
|
-
measurement = useDeviceMotion(updateIntervalMs);
|
|
51
|
-
return () => h('symbiote-text', {}, 'sensor');
|
|
52
|
-
},
|
|
53
|
-
}),
|
|
54
|
-
);
|
|
55
|
-
if (measurement === undefined) {
|
|
56
|
-
throw new Error('setup() did not run');
|
|
57
|
-
}
|
|
58
|
-
return measurement;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const READING: IDeviceMotionMeasurement = {
|
|
62
|
-
acceleration: { x: 0.1, y: 0.2, z: 0.3, timestamp: 123 },
|
|
63
|
-
accelerationIncludingGravity: { x: 0.1, y: 0.2, z: 9.9, timestamp: 123 },
|
|
64
|
-
rotation: { alpha: 1, beta: 2, gamma: 3, timestamp: 123 },
|
|
65
|
-
rotationRate: { alpha: 0.1, beta: 0.2, gamma: 0.3, timestamp: 123 },
|
|
66
|
-
interval: 16,
|
|
67
|
-
orientation: 0, // DeviceMotionOrientation.Portrait
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
describe('useDeviceMotion (Vue)', () => {
|
|
71
|
-
it('starts null before any measurement arrives', () => {
|
|
72
|
-
const measurement = mountDeviceMotion();
|
|
73
|
-
|
|
74
|
-
expect(measurement.value).toBeNull();
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('updates the ref when the native listener fires', () => {
|
|
78
|
-
const measurement = mountDeviceMotion();
|
|
79
|
-
|
|
80
|
-
registeredListener?.(READING);
|
|
81
|
-
|
|
82
|
-
expect(measurement.value).toEqual(READING);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it('removes the subscription on unmount', () => {
|
|
86
|
-
mountDeviceMotion();
|
|
87
|
-
unmount(ROOT_TAG);
|
|
88
|
-
|
|
89
|
-
expect(removeMock).toHaveBeenCalledTimes(1);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('sets the update interval once at subscribe time when provided', () => {
|
|
93
|
-
mountDeviceMotion(50);
|
|
94
|
-
|
|
95
|
-
expect(setUpdateIntervalMock).toHaveBeenCalledWith(50);
|
|
96
|
-
expect(setUpdateIntervalMock).toHaveBeenCalledTimes(1);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('does not touch the update interval when omitted', () => {
|
|
100
|
-
mountDeviceMotion();
|
|
101
|
-
|
|
102
|
-
expect(setUpdateIntervalMock).not.toHaveBeenCalled();
|
|
103
|
-
});
|
|
104
|
-
});
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
// Co-located Vue-driven test (ADR 0025) for useGyroscope. Mocks the whole core module
|
|
2
|
-
// (never expo-modules-core internals) since this exercises composable mount/unmount lifecycle
|
|
3
|
-
// timing, not any native view — there is none here, so no ViewConfig fixture is needed.
|
|
4
|
-
|
|
5
|
-
import { defineComponent, h, type Ref } from '@vue/runtime-core';
|
|
6
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
7
|
-
import { mount, unmount } from '@symbiote-native/vue';
|
|
8
|
-
import { installFabric } from '@symbiote-native/test-utils';
|
|
9
|
-
import type { IGyroscopeMeasurement } from '../../../core';
|
|
10
|
-
import { useGyroscope } from './index';
|
|
11
|
-
|
|
12
|
-
const ROOT_TAG = 9822;
|
|
13
|
-
|
|
14
|
-
type IListener = (measurement: IGyroscopeMeasurement) => void;
|
|
15
|
-
|
|
16
|
-
let registeredListener: IListener | undefined;
|
|
17
|
-
const removeMock = vi.fn();
|
|
18
|
-
const addListenerMock = vi.fn((listener: IListener) => {
|
|
19
|
-
registeredListener = listener;
|
|
20
|
-
return { remove: removeMock };
|
|
21
|
-
});
|
|
22
|
-
const setUpdateIntervalMock = vi.fn();
|
|
23
|
-
|
|
24
|
-
vi.mock('../../../core', () => ({
|
|
25
|
-
Gyroscope: {
|
|
26
|
-
addListener: (listener: IListener) => addListenerMock(listener),
|
|
27
|
-
removeAllListeners: vi.fn(),
|
|
28
|
-
setUpdateInterval: (intervalMs: number) => setUpdateIntervalMock(intervalMs),
|
|
29
|
-
},
|
|
30
|
-
}));
|
|
31
|
-
|
|
32
|
-
const fabric = installFabric();
|
|
33
|
-
|
|
34
|
-
beforeEach(() => {
|
|
35
|
-
fabric.reset();
|
|
36
|
-
registeredListener = undefined;
|
|
37
|
-
addListenerMock.mockClear();
|
|
38
|
-
removeMock.mockClear();
|
|
39
|
-
setUpdateIntervalMock.mockClear();
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
afterEach(() => unmount(ROOT_TAG));
|
|
43
|
-
|
|
44
|
-
function mountGyroscope(updateIntervalMs?: number): Ref<IGyroscopeMeasurement | null> {
|
|
45
|
-
let measurement: Ref<IGyroscopeMeasurement | null> | undefined;
|
|
46
|
-
mount(
|
|
47
|
-
ROOT_TAG,
|
|
48
|
-
defineComponent({
|
|
49
|
-
setup: () => {
|
|
50
|
-
measurement = useGyroscope(updateIntervalMs);
|
|
51
|
-
return () => h('symbiote-text', {}, 'sensor');
|
|
52
|
-
},
|
|
53
|
-
}),
|
|
54
|
-
);
|
|
55
|
-
if (measurement === undefined) {
|
|
56
|
-
throw new Error('setup() did not run');
|
|
57
|
-
}
|
|
58
|
-
return measurement;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
describe('useGyroscope (Vue)', () => {
|
|
62
|
-
it('starts null before any measurement arrives', () => {
|
|
63
|
-
const measurement = mountGyroscope();
|
|
64
|
-
|
|
65
|
-
expect(measurement.value).toBeNull();
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('updates the ref when the native listener fires', () => {
|
|
69
|
-
const measurement = mountGyroscope();
|
|
70
|
-
const reading: IGyroscopeMeasurement = { x: 0.1, y: 0.2, z: 0.9, timestamp: 123 };
|
|
71
|
-
|
|
72
|
-
registeredListener?.(reading);
|
|
73
|
-
|
|
74
|
-
expect(measurement.value).toEqual(reading);
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('removes the subscription on unmount', () => {
|
|
78
|
-
mountGyroscope();
|
|
79
|
-
unmount(ROOT_TAG);
|
|
80
|
-
|
|
81
|
-
expect(removeMock).toHaveBeenCalledTimes(1);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('sets the update interval once at subscribe time when provided', () => {
|
|
85
|
-
mountGyroscope(50);
|
|
86
|
-
|
|
87
|
-
expect(setUpdateIntervalMock).toHaveBeenCalledWith(50);
|
|
88
|
-
expect(setUpdateIntervalMock).toHaveBeenCalledTimes(1);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('does not touch the update interval when omitted', () => {
|
|
92
|
-
mountGyroscope();
|
|
93
|
-
|
|
94
|
-
expect(setUpdateIntervalMock).not.toHaveBeenCalled();
|
|
95
|
-
});
|
|
96
|
-
});
|