import pygitweb.formatting as formatting


def test_to_utf8_returns_string_input_unchanged() -> None:
	assert formatting.to_utf8("hello") == "hello"


def test_to_utf8_decodes_utf8_bytes_successfully() -> None:
	assert formatting.to_utf8("cafe".encode("utf-8")) == "cafe"  # noqa: UP012


def test_to_utf8_uses_fallback_encoding_when_utf8_fails() -> None:
	assert formatting.to_utf8(b"\xf1") == "ñ"


def test_to_utf8_fallback_decode_uses_replace_for_invalid_bytes() -> None:
	original: str = formatting.FALLBACK_ENCODING
	formatting.FALLBACK_ENCODING = "ascii"
	try:
		assert formatting.to_utf8(b"\xffabc") == "\ufffdabc"
	finally:
		formatting.FALLBACK_ENCODING = original


def test_esc_param_encodes_space_and_slash() -> None:
	assert formatting.esc_param("a b/c") == "a+b%2Fc"


def test_esc_path_info_escapes_question_mark() -> None:
	assert formatting.esc_path_info("dir/file?.txt") == "dir/file%3F.txt"


def test_esc_url_keeps_url_safe_characters() -> None:
	assert formatting.esc_url("https://example.com/a b") == "https://example.com/a%20b"


def test_quot_cec_formats_html_and_plain() -> None:
	assert formatting.quot_cec("\n") == '<span class="cntrl">\\n</span>'
	assert formatting.quot_cec("\n", nohtml=True) == "\\n"


def test_quot_upr_formats_html_and_plain() -> None:
	assert formatting.quot_upr("\x01") == '<span class="cntrl">&#9217;</span>'
	assert formatting.quot_upr("\x01", nohtml=True) == "&#9217;"


def test_esc_path_escapes_html_and_control_chars() -> None:
	assert formatting.esc_path("a<\n") == 'a&lt;<span class="cntrl">\\n</span>'


def test_esc_path_nbsp_replaces_spaces() -> None:
	assert formatting.esc_path("a b", nbsp=True) == "a&nbsp;b"


def test_sanitize_preserves_whitespace_controls_and_escapes_others() -> None:
	assert formatting.sanitize("x\t\n\r\x01") == "x\t\n\r\\01"


def test_unquote_unescapes_quoted_sequences() -> None:
	assert formatting.unquote('"a\\tb\\040c"') == "a\tb c"


def test_unquote_returns_input_when_not_wrapped_in_quotes() -> None:
	assert formatting.unquote("plain\\ntext") == "plain\\ntext"


def test_untabify_expands_tabs_to_next_tab_stop() -> None:
	assert formatting.untabify("a\tb", tabwidth=4) == "a   b"