forked from BasedHardware/omi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdevice_test.dart
More file actions
121 lines (96 loc) · 4.94 KB
/
Copy pathdevice_test.dart
File metadata and controls
121 lines (96 loc) · 4.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import 'package:flutter_test/flutter_test.dart';
import 'package:omi/backend/schema/bt_device/bt_device.dart';
import 'package:omi/utils/device.dart';
void main() {
group('DeviceUtils.analyticsHardwareFamily', () {
BtDevice device(DeviceType type, String model, {String name = 'Omi'}) =>
BtDevice(id: 'device-id', name: name, type: type, rssi: -50, modelNumber: model);
test('normalizes Omi hardware variants', () {
expect(DeviceUtils.analyticsHardwareFamily(device(DeviceType.omi, 'Omi CV 1')), 'omi_cv1');
expect(DeviceUtils.analyticsHardwareFamily(device(DeviceType.omi, 'Omi DevKit 2')), 'omi_devkit');
expect(DeviceUtils.analyticsHardwareFamily(device(DeviceType.omi, 'Omi Neo')), 'omi_neo');
expect(DeviceUtils.analyticsHardwareFamily(device(DeviceType.openglass, 'Unknown')), 'omi_glass');
});
test('normalizes partner hardware without using arbitrary model text', () {
expect(DeviceUtils.analyticsHardwareFamily(device(DeviceType.limitless, 'Limitless Pendant')), 'limitless');
expect(DeviceUtils.analyticsHardwareFamily(device(DeviceType.friendPendant, 'Model 1')), 'friend_pendant');
expect(DeviceUtils.analyticsHardwareFamily(device(DeviceType.raybanMeta, 'Ray-Ban Meta')), 'rayban_meta');
});
});
group('DeviceUtils.isOmiDevKit', () {
test('detects DevKit 2 by model number', () {
expect(DeviceUtils.isOmiDevKit(modelNumber: 'OMI DEVKIT 2'), isTrue);
});
test('detects DevKit by advertised name', () {
expect(DeviceUtils.isOmiDevKit(deviceName: 'Omi DevKit'), isTrue);
});
test('detects the spaced "Dev Kit" spelling (Friend Dev Kit 1)', () {
expect(DeviceUtils.isOmiDevKit(deviceName: 'Friend Dev Kit 1'), isTrue);
expect(DeviceUtils.isOmiDevKit(modelNumber: 'Omi Dev Kit 2'), isTrue);
});
test('is case-insensitive', () {
expect(DeviceUtils.isOmiDevKit(modelNumber: 'omi devkit 2'), isTrue);
});
test('consumer pendant is NOT a DevKit', () {
expect(DeviceUtils.isOmiDevKit(modelNumber: 'Omi', deviceName: 'Omi'), isFalse);
});
test("default 'Omi Device' fallback is NOT a DevKit (contains DEV but not DEVKIT)", () {
expect(DeviceUtils.isOmiDevKit(modelNumber: 'Omi Device', deviceName: 'Omi'), isFalse);
});
test('Neo consumer device is NOT a DevKit', () {
expect(DeviceUtils.isOmiDevKit(modelNumber: 'Omi Neo', deviceName: 'Neo'), isFalse);
});
test('null / empty inputs are NOT a DevKit', () {
expect(DeviceUtils.isOmiDevKit(), isFalse);
expect(DeviceUtils.isOmiDevKit(modelNumber: '', deviceName: ''), isFalse);
});
});
// The "How to use your Omi" tutorial is CV1-only. Other omi-enumerated
// variants (DevKit, Glass, Neo, Friend) share DeviceType.omi, so isOmiCv1
// distinguishes them by GATT model number / advertised name.
group('DeviceUtils.isOmiCv1', () {
test('CV1 model is CV1', () {
expect(DeviceUtils.isOmiCv1(modelNumber: 'Omi CV 1'), isTrue);
});
test("default 'Omi Device' fallback is treated as CV1", () {
expect(DeviceUtils.isOmiCv1(modelNumber: 'Omi Device', deviceName: 'Omi'), isTrue);
});
test('DevKit 2 is NOT CV1', () {
expect(DeviceUtils.isOmiCv1(modelNumber: 'Omi DevKit 2'), isFalse);
});
test('DevKit by name is NOT CV1', () {
expect(DeviceUtils.isOmiCv1(deviceName: 'Omi DevKit'), isFalse);
});
test('Friend DevKit 1 is NOT CV1', () {
expect(DeviceUtils.isOmiCv1(modelNumber: 'Friend DevKit 1'), isFalse);
});
test('Friend Dev Kit 1 (spaced) is NOT CV1 — the forced-onboarding regression', () {
expect(DeviceUtils.isOmiCv1(deviceName: 'Friend Dev Kit 1'), isFalse);
expect(DeviceUtils.isOmiCv1(modelNumber: 'Friend Dev Kit 1'), isFalse);
});
test('Glass is NOT CV1', () {
expect(DeviceUtils.isOmiCv1(modelNumber: 'OMI Glass'), isFalse);
});
test('Neo is NOT CV1', () {
expect(DeviceUtils.isOmiCv1(modelNumber: 'Neo One', deviceName: 'Neo'), isFalse);
});
test('is case-insensitive', () {
expect(DeviceUtils.isOmiCv1(modelNumber: 'omi devkit 2'), isFalse);
});
test('a non-variant name alone is enough to treat as CV1', () {
expect(DeviceUtils.isOmiCv1(deviceName: 'Omi'), isTrue);
});
test('concrete CV1 model is authoritative — name cannot veto it', () {
expect(DeviceUtils.isOmiCv1(modelNumber: 'Omi CV 1', deviceName: 'Omi Neo'), isTrue);
});
test('generic fallback model defers to the name (DevKit with failed read)', () {
expect(DeviceUtils.isOmiCv1(modelNumber: 'Omi Device', deviceName: 'Omi DevKit'), isFalse);
expect(DeviceUtils.isOmiCv1(modelNumber: 'Unknown', deviceName: 'Omi DevKit'), isFalse);
});
test('no identifier at all is NOT positively CV1', () {
expect(DeviceUtils.isOmiCv1(), isFalse);
expect(DeviceUtils.isOmiCv1(modelNumber: '', deviceName: ''), isFalse);
expect(DeviceUtils.isOmiCv1(modelNumber: ' ', deviceName: ' '), isFalse);
});
});
}