import '../lib/utils/protocol_helper.dart'; void expect(dynamic actual, dynamic expected, String message) { if (actual == expected) { print('✅ $message'); } else { print('❌ $message (Expected: $expected, Actual: $actual)'); throw Exception('Test failed: $message'); } } void main() { print('Running Robust ProtocolHelper Tests...'); // 1. Standard Plain Text var res = ProtocolHelper.parseMessage('Hello world'); expect(res['type'], 'plain', 'Standard plain text'); // 2. Standard Symmetric res = ProtocolHelper.parseMessage('@S:SYM|b1:payload'); expect(res['type'], 'sym', 'Standard symmetric message'); expect(res['payload'], 'b1:payload', 'Standard symmetric payload'); // 3. Mangled Prefix Symmetric res = ProtocolHelper.parseMessage(' @ S: SYM | b1:payload '); expect(res['type'], 'sym', 'Mangled prefix symmetric (with spaces)'); expect(res['payload'], 'b1:payload', 'Mangled prefix symmetric payload'); // 4. Missing Prefix Symmetric res = ProtocolHelper.parseMessage('SYM|b1:payload'); expect(res['type'], 'sym', 'Missing prefix symmetric'); expect(res['payload'], 'b1:payload', 'Missing prefix symmetric payload'); // 5. Standard Fragment res = ProtocolHelper.parseMessage('@S:SFRA|pkt1|1|2|chunk1'); expect(res['type'], 'sfra', 'Standard fragment'); expect(res['packetId'], 'pkt1', 'Fragment packetId'); expect(res['partNo'], 1, 'Fragment partNo'); expect(res['totalParts'], 2, 'Fragment totalParts'); expect(res['chunk'], 'chunk1', 'Fragment chunk'); // 6. Mangled Prefix Fragment res = ProtocolHelper.parseMessage('[MSG] S: SFRA | pkt1 | 2 | 2 | chunk2'); expect(res['type'], 'sfra', 'Mangled prefix fragment'); expect(res['chunk'], 'chunk2', 'Mangled prefix fragment chunk'); // 7. Missing Prefix Fragment res = ProtocolHelper.parseMessage('SFRA|pkt1|1|2|chunk1'); expect(res['type'], 'sfra', 'Missing prefix fragment'); // 8. Mangled Separators (Persian style) res = ProtocolHelper.parseMessage('@S:SFRA;pkt1!1;2!chunk1'); expect(res['type'], 'sfra', 'Mangled separators fragment (; and !)'); expect(res['packetId'], 'pkt1', 'Mangled separators packetId'); expect(res['totalParts'], 2, 'Mangled separators totalParts'); // 9. Group Message Identification res = ProtocolHelper.parseMessage('@G:SYM|b1:group_payload'); expect(res['type'], 'sym', 'Standard group message type'); expect(res['isGroup'], true, 'Standard group message isGroup flag'); res = ProtocolHelper.parseMessage('G: SYM | b1:group_payload'); expect(res['type'], 'sym', 'Mangled group message type'); expect(res['isGroup'], true, 'Mangled group message isGroup flag'); // 10. Prevention of incorrect b1: fallback on fragments // If we have a fragment header but a mangled prefix, it should detect SFRA first res = ProtocolHelper.parseMessage(' X S: SFRA|id|1|2|b1:part1'); expect(res['type'], 'sfra', 'Ensure SFRA takes precedence over b1: fallback'); expect(res['chunk'], 'b1:part1', 'Ensure chunk contains the b1: marker if it was part of it'); // 11. b1: Fallback (valid only if no pipes) res = ProtocolHelper.parseMessage(' b1:standalone_payload '); expect(res['type'], 'sym', 'b1: fallback valid'); res = ProtocolHelper.parseMessage(' h1:standalone_payload '); expect(res['type'], 'sym', 'h1: fallback valid'); print('All 11 robust tests passed! 🚀'); }