import 'package:abawo_bt_app/model/shifter_types.dart'; import 'package:abawo_bt_app/service/dfu_protocol.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { group('DfuProtocol CRC32', () { test('matches known vector', () { final crc = DfuProtocol.crc32('123456789'.codeUnits); expect(crc, 0xCBF43926); }); }); group('DfuProtocol control payload encoding', () { test('encodes START payload with exact 11-byte LE layout', () { final payload = DfuProtocol.encodeStartPayload( const DfuStartPayload( totalLength: 0x1234, imageCrc32: 0x89ABCDEF, sessionId: 0x22, flags: universalShifterDfuFlagEncrypted, ), ); expect(payload.length, 11); expect( payload, [ universalShifterDfuOpcodeStart, 0x34, 0x12, 0x00, 0x00, 0xEF, 0xCD, 0xAB, 0x89, 0x22, universalShifterDfuFlagEncrypted, ], ); }); test('encodes FINISH and ABORT payloads as one byte', () { expect( DfuProtocol.encodeFinishPayload(), [universalShifterDfuOpcodeFinish]); expect( DfuProtocol.encodeAbortPayload(), [universalShifterDfuOpcodeAbort]); }); }); group('DfuProtocol data frame building', () { test('builds 64-byte frames and handles final partial payload', () { final image = List.generate(80, (index) => index); final frames = DfuProtocol.buildDataFrames(image); expect(frames.length, 2); expect(frames[0].sequence, 0); expect(frames[0].offset, 0); expect(frames[0].payloadLength, universalShifterDfuFramePayloadSizeBytes); expect(frames[0].bytes.length, universalShifterDfuFrameSizeBytes); expect(frames[0].bytes.sublist(1, 64), image.sublist(0, 63)); expect(frames[1].sequence, 1); expect(frames[1].offset, 63); expect(frames[1].payloadLength, 17); expect(frames[1].bytes.length, universalShifterDfuFrameSizeBytes); expect(frames[1].bytes.sublist(1, 18), image.sublist(63, 80)); }); }); group('DfuProtocol sequence and ACK helpers', () { test('wraps sequence values and computes ack+1 rewind', () { expect(DfuProtocol.nextSequence(0x00), 0x01); expect(DfuProtocol.nextSequence(0xFF), 0x00); expect(DfuProtocol.rewindSequenceFromAck(0x05), 0x06); expect(DfuProtocol.rewindSequenceFromAck(0xFF), 0x00); }); test('computes wrapping sequence distance', () { expect(DfuProtocol.sequenceDistance(250, 2), 8); expect(DfuProtocol.sequenceDistance(1, 1), 0); }); }); }