"""手振り検出のテスト""" import pytest import time from unittest.mock import patch from rock_paper_scissors.detection.wave_detector import WaveDetector class TestWaveDetector: """手振り検出のテスト""" def test_initial_state(self): """初期状態では検出されない""" detector = WaveDetector() assert detector.update(0.5) is False def test_single_position_not_detected(self): """静止した手は検出されない""" detector = WaveDetector() for _ in range(10): result = detector.update(0.5) assert result is False def test_one_direction_not_detected(self): """一方向の移動は検出されない""" detector = WaveDetector() # 左から右へ移動 for i in range(10): result = detector.update(0.3 + i * 0.05) assert result is False def test_wave_pattern_detected(self): """左右の往復運動を検出""" detector = WaveDetector() # 左→右→左の動きをシミュレート positions = [ 0.3, 0.4, 0.5, 0.6, 0.7, # 左→右 0.6, 0.5, 0.4, 0.3, # 右→左 0.4, 0.5, 0.6, # 左→右 ] result = False for pos in positions: result = detector.update(pos) if result: break assert result is True def test_reset_clears_history(self): """リセットで履歴がクリアされる""" detector = WaveDetector() # いくつかデータを追加 for i in range(5): detector.update(0.3 + i * 0.1) detector.reset() # リセット後は検出されない assert detector.update(0.5) is False def test_small_movement_not_detected(self): """小さな動きは検出されない""" detector = WaveDetector() # 小さな往復運動 positions = [ 0.5, 0.51, 0.52, 0.51, 0.5, 0.51, 0.52, 0.51, 0.5, ] result = False for pos in positions: result = detector.update(pos) assert result is False def test_vertical_movement_not_detected(self): """上下運動は検出されない(x座標のみ使用するため)""" detector = WaveDetector() # x座標は固定で報告 for _ in range(10): result = detector.update(0.5) assert result is False class TestMovingAverage: """移動平均のテスト""" def test_moving_average_basic(self): """基本的な移動平均計算""" result = WaveDetector._moving_average([1, 2, 3, 4, 5], window=3) expected = [2.0, 3.0, 4.0] assert result == expected def test_moving_average_short_data(self): """データが短い場合""" result = WaveDetector._moving_average([1, 2], window=3) assert result == [1, 2]