"""Tests for text justification functions."""

# local
from wcwidth import ljust, rjust, width, center

SGR_RED = '\x1b[31m'
SGR_RESET = '\x1b[0m'
CJK_WORD = '\u4e2d\u6587'
CAFE_COMBINING = 'cafe\u0301'
EMOJI_FAMILY = '\U0001F468\u200D\U0001F469\u200D\U0001F467'


def test_ljust():
    # our ljust() matches standard python ljust() for ascii
    assert ljust('hi', 5) == 'hi   ' == str.ljust('hi', 5)
    assert ljust('', 5) == '     ' == str.ljust('', 5)
    assert ljust('hello', 3) == 'hello' == str.ljust('hello', 3)
    assert ljust('hello', 5) == 'hello' == str.ljust('hello', 5)
    assert ljust('hi', 5, fillchar='-') == 'hi---' == str.ljust('hi', 5, '-')
    # advanced capabilities
    assert ljust('\x1b[31mhi\x1b[0m', 5) == '\x1b[31mhi\x1b[0m   '
    assert ljust('\u4e2d', 4) == '\u4e2d  '
    assert ljust('hi', 5, fillchar='\u00b7') == 'hi\u00b7\u00b7\u00b7'
    assert ljust(CJK_WORD, 8) == CJK_WORD + '    '
    assert width(ljust(CJK_WORD, 8)) == 8
    assert width(ljust(CAFE_COMBINING, 8)) == 8
    assert width(ljust(EMOJI_FAMILY, 6)) == 6
    text = f'{SGR_RED}hi{SGR_RESET}'
    assert len(ljust(text, 6, control_codes='ignore')) - len(SGR_RED) - len(SGR_RESET) == 6


def test_rjust():
    # our rjust() matches standard python rjust() for ascii
    assert rjust('hi', 5) == '   hi' == str.rjust('hi', 5)
    assert rjust('', 5) == '     ' == str.rjust('', 5)
    assert rjust('hello', 3) == 'hello' == str.rjust('hello', 3)
    assert rjust('hello', 5) == 'hello' == str.rjust('hello', 5)
    assert rjust('hi', 5, fillchar='-') == '---hi' == str.rjust('hi', 5, '-')
    # advanced capabilities
    assert rjust('\x1b[31mhi\x1b[0m', 5) == '   \x1b[31mhi\x1b[0m'
    assert rjust('\u4e2d', 4) == '  \u4e2d'
    assert rjust('hi', 5, fillchar='\u00b7') == '\u00b7\u00b7\u00b7hi'
    assert rjust(CJK_WORD, 8) == '    ' + CJK_WORD
    assert width(rjust(CAFE_COMBINING, 8)) == 8
    assert width(rjust(EMOJI_FAMILY, 6)) == 6


def test_center():
    # our center() matches standard python center() for ascii
    assert center('hi', 6) == '  hi  ' == str.center('hi', 6)
    assert center('hi', 5) == '  hi ' == str.center('hi', 5)
    assert center('ab', 7) == '   ab  ' == str.center('ab', 7)
    assert center('', 4) == '    ' == str.center('', 4)
    assert center('hello', 3) == 'hello' == str.center('hello', 3)
    assert center('hello', 5) == 'hello' == str.center('hello', 5)
    assert center('hi', 6, fillchar='-') == '--hi--' == str.center('hi', 6, '-')
    assert center('x', 4) == ' x  ' == str.center('x', 4)
    # advanced capabilities
    assert center('\x1b[31mhi\x1b[0m', 6) == '  \x1b[31mhi\x1b[0m  '
    assert center('\u4e2d', 6) == '  \u4e2d  '
    assert center('hi', 6, fillchar='\u00b7') == '\u00b7\u00b7hi\u00b7\u00b7'
    assert width(center(CJK_WORD, 8)) == 8
    assert width(center(CAFE_COMBINING, 8)) == 8
    assert width(center(EMOJI_FAMILY, 6)) == 6
