Newer
Older
SmTIAS-LightSim / tests / conftest.py
"""共通フィクスチャ.

全テストモジュールから利用可能な pytest フィクスチャを定義する.
"""

import numpy
import pytest


@pytest.fixture(scope="session", autouse=True)
def mitsuba_variant():
    """セッション全体で Mitsuba variant を 1 度だけ設定する.

    mi.ScalarTransform4f 等の Mitsuba 型はモジュールインポート後に
    set_variant を呼ぶまでアクセスできない.軽量テスト(build_*_dict 系)も
    to_world 生成で内部的に mi.ScalarTransform4f を使うため,
    セッション開始時に variant を設定しておく必要がある.

    GUIDE_08: Mitsuba をモックしない方針に従い実ライブラリを使用する.
    """
    import mitsuba as mi

    # この環境では LLVM バックエンドが利用できないため scalar_rgb を使用する.
    # baker.py も scalar_rgb を要求しており,テスト全体で統一する.
    # llvm_ad_rgb が利用可能な環境では "llvm_ad_rgb" に変更すること.
    mi.set_variant("scalar_rgb")


@pytest.fixture
def uniform_luminance_100x100() -> numpy.ndarray:
    """全画素が 100.0 の (100, 100) 輝度配列."""
    return numpy.full((100, 100), 100.0, dtype=numpy.float64)


@pytest.fixture
def radial_gradient_luminance_100x100() -> numpy.ndarray:
    """中心が明るく周辺が暗い放射グラジェント輝度配列 (100, 100).

    正規化楕円距離 d を用いて 200 - 100 * d で合成する.
    中心 (d=0) で 200,周辺 (d=1) で 100 程度となる.
    """
    from sm_tias_lightsim.evaluation.zones import compute_normalized_distance_map

    d = compute_normalized_distance_map(100, 100)
    return (200.0 - 100.0 * d).astype(numpy.float64)


@pytest.fixture
def red_pixel() -> numpy.ndarray:
    """純赤 (255, 0, 0) の 1x1 uint8 RGB 画像."""
    return numpy.array([[[255, 0, 0]]], dtype=numpy.uint8)


@pytest.fixture
def green_pixel() -> numpy.ndarray:
    """純緑 (0, 255, 0) の 1x1 uint8 RGB 画像."""
    return numpy.array([[[0, 255, 0]]], dtype=numpy.uint8)


@pytest.fixture
def blue_pixel() -> numpy.ndarray:
    """純青 (0, 0, 255) の 1x1 uint8 RGB 画像."""
    return numpy.array([[[0, 0, 255]]], dtype=numpy.uint8)