Coverage for src/galaxy_beep_frame/frame/header_type/answer.py: 100%

14 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-08-31 04:18 +0200

1"""Answer class.""" 

2 

3from dataclasses import dataclass 

4from typing import TYPE_CHECKING 

5 

6from galaxy_beep_frame.constant import ( 

7 ANSWER_NUMBER_MAX, 

8 ANSWER_NUMBER_MIN, 

9) 

10from galaxy_beep_frame.exception.frame import ( 

11 AboveRangeError, 

12 BelowRangeError, 

13) 

14 

15from .base import HeaderType 

16 

17if TYPE_CHECKING: 

18 from .continuation_indicator import ContinuationIndicator 

19 

20 

21@dataclass(frozen=True) 

22class Answer(HeaderType): 

23 """Answer type.""" 

24 

25 continuation_indicator: ContinuationIndicator 

26 answer_number: int 

27 

28 def __post_init__(self) -> None: 

29 """Check range on sequence number.""" 

30 

31 if self.answer_number < ANSWER_NUMBER_MIN: 

32 raise BelowRangeError( 

33 self.answer_number, 

34 ANSWER_NUMBER_MIN, 

35 "answer number", 

36 ) 

37 if self.answer_number > ANSWER_NUMBER_MAX: 

38 raise AboveRangeError( 

39 self.answer_number, 

40 ANSWER_NUMBER_MAX, 

41 "answer number", 

42 ) 

43 

44 def build(self, size: int) -> bytes: 

45 """Build the header of this Frame.""" 

46 

47 return ( 

48 b"ANS " 

49 + ( 

50 f"{self.state.channel_number} " 

51 f"{self.state.message_number} " 

52 f"{self.continuation_indicator.value} " 

53 f"{self.state.sequence_number} {size} " 

54 f"{self.answer_number}" 

55 ).encode() 

56 )