Newer
Older
SmTIAS-Evaluation / tests / visualization / test_plotter.py
"""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()