rock_paper_scissors / tests /test_wave_detector.py
trtd56's picture
Initial commit
24836e5
"""手振り検出のテスト"""
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]