Saba-dart/test/protocol_test.dart
2026-04-13 23:41:27 +03:30

81 lines
3.3 KiB
Dart

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