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 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)'); }); }