from dataclasses import dataclass import pytest from fansifter_common.utils.msgsegment import Encoding, SegmentedMessage @dataclass(kw_only=True) class SegmentTestData: body: str encoding: Encoding segments_count: int message_size: int total_size: int number_of_characters: int number_of_unicode_scalars: int class TestSegmentMessage: @pytest.mark.parametrize( "segment_data", [ pytest.param( SegmentTestData( body="1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", encoding="GSM-7", segments_count=1, message_size=1120, total_size=1120, number_of_characters=160, number_of_unicode_scalars=160, ), id="GSM-7 in one segment", ), pytest.param( SegmentTestData( body="12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", encoding="GSM-7", segments_count=2, message_size=1127, total_size=1223, number_of_characters=161, number_of_unicode_scalars=161, ), id="GSM-7 in two segments", ), pytest.param( SegmentTestData( body="1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567", encoding="GSM-7", segments_count=3, message_size=2149, total_size=2293, number_of_characters=307, number_of_unicode_scalars=307, ), id="GSM-7 in three segments", ), pytest.param( SegmentTestData( body="😜23456789012345678901234567890123456789012345678901234567890123456789", encoding="UCS-2", segments_count=1, message_size=1120, total_size=1120, number_of_characters=69, number_of_unicode_scalars=69, ), id="UCS-2 message in one segment", ), pytest.param( SegmentTestData( body="😜234567890123456789012345678901234567890123456789012345678901234567890", encoding="UCS-2", segments_count=2, message_size=1136, total_size=1232, number_of_characters=70, number_of_unicode_scalars=70, ), id="UCS-2 message in two segments", ), pytest.param( SegmentTestData( body="😜2345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234", encoding="UCS-2", segments_count=3, message_size=2160, total_size=2304, number_of_characters=134, number_of_unicode_scalars=134, ), id="UCS-2 message in three segments", ), pytest.param( SegmentTestData( body="🇮🇹234567890123456789012345678901234567890123456789012345678901234567", encoding="UCS-2", segments_count=1, message_size=1120, total_size=1120, number_of_characters=67, number_of_unicode_scalars=68, ), id="UCS-2 with two bytes extended characters in one segments boundary", ), pytest.param( SegmentTestData( body="🇮🇹2345678901234567890123456789012345678901234567890123456789012345678", encoding="UCS-2", segments_count=2, message_size=1136, total_size=1232, number_of_characters=68, number_of_unicode_scalars=69, ), id="UCS-2 with extended characters in two segments boundary", ), pytest.param( SegmentTestData( body="🏳️‍🌈2345678901234567890123456789012345678901234567890123456789012345", encoding="UCS-2", segments_count=1, message_size=1120, total_size=1120, number_of_characters=65, number_of_unicode_scalars=68, ), id="UCS-2 with four bytes extended characters in one segments boundary", ), pytest.param( SegmentTestData( body="🏳️‍🌈23456789012345678901234567890123456789012345678901234567890123456", encoding="UCS-2", segments_count=2, message_size=1136, total_size=1232, number_of_characters=66, number_of_unicode_scalars=69, ), id="UCS-2 with four bytes extended characters in two segments boundary", ), ], ) def test_properties(self, segment_data: SegmentTestData) -> None: message = SegmentedMessage(segment_data.body) assert message.encoding == segment_data.encoding assert len(message.segments) == segment_data.segments_count assert message.segments_count == segment_data.segments_count assert message.message_size == segment_data.message_size assert message.total_size == segment_data.total_size assert message.number_of_characters == segment_data.number_of_characters assert ( message.number_of_unicode_scalars == segment_data.number_of_unicode_scalars )