OpenSolo/shotmanager/Test/TestYawPitchOffsetter.py

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)