def test_chars(): assert NORMAL_BOX_CHARS.char() is None assert NORMAL_BOX_CHARS.char(top=True, bottom=True) == '│' assert NORMAL_THEN_BOLD_MIXED_BOX_CHARS.char() is None assert NORMAL_THEN_BOLD_MIXED_BOX_CHARS.char(top=1, bottom=-1) == '╿' assert NORMAL_THEN_BOLD_MIXED_BOX_CHARS.char(top=1, bottom=1) == '┃' assert NORMAL_THEN_BOLD_MIXED_BOX_CHARS.char(top=-1, bottom=-1) == '│' assert box_draw_character(None, NORMAL_BOX_CHARS) is None assert box_draw_character(NORMAL_BOX_CHARS, BOLD_BOX_CHARS, top=-1, bottom=+1) == '╽' assert box_draw_character(BOLD_BOX_CHARS, NORMAL_BOX_CHARS, top=-1, bottom=+1) == '╿' assert box_draw_character(DOUBLED_BOX_CHARS, NORMAL_BOX_CHARS, left=-1, bottom=+1) == '╕' assert box_draw_character(NORMAL_BOX_CHARS, DOUBLED_BOX_CHARS, left=-1, bottom=+1) == '╖'
def draw_curve( self, grid_characters: BoxDrawCharacterSet, *, top: bool = False, left: bool = False, right: bool = False, bottom: bool = False, crossing_char: Optional[str] = None, ): """Draws lines in the box using the given character set. Supports merging the new lines with the lines from a previous call to draw_curve, including when they have different character sets (assuming there exist characters merging the two). Args: grid_characters: The character set to draw the curve with. top: Draw topward leg? left: Draw leftward leg? right: Draw rightward leg? bottom: Draw downward leg? crossing_char: Overrides the all-legs-present character. Useful for ascii diagrams, where the + doesn't always look the clearest. """ if not any([top, left, right, bottom]): return # Remember which legs are new, old, or missing. sign_top = +1 if top else -1 if self.top else 0 sign_bottom = +1 if bottom else -1 if self.bottom else 0 sign_left = +1 if left else -1 if self.left else 0 sign_right = +1 if right else -1 if self.right else 0 # Add new segments. if top: self.top = grid_characters.top_bottom if bottom: self.bottom = grid_characters.top_bottom if left: self.left = grid_characters.left_right if right: self.right = grid_characters.left_right # Fill center. if not all( [crossing_char, self.top, self.bottom, self.left, self.right]): crossing_char = box_draw_character( self._prev_curve_grid_chars, grid_characters, top=sign_top, bottom=sign_bottom, left=sign_left, right=sign_right, ) self.center = crossing_char or '' self._prev_curve_grid_chars = grid_characters