mirror of
https://github.com/OpenSolo/OpenSolo.git
synced 2025-04-29 22:24:32 +02:00
210 lines
8.0 KiB
Python
210 lines
8.0 KiB
Python
# Unit tests for yawPitchOffsetter
|
|
import mock
|
|
from mock import Mock
|
|
import os
|
|
from os import sys, path
|
|
import struct
|
|
import unittest
|
|
|
|
sys.path.append(os.path.realpath('..'))
|
|
from shotManagerConstants import *
|
|
import yawPitchOffsetter
|
|
|
|
class TestInit(unittest.TestCase):
|
|
def testInit(self):
|
|
""" test initial variables """
|
|
setter = yawPitchOffsetter.YawPitchOffsetter()
|
|
self.assertEquals( setter.yawOffset, 0.0 )
|
|
self.assertEquals( setter.pitchOffset, 0.0 )
|
|
self.assertTrue( setter.handlePitch )
|
|
self.assertTrue( setter.isNudge )
|
|
|
|
def testNoHandlePitch(self):
|
|
""" Test if we set handlePitch to False """
|
|
setter = yawPitchOffsetter.YawPitchOffsetter(False)
|
|
self.assertFalse( setter.handlePitch )
|
|
|
|
class TestUpdate(unittest.TestCase):
|
|
def setUp(self):
|
|
self.setter = yawPitchOffsetter.YawPitchOffsetter()
|
|
self.setter.offsetYaw = Mock()
|
|
self.setter.offsetPitch = Mock()
|
|
|
|
def testChan3ToYaw(self):
|
|
""" Channel 3 is used to offset yaw """
|
|
channels = [0.0, 1.0, 0.0, 0.3, 0.0, 0.0, 0.0, 0.0]
|
|
self.setter.Update( channels )
|
|
self.setter.offsetYaw.assert_called_with( 0.3 )
|
|
|
|
def testChan7Pitch(self):
|
|
""" When abs(chan7) > abs (chan0) it's used for pitch """
|
|
channels = [0.3, 1.0, 0.0, 0.3, 0.0, 0.0, 0.0, -0.8]
|
|
self.setter.Update( channels )
|
|
self.setter.offsetPitch.assert_called_with( -0.8 )
|
|
|
|
def testChan0Pitch(self):
|
|
""" When abs(chan0) > abs (chan7) it's used for pitch """
|
|
channels = [0.38, 1.0, 0.0, 0.3, 0.0, 0.0, 0.0, -0.142]
|
|
self.setter.Update( channels )
|
|
self.setter.offsetPitch.assert_called_with( 0.38 )
|
|
|
|
def testUpdateNoChange(self):
|
|
""" Update should return false if neither yawOffset nor pitchOffset change """
|
|
channels = [0.38, 1.0, 0.0, 0.3, 0.0, 0.0, 0.0, -0.142]
|
|
result = self.setter.Update( channels )
|
|
self.assertFalse( result )
|
|
|
|
def testUpdateYawChange(self):
|
|
""" Update should return true if yawOffset changes """
|
|
def alter(a):
|
|
self.setter.yawOffset = 20.0
|
|
|
|
channels = [0.38, 1.0, 0.0, 0.3, 0.0, 0.0, 0.0, -0.142]
|
|
self.setter.offsetYaw = Mock(side_effect = alter )
|
|
result = self.setter.Update( channels )
|
|
self.assertTrue( result )
|
|
|
|
def testUpdatePitchChange(self):
|
|
""" Update should return true if pitchOffset changes """
|
|
def alter(a):
|
|
self.setter.pitchOffset = 20.0
|
|
|
|
channels = [0.38, 1.0, 0.0, 0.3, 0.0, 0.0, 0.0, -0.142]
|
|
self.setter.offsetPitch = Mock(side_effect = alter )
|
|
result = self.setter.Update( channels )
|
|
self.assertTrue( result )
|
|
|
|
class TestOffsetYaw(unittest.TestCase):
|
|
def setUp(self):
|
|
self.setter = yawPitchOffsetter.YawPitchOffsetter()
|
|
|
|
def testOffsetYawOnce(self):
|
|
""" offset yaw once """
|
|
self.setter.offsetYaw( 0.5 )
|
|
self.assertEquals( self.setter.yawOffset, 0.5 * yawPitchOffsetter.YAW_OFFSET_SPEED * UPDATE_TIME )
|
|
|
|
def testOffsetYawNeg10x(self):
|
|
""" offset yaw 10 x in the negative direction """
|
|
startYaw = 20.2
|
|
self.setter.yawOffset = startYaw
|
|
for i in range(10):
|
|
self.setter.offsetYaw( -0.3 )
|
|
startYaw -= 0.3 * yawPitchOffsetter.YAW_OFFSET_SPEED * UPDATE_TIME
|
|
self.assertEquals( self.setter.yawOffset, startYaw )
|
|
self.assertEquals( self.setter.yawDir, -1 )
|
|
|
|
def testReturnToZero(self):
|
|
""" Eventually this yawOffset should return to zero """
|
|
self.setter.yawOffset = 80.5
|
|
for i in range(1000):
|
|
self.setter.offsetYaw( 0.00 )
|
|
self.assertEquals( self.setter.yawOffset, 0.0 )
|
|
self.assertEquals( self.setter.yawDir, 1 )
|
|
|
|
def testNoReturnToZero(self):
|
|
""" If nudge mode is off we do not return to zero """
|
|
self.setter.yawOffset = 30.5
|
|
self.setter.isNudge = False
|
|
for i in range(100):
|
|
self.setter.offsetYaw( 0.0 )
|
|
self.assertEquals( self.setter.yawOffset, 30.5 )
|
|
|
|
def testYawBounds(self):
|
|
""" Should not go past YAW_OFFSET_THRESHOLD """
|
|
self.setter.yawOffset = -59.5
|
|
for i in range(1000):
|
|
self.setter.offsetYaw( -1.0 )
|
|
self.assertEquals( self.setter.yawOffset, -yawPitchOffsetter.YAW_OFFSET_THRESHOLD )
|
|
|
|
def testNoYawBounds(self):
|
|
""" In non-nudge mode, we are unconstrained, except for keeping things in the (0, 360) range """
|
|
startYaw = 18.546584
|
|
self.setter.yawOffset = startYaw
|
|
self.setter.isNudge = False
|
|
for i in range(1000):
|
|
self.setter.offsetYaw( -0.8 )
|
|
startYaw -= 0.8 * yawPitchOffsetter.YAW_OFFSET_SPEED * UPDATE_TIME
|
|
if startYaw < 0.0:
|
|
startYaw += 360.0
|
|
self.assertEquals( self.setter.yawOffset, startYaw )
|
|
|
|
class TestOffsetPitch(unittest.TestCase):
|
|
def setUp(self):
|
|
self.setter = yawPitchOffsetter.YawPitchOffsetter()
|
|
|
|
def testOffsetPitchOnce(self):
|
|
""" offset pitch once """
|
|
self.setter.offsetPitch( 0.22 )
|
|
self.assertEquals( self.setter.pitchOffset, 0.22 * yawPitchOffsetter.PITCH_OFFSET_SPEED * UPDATE_TIME )
|
|
|
|
def testOffsetPitchNeg10x(self):
|
|
""" offset pitch 12 x """
|
|
startPitch = 2.8
|
|
self.setter.pitchOffset = startPitch
|
|
for i in range(10):
|
|
self.setter.offsetPitch( 0.6 )
|
|
startPitch += 0.6 * yawPitchOffsetter.PITCH_OFFSET_SPEED * UPDATE_TIME
|
|
self.assertEquals( self.setter.pitchOffset, startPitch )
|
|
|
|
def testReturnToZero(self):
|
|
""" Eventually this pitchOffset should return to zero """
|
|
self.setter.pitchOffset = -26.8
|
|
for i in range(1000):
|
|
self.setter.offsetPitch( 0.02 )
|
|
self.assertEquals( self.setter.yawOffset, 0.0 )
|
|
|
|
def testNoReturnToZero(self):
|
|
""" With nudging off, we do not return to zero """
|
|
self.setter.isNudge = False
|
|
self.setter.pitchOffset = -33.333
|
|
for i in range(100):
|
|
self.setter.offsetPitch( 0.0 )
|
|
self.assertEquals( self.setter.pitchOffset, -33.333 )
|
|
|
|
def testPitchBounds(self):
|
|
"""Should not go past negative PITCH_OFFSET_THRESHOLD """
|
|
self.setter.pitchOffset = -19.5
|
|
for i in range(1000):
|
|
self.setter.offsetPitch( -1.0 )
|
|
self.assertEquals( self.setter.pitchOffset, -yawPitchOffsetter.PITCH_OFFSET_THRESHOLD )
|
|
|
|
def testNoNudgePitchBounds(self):
|
|
""" With nudge off, we have different constraints """
|
|
self.setter.pitchOffset = -19.645
|
|
self.setter.isNudge = False
|
|
for i in range(1000):
|
|
self.setter.offsetPitch( 1.0 )
|
|
self.assertEquals( self.setter.pitchOffset, 0.0 )
|
|
|
|
def testNoNudgePitchBoundsNegative(self):
|
|
""" With nudge off, our constraint is PITCH_OFFSET_NO_NUDGE_THRESHOLD (-90) """
|
|
self.setter.pitchOffset = -19.5
|
|
self.setter.isNudge = False
|
|
for i in range(1000):
|
|
self.setter.offsetPitch( -1.0 )
|
|
self.assertEquals( self.setter.pitchOffset, yawPitchOffsetter.PITCH_OFFSET_NO_NUDGE_THRESHOLD )
|
|
|
|
class TestEnableNudge(unittest.TestCase):
|
|
def testEnableNudge(self):
|
|
""" test that EnableNudge sets isNudge and clears out yaw/pitch offsets """
|
|
setter = yawPitchOffsetter.YawPitchOffsetter()
|
|
setter.isNudge = False
|
|
setter.yawOffset = -17.9
|
|
setter.pitchOffset = 28.9
|
|
setter.enableNudge()
|
|
self.assertTrue(setter.isNudge)
|
|
self.assertEquals(setter.yawOffset, 0.0)
|
|
self.assertEquals(setter.pitchOffset, 0.0)
|
|
|
|
class TestDisableNudge(unittest.TestCase):
|
|
def testDisableNudge(self):
|
|
""" test that DisableNudge sets isNudge to false and initializes yaw/pitch offsets """
|
|
setter = yawPitchOffsetter.YawPitchOffsetter()
|
|
setter.isNudge = True
|
|
setter.yawOffset = -17.9
|
|
setter.pitchOffset = 28.9
|
|
setter.disableNudge( -13.444, 87.56 )
|
|
self.assertFalse(setter.isNudge)
|
|
self.assertEquals(setter.pitchOffset, -13.444)
|
|
self.assertEquals(setter.yawOffset, 87.56)
|