Files
flutterApp/test/ble_protocol_decoder_test.dart

58 lines
2.1 KiB
Dart
Raw Normal View History

import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_test/flutter_test.dart';
import 'package:maibu_satabot_v2/core/bluetooth/ble_protocol_decoder.dart';
import 'package:maibu_satabot_v2/core/protocol/machine_protocol_constants.dart';
void main() {
// 协议表示例:24 个逗号字段,控制模式=2(蓝牙),障碍物=1(有障碍)
const sheet =
'52.2,2000,2000,190,190,45.2,46.6,40.5,40.5,40,50,5,5,32,5,1,'
'120.772,32.078,2026-09-10 12:34:56,2000,2,98,12.65,1';
Uint8List payloadWith(String body, List<int> tail) =>
Uint8List.fromList([...utf8.encode(body), ...tail]);
String valueOf(BleDecodedResult r, String label) =>
r.fields.firstWhere((f) => f.label == label).value;
test('0x02 带2字节CRC:控制模式/障碍物解析正确', () {
final r = BleProtocolDecoder.decode(
MachineProtocolConstants.cmdStatusInfo,
payloadWith(sheet, [0x12, 0x34]), // 尾部 CRC16 小端
);
expect(valueOf(r, '控制模式'), '蓝牙');
expect(valueOf(r, '障碍物'), '有障碍');
expect(valueOf(r, '电压'), '52.20 V'); // _tryParseDouble 保留两位小数
expect(valueOf(r, '电量'), '98%');
});
test('0x02 串尾带\\0再加CRC:仍解析正确(不乱码)', () {
final r = BleProtocolDecoder.decode(
MachineProtocolConstants.cmdStatusInfo,
payloadWith('$sheet\x00', [0x12, 0x34]),
);
expect(valueOf(r, '控制模式'), '蓝牙');
expect(valueOf(r, '障碍物'), '有障碍');
});
test('0x02 控制模式带空格(如" 3"):仍映射为文字 TCP', () {
final spaced = sheet.replaceFirst(',2000,2,98', ',2000, 3,98');
final r = BleProtocolDecoder.decode(
MachineProtocolConstants.cmdStatusInfo,
payloadWith(spaced, [0x12, 0x34]),
);
expect(valueOf(r, '控制模式'), 'TCP');
});
test('0x02 控制模式为协议外码6:显示 未知(6) 而非裸6', () {
final bad = sheet.replaceFirst(',2000,2,98', ',2000,6,98');
final r = BleProtocolDecoder.decode(
MachineProtocolConstants.cmdStatusInfo,
payloadWith(bad, [0x12, 0x34]),
);
expect(valueOf(r, '控制模式'), '未知(6)');
});
}