"""plotter.py の単体テスト.
仕様 (SPEC_01_アーキテクチャ設計.md):
- plot_luminance_map: ヒートマップを PNG 保存
- plot_histogram: ヒストグラムを PNG 保存
テスト方針 (GUIDE_08_テスト方針.md):
- 出力ファイルが生成されることを確認する程度でよい
- tmp_path フィクスチャを使用
"""
import matplotlib
matplotlib.use("Agg") # GUI なし環境でも動作するバックエンドを設定
from pathlib import Path
import numpy
import pytest
from src.visualization.plotter import plot_histogram, plot_luminance_map
@pytest.fixture
def sample_luminance() -> numpy.ndarray:
"""テスト用の 8x8 輝度画像(float64)を返す fixture."""
return numpy.random.uniform(50.0, 200.0, (8, 8)).astype(numpy.float64)
# ---------------------------------------------------------------------------
# plot_luminance_map テスト
# ---------------------------------------------------------------------------
class TestPlotLuminanceMap:
"""plot_luminance_map 関数のテスト群."""
def test_output_file_is_created(
self, sample_luminance: numpy.ndarray, tmp_path: Path
) -> None:
"""正常: 出力ファイルが生成されること."""
output_path = str(tmp_path / "luminance_map.png")
plot_luminance_map(sample_luminance, output_path)
assert Path(output_path).exists()
def test_output_file_is_not_empty(
self, sample_luminance: numpy.ndarray, tmp_path: Path
) -> None:
"""正常: 出力ファイルが空でないこと(PNG バイナリが書き込まれていること)."""
output_path = str(tmp_path / "luminance_map.png")
plot_luminance_map(sample_luminance, output_path)
assert Path(output_path).stat().st_size > 0
def test_creates_parent_directory_automatically(
self, sample_luminance: numpy.ndarray, tmp_path: Path
) -> None:
"""正常: 出力ディレクトリが存在しない場合に自動作成されること."""
nested_path = str(tmp_path / "figures" / "sub" / "luminance_map.png")
plot_luminance_map(sample_luminance, nested_path)
assert Path(nested_path).exists()
def test_uniform_luminance_is_saved(self, tmp_path: Path) -> None:
"""正常: 均一輝度画像でも正常に保存されること."""
uniform_luminance = numpy.full((8, 8), 128.0, dtype=numpy.float64)
output_path = str(tmp_path / "uniform_map.png")
plot_luminance_map(uniform_luminance, output_path)
assert Path(output_path).exists()
# ---------------------------------------------------------------------------
# plot_histogram テスト
# ---------------------------------------------------------------------------
class TestPlotHistogram:
"""plot_histogram 関数のテスト群."""
def test_output_file_is_created(
self, sample_luminance: numpy.ndarray, tmp_path: Path
) -> None:
"""正常: 出力ファイルが生成されること."""
output_path = str(tmp_path / "histogram.png")
plot_histogram(sample_luminance, output_path)
assert Path(output_path).exists()
def test_output_file_is_not_empty(
self, sample_luminance: numpy.ndarray, tmp_path: Path
) -> None:
"""正常: 出力ファイルが空でないこと."""
output_path = str(tmp_path / "histogram.png")
plot_histogram(sample_luminance, output_path)
assert Path(output_path).stat().st_size > 0
def test_creates_parent_directory_automatically(
self, sample_luminance: numpy.ndarray, tmp_path: Path
) -> None:
"""正常: 出力ディレクトリが存在しない場合に自動作成されること."""
nested_path = str(tmp_path / "figures" / "sub" / "histogram.png")
plot_histogram(sample_luminance, nested_path)
assert Path(nested_path).exists()
def test_uniform_luminance_is_saved(self, tmp_path: Path) -> None:
"""正常: 均一輝度画像でも正常に保存されること."""
uniform_luminance = numpy.full((8, 8), 200.0, dtype=numpy.float64)
output_path = str(tmp_path / "uniform_histogram.png")
plot_histogram(uniform_luminance, output_path)
assert Path(output_path).exists()