"""Tests for python_pkg.moviepy_showcase._moviepy_audio_output."""

from __future__ import annotations

from unittest.mock import MagicMock

import numpy as np

from python_pkg.moviepy_showcase._moviepy_audio_output import (
    _make_sine,
    part4_audio,
    part5_composition,
    part6_drawing_tools,
    part7_output,
)


# ── _make_sine inner maker branches ──────────────────────────────
def test_make_sine_returns_clip() -> None:
    clip = _make_sine(440.0, 2.0)
    assert clip is not None


def test_make_sine_maker_scalar() -> None:
    """maker() with scalar t → t_arr.ndim == 0 → returns 1-D."""
    import moviepy as mp

    mp.AudioClip.side_effect = lambda *_a, **_kw: MagicMock()
    _make_sine(440.0, 1.0)
    maker = mp.AudioClip.call_args[0][0]

    result = maker(0.0)
    assert isinstance(result, np.ndarray)
    assert result.ndim == 1
    assert result.shape == (2,)


def test_make_sine_maker_array() -> None:
    """maker() with array t → t_arr.ndim > 0 → returns 2-D."""
    import moviepy as mp

    mp.AudioClip.side_effect = lambda *_a, **_kw: MagicMock()
    _make_sine(440.0, 1.0)
    maker = mp.AudioClip.call_args[0][0]

    t = np.linspace(0, 1, 100)
    result = maker(t)
    assert isinstance(result, np.ndarray)
    assert result.ndim == 2
    assert result.shape == (100, 2)


# ── part functions ───────────────────────────────────────────────
def test_part4_audio() -> None:
    result = part4_audio()
    assert isinstance(result, list)
    assert len(result) > 0


def test_part5_composition() -> None:
    result = part5_composition()
    assert isinstance(result, list)
    assert len(result) > 0


def test_part6_drawing_tools() -> None:
    result = part6_drawing_tools()
    assert isinstance(result, list)
    assert len(result) > 0


def test_part7_output() -> None:
    result = part7_output()
    assert isinstance(result, list)
    assert len(result) > 0
