#
#   Unit Test Script
#   Module Name:        vehicleConfigData
#   Creation Date:      October 5, 2018
#
from Basilisk.utilities import SimulationBaseClass
from Basilisk.utilities import unitTestSupport  # general support file with common unit test functions
from Basilisk.utilities import macros
from Basilisk.fswAlgorithms.vehicleConfigData import vehicleConfigData
[docs]def test_vehicleConfigData():
    """Module Unit Test"""
    [testResults, testMessage] = vehicleConfigDataTestFunction() 
[docs]def vehicleConfigDataTestFunction():
    """ Test the vehicleConfigData 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
    moduleConfig = vehicleConfigData.VehConfigInputData() # Create a config struct
    # Populate the config
    I = [1000., 0., 0.,
         0., 800., 0.,
         0., 0., 800.]
    moduleConfig.ISCPntB_B = I
    initialCoM = [1, 1, 1]
    moduleConfig.CoM_B = initialCoM
    moduleConfig.outputPropsName = "outputProps"
    moduleWrap = unitTestSim.setModelDataWrap(moduleConfig) # This calls the algContain to setup the selfInit, crossInit, and update
    moduleWrap.ModelTag = "vehicleConfigData"
    # Add the module to the task
    unitTestSim.AddModelToTask(unitTaskName, moduleWrap, moduleConfig)
    # Log the output message
    # unitTestSim.AddVariableForLogging('vehicleConfigData.ISCPntB_B', testProcessRate, 0, 8)
    # unitTestSim.AddVariableForLogging('vehicleConfigData.CoM_B', testProcessRate, 0, 2)
    unitTestSim.TotalSim.logThisMessage(moduleConfig.outputPropsName, testProcessRate)
    # Initialize the simulation
    unitTestSim.InitializeSimulation()
    unitTestSim.ConfigureStopTime(testProcessRate)
    unitTestSim.ExecuteSimulation()
    # Get the output from this simulation
    # Ilog = unitTestSim.GetLogVariableData('vehicleConfigData.ISCPntB_B')
    # CoMLog = unitTestSim.GetLogVariableData('vehicleConfigData.CoM_B')
    Ilog = unitTestSim.pullMessageLogData(moduleConfig.outputPropsName+'.ISCPntB_B', list(range(9)))
    CoMLog = unitTestSim.pullMessageLogData(moduleConfig.outputPropsName+'.CoM_B', list(range(3)))
    accuracy = 1e-6
    # At each timestep, make sure the vehicleConfig values haven't changed from the initial values
    testFailCount, testMessages = unitTestSupport.compareArrayND([initialCoM for _ in range(len(CoMLog))], CoMLog, accuracy,
                                                                 "VehicleConfigData CoM",
                                                                 3, testFailCount, testMessages)
    testFailCount, testMessages = unitTestSupport.compareArrayND([I for _ in range(len(Ilog))], Ilog, accuracy,
                                                                 "VehicleConfigData I",
                                                                 3, testFailCount, testMessages)
    if testFailCount == 0:
        print("PASSED: " + moduleWrap.ModelTag)
    return [testFailCount, ''.join(testMessages)] 
if __name__ == '__main__':
    test_vehicleConfigData()