Spaces:
Running
Running
| """手振り検出のテスト""" | |
| 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] | |