Add text analyzer tests
This commit is contained in:
190
tests/test_core.py
Normal file
190
tests/test_core.py
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
"""Tests for text analyzer core."""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from text_analyzer.core import (
|
||||||
|
TextStatistics,
|
||||||
|
analyze_file,
|
||||||
|
analyze_text,
|
||||||
|
count_words,
|
||||||
|
extract_words,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("text", "expected"),
|
||||||
|
[
|
||||||
|
(
|
||||||
|
"Hello hello world",
|
||||||
|
["hello", "hello", "world"],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"One, two! THREE.",
|
||||||
|
["one", "two", "three"],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Alpha-beta alpha-beta",
|
||||||
|
["alpha-beta", "alpha-beta"],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_extract_words(
|
||||||
|
text: str,
|
||||||
|
expected: list[str],
|
||||||
|
) -> None:
|
||||||
|
"""Test word extraction."""
|
||||||
|
assert extract_words(text) == expected
|
||||||
|
|
||||||
|
|
||||||
|
def test_extract_words_min_len() -> None:
|
||||||
|
"""Test minimum word length."""
|
||||||
|
text = "a bb ccc dddd"
|
||||||
|
|
||||||
|
assert extract_words(
|
||||||
|
text,
|
||||||
|
min_len=3,
|
||||||
|
) == ["ccc", "dddd"]
|
||||||
|
|
||||||
|
|
||||||
|
def test_count_words() -> None:
|
||||||
|
"""Test word frequency counting."""
|
||||||
|
result = count_words(
|
||||||
|
"apple apple banana",
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["apple"] == 2
|
||||||
|
assert result["banana"] == 1
|
||||||
|
|
||||||
|
|
||||||
|
def test_analyze_text() -> None:
|
||||||
|
"""Test complete text analysis."""
|
||||||
|
text = "Apple banana apple.\nBanana orange."
|
||||||
|
|
||||||
|
result = analyze_text(
|
||||||
|
text,
|
||||||
|
top=2,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result == TextStatistics(
|
||||||
|
lines=2,
|
||||||
|
words=5,
|
||||||
|
characters=len(text),
|
||||||
|
top_words=[
|
||||||
|
("apple", 2),
|
||||||
|
("banana", 2),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_empty_text() -> None:
|
||||||
|
"""Test empty text."""
|
||||||
|
result = analyze_text("")
|
||||||
|
|
||||||
|
assert result.lines == 0
|
||||||
|
assert result.words == 0
|
||||||
|
assert result.characters == 0
|
||||||
|
assert result.top_words == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_empty_file(
|
||||||
|
tmp_path: Path,
|
||||||
|
) -> None:
|
||||||
|
"""Test empty file."""
|
||||||
|
path = tmp_path / "empty.txt"
|
||||||
|
path.write_text(
|
||||||
|
"",
|
||||||
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
|
||||||
|
result = analyze_file(path)
|
||||||
|
|
||||||
|
assert result.lines == 0
|
||||||
|
assert result.words == 0
|
||||||
|
assert result.characters == 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_missing_file(
|
||||||
|
tmp_path: Path,
|
||||||
|
) -> None:
|
||||||
|
"""Test missing file."""
|
||||||
|
path = tmp_path / "missing.txt"
|
||||||
|
|
||||||
|
with pytest.raises(FileNotFoundError):
|
||||||
|
analyze_file(path)
|
||||||
|
|
||||||
|
|
||||||
|
def test_invalid_encoding(
|
||||||
|
tmp_path: Path,
|
||||||
|
) -> None:
|
||||||
|
"""Test invalid encoding."""
|
||||||
|
path = tmp_path / "invalid.txt"
|
||||||
|
path.write_bytes(b"\xff")
|
||||||
|
|
||||||
|
with pytest.raises(
|
||||||
|
UnicodeDecodeError,
|
||||||
|
):
|
||||||
|
analyze_file(
|
||||||
|
path,
|
||||||
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("top", "expected"),
|
||||||
|
[
|
||||||
|
(
|
||||||
|
0,
|
||||||
|
[],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
1,
|
||||||
|
[("apple", 3)],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
2,
|
||||||
|
[
|
||||||
|
("apple", 3),
|
||||||
|
("banana", 2),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_top_parameter(
|
||||||
|
top: int,
|
||||||
|
expected: list[tuple[str, int]],
|
||||||
|
) -> None:
|
||||||
|
"""Test top-N parameter."""
|
||||||
|
text = "apple apple apple banana banana orange"
|
||||||
|
|
||||||
|
result = analyze_text(
|
||||||
|
text,
|
||||||
|
top=top,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.top_words == expected
|
||||||
|
|
||||||
|
|
||||||
|
def test_invalid_min_len() -> None:
|
||||||
|
"""Test invalid min_len."""
|
||||||
|
with pytest.raises(
|
||||||
|
ValueError,
|
||||||
|
match="min_len",
|
||||||
|
):
|
||||||
|
analyze_text(
|
||||||
|
"hello",
|
||||||
|
min_len=0,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_invalid_top() -> None:
|
||||||
|
"""Test invalid top."""
|
||||||
|
with pytest.raises(
|
||||||
|
ValueError,
|
||||||
|
match="top",
|
||||||
|
):
|
||||||
|
analyze_text(
|
||||||
|
"hello",
|
||||||
|
top=-1,
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user