#
# Unit Test Script
# Module Name: cssComm
# Creation Date: October 4, 2018
# Updated On: February 10, 2019
#
import inspect
import os
import pytest
from Basilisk.architecture import messaging
from Basilisk.fswAlgorithms import cssComm
from Basilisk.utilities import SimulationBaseClass
from Basilisk.utilities import macros
from Basilisk.utilities import unitTestSupport # general support file with common unit test functions
filename = inspect.getframeinfo(inspect.currentframe()).filename
path = os.path.dirname(os.path.abspath(filename))
[docs]
@pytest.mark.parametrize("numSensors, sensorData", [
(4, [-100e-6, 200e-6, 600e-6, 300e-6, 200e-6]), # Five data inputs used despite four sensors to ensure all reset conditions are tested.
pytest.param(0, [-100e-6, 200e-6, 600e-6, 300e-6]), # Zero sensor number to ensure all reset conditions are tested
pytest.param(messaging.MAX_NUM_CSS_SENSORS+1, [200e-6]*messaging.MAX_NUM_CSS_SENSORS) # Indicate more sensor devices than is allowed. The output should be clipped to the allowed length
])
def test_cssComm(numSensors, sensorData):
"""Module Unit Test"""
[testResults, testMessage] = cssCommTestFunction(numSensors, sensorData)
assert testResults < 1, testMessage
[docs]
def cssCommTestFunction(numSensors, sensorData):
""" Test the cssComm module """
testFailCount = 0 # zero unit test result counter
testMessages = [] # create empty array to store test log messages
unitTaskName = "unitTask" # arbitrary name (don't change)
unitProcessName = "TestProcess" # arbitrary name (don't change)
# Create a sim module as an empty container
unitTestSim = SimulationBaseClass.SimBaseClass()
# This is needed if multiple unit test scripts are run
# This create a fresh and consistent simulation environment for each test run
# Create test thread
testProcessRate = macros.sec2nano(0.5) # update process rate update time
testProc = unitTestSim.CreateNewProcess(unitProcessName)
testProc.addTask(unitTestSim.CreateNewTask(unitTaskName, testProcessRate)) # Add a new task to the process
# Construct the cssComm module
module = cssComm.cssComm()
# Populate the config
module.numSensors = numSensors
module.maxSensorValue = 500e-6
ChebyList = [-1.734963346951471e+06, 3.294117146099591e+06,
-2.816333294617512e+06, 2.163709942144332e+06,
-1.488025993860025e+06, 9.107359382775769e+05,
-4.919712500291216e+05, 2.318436583511218e+05,
-9.376105045529010e+04, 3.177536873430168e+04,
-8.704033370738143e+03, 1.816188108176300e+03,
-2.581556805090373e+02, 1.888418924282780e+01]
module.chebyCount = len(ChebyList)
module.kellyCheby = ChebyList
module.ModelTag = "cssComm"
# Add the module to the task
unitTestSim.AddModelToTask(unitTaskName, module)
# The cssComm module reads in from the sensor list, so create that message here
cssArrayMsg = messaging.CSSArraySensorMsgPayload()
# NOTE: This is nonsense. These are more or less random numbers
cssArrayMsg.CosValue = sensorData
cssInMsg = messaging.CSSArraySensorMsg().write(cssArrayMsg)
module.sensorListInMsg.subscribeTo(cssInMsg)
# Log the output message
dataLog = module.cssArrayOutMsg.recorder()
unitTestSim.AddModelToTask(unitTaskName, dataLog)
# Initialize the simulation
unitTestSim.InitializeSimulation()
unitTestSim.ConfigureStopTime(testProcessRate)
unitTestSim.ExecuteSimulation()
# Get the output from this simulation
MAX_NUM_CSS_SENSORS = messaging.MAX_NUM_CSS_SENSORS
outputData = dataLog.CosValue
trueCssList= [0]*MAX_NUM_CSS_SENSORS
if numSensors==4:
trueCssList[0:4] = [0.0, 0.45791653042, 1.0, 0.615444781018]
if numSensors==MAX_NUM_CSS_SENSORS+1:
trueCssList = [0.45791653042]*32
# Create the true array
trueCss = [
trueCssList,
trueCssList
]
accuracy = 1e-6
testFailCount, testMessages = unitTestSupport.compareArrayND(trueCss, outputData, accuracy, "cosValues",
MAX_NUM_CSS_SENSORS, testFailCount, testMessages)
# print out success message if no error were found
unitTestSupport.writeTeXSnippet('toleranceValue', str(accuracy), path)
snippentName = "passFail_"+str(numSensors)
if testFailCount == 0:
colorText = 'ForestGreen'
print("PASSED: " + module.ModelTag)
passedText = r'\textcolor{' + colorText + '}{' + "PASSED" + '}'
else:
colorText = 'Red'
print("Failed: " + module.ModelTag)
passedText = r'\textcolor{' + colorText + '}{' + "Failed" + '}'
unitTestSupport.writeTeXSnippet(snippentName, passedText, path)
return [testFailCount, ''.join(testMessages)]
if __name__ == '__main__':
test_cssComm(4, [-100e-6, 200e-6, 600e-6, 300e-6, 200e-6])