From 33a08d5b34ceb7aeb43a62f989e5d356b7374b1c Mon Sep 17 00:00:00 2001 From: PJ Reiniger Date: Fri, 8 Dec 2017 01:42:20 -0500 Subject: [PATCH] Add halsim unit tests (#783) Also adds function that can register all the callbacks at once. Since all of the callbacks issue a string identifier, it makes it possible and easy to have one function callback, and differentiate the path to take based on the string. Hooking up all the callbacks at once makes it easier for the simulator developer to know when something was added to wpilib rather than looking at the commits. --- .../include/MockData/DriverStationData.h | 4 + .../native/cpp/MockData/AnalogInDataTests.cpp | 80 ++++++++++++++++++ .../cpp/MockData/AnalogOutDataTests.cpp | 80 ++++++++++++++++++ .../test/native/cpp/MockData/DIODataTests.cpp | 81 ++++++++++++++++++ .../DriverStationDataTests.cpp} | 0 .../test/native/cpp/MockData/I2CDataTests.cpp | 43 ++++++++++ .../test/native/cpp/MockData/PCMDataTests.cpp | 83 +++++++++++++++++++ .../test/native/cpp/MockData/PDPDataTests.cpp | 43 ++++++++++ .../test/native/cpp/MockData/PWMDataTests.cpp | 78 +++++++++++++++++ .../native/cpp/MockData/RelayDataTests.cpp | 79 ++++++++++++++++++ .../test/native/cpp/MockData/SPIDataTests.cpp | 43 ++++++++++ 11 files changed, 614 insertions(+) create mode 100644 hal/src/test/native/cpp/MockData/AnalogInDataTests.cpp create mode 100644 hal/src/test/native/cpp/MockData/AnalogOutDataTests.cpp create mode 100644 hal/src/test/native/cpp/MockData/DIODataTests.cpp rename hal/src/test/native/cpp/{DriverStationTests.cpp => MockData/DriverStationDataTests.cpp} (100%) create mode 100644 hal/src/test/native/cpp/MockData/I2CDataTests.cpp create mode 100644 hal/src/test/native/cpp/MockData/PCMDataTests.cpp create mode 100644 hal/src/test/native/cpp/MockData/PDPDataTests.cpp create mode 100644 hal/src/test/native/cpp/MockData/PWMDataTests.cpp create mode 100644 hal/src/test/native/cpp/MockData/RelayDataTests.cpp create mode 100644 hal/src/test/native/cpp/MockData/SPIDataTests.cpp diff --git a/hal/src/main/native/include/MockData/DriverStationData.h b/hal/src/main/native/include/MockData/DriverStationData.h index b5df191d37..93cccb685b 100644 --- a/hal/src/main/native/include/MockData/DriverStationData.h +++ b/hal/src/main/native/include/MockData/DriverStationData.h @@ -86,6 +86,10 @@ void HALSIM_RegisterDriverStationAllCallbacks(HAL_NotifyCallback callback, void HALSIM_NotifyDriverStationNewData(void); +void HALSIM_RegisterDriverStationAllCallbacks(HAL_NotifyCallback callback, + void* param, + HAL_Bool initialNotify); + #ifdef __cplusplus } // extern "C" #endif diff --git a/hal/src/test/native/cpp/MockData/AnalogInDataTests.cpp b/hal/src/test/native/cpp/MockData/AnalogInDataTests.cpp new file mode 100644 index 0000000000..ad99ad5fdf --- /dev/null +++ b/hal/src/test/native/cpp/MockData/AnalogInDataTests.cpp @@ -0,0 +1,80 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) 2015-2017 FIRST. All Rights Reserved. */ +/* Open Source Software - may be modified and shared by FRC teams. The code */ +/* must be accompanied by the FIRST BSD license file in the root directory of */ +/* the project. */ +/*----------------------------------------------------------------------------*/ + +#include "HAL/AnalogInput.h" +#include "HAL/HAL.h" +#include "HAL/handles/HandlesInternal.h" +#include "MockData/AnalogInData.h" +#include "gtest/gtest.h" + +namespace hal { + +std::string gTestAnalogInCallbackName; +HAL_Value gTestAnalogInCallbackValue; + +void TestAnalogInInitializationCallback(const char* name, void* param, + const struct HAL_Value* value) { + gTestAnalogInCallbackName = name; + gTestAnalogInCallbackValue = *value; +} + +TEST(AnalogInSimTests, TestAnalogInInitialization) { + const int INDEX_TO_TEST = 1; + + int callbackParam = 0; + int callbackId = HALSIM_RegisterAnalogInInitializedCallback( + INDEX_TO_TEST, &TestAnalogInInitializationCallback, &callbackParam, + false); + ASSERT_TRUE(0 != callbackId); + + int32_t status; + HAL_PortHandle portHandle; + HAL_DigitalHandle analogInHandle; + + // Use out of range index + status = 0; + portHandle = 8000; + gTestAnalogInCallbackName = "Unset"; + analogInHandle = HAL_InitializeAnalogInputPort(portHandle, &status); + EXPECT_EQ(HAL_kInvalidHandle, analogInHandle); + EXPECT_EQ(PARAMETER_OUT_OF_RANGE, status); + EXPECT_STREQ("Unset", gTestAnalogInCallbackName.c_str()); + + // Successful setup + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestAnalogInCallbackName = "Unset"; + analogInHandle = HAL_InitializeAnalogInputPort(portHandle, &status); + EXPECT_TRUE(HAL_kInvalidHandle != analogInHandle); + EXPECT_EQ(0, status); + EXPECT_STREQ("Initialized", gTestAnalogInCallbackName.c_str()); + + // Double initialize... should fail + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestAnalogInCallbackName = "Unset"; + analogInHandle = HAL_InitializeAnalogInputPort(portHandle, &status); + EXPECT_EQ(HAL_kInvalidHandle, analogInHandle); + EXPECT_EQ(RESOURCE_IS_ALLOCATED, status); + EXPECT_STREQ("Unset", gTestAnalogInCallbackName.c_str()); + + // Reset, should allow you to re-register + hal::HandleBase::ResetGlobalHandles(); + HALSIM_ResetAnalogInData(INDEX_TO_TEST); + callbackId = HALSIM_RegisterAnalogInInitializedCallback( + INDEX_TO_TEST, &TestAnalogInInitializationCallback, &callbackParam, + false); + + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestAnalogInCallbackName = "Unset"; + analogInHandle = HAL_InitializeAnalogInputPort(portHandle, &status); + EXPECT_TRUE(HAL_kInvalidHandle != analogInHandle); + EXPECT_EQ(0, status); + EXPECT_STREQ("Initialized", gTestAnalogInCallbackName.c_str()); +} +} // namespace hal diff --git a/hal/src/test/native/cpp/MockData/AnalogOutDataTests.cpp b/hal/src/test/native/cpp/MockData/AnalogOutDataTests.cpp new file mode 100644 index 0000000000..0b7a908154 --- /dev/null +++ b/hal/src/test/native/cpp/MockData/AnalogOutDataTests.cpp @@ -0,0 +1,80 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) 2015-2017 FIRST. All Rights Reserved. */ +/* Open Source Software - may be modified and shared by FRC teams. The code */ +/* must be accompanied by the FIRST BSD license file in the root directory of */ +/* the project. */ +/*----------------------------------------------------------------------------*/ + +#include "HAL/AnalogOutput.h" +#include "HAL/HAL.h" +#include "HAL/handles/HandlesInternal.h" +#include "MockData/AnalogOutData.h" +#include "gtest/gtest.h" + +namespace hal { + +std::string gTestAnalogOutCallbackName; +HAL_Value gTestAnalogOutCallbackValue; + +void TestAnalogOutInitializationCallback(const char* name, void* param, + const struct HAL_Value* value) { + gTestAnalogOutCallbackName = name; + gTestAnalogOutCallbackValue = *value; +} + +TEST(AnalogOutSimTests, TestAnalogOutInitialization) { + const int INDEX_TO_TEST = 1; + + int callbackParam = 0; + int callbackId = HALSIM_RegisterAnalogOutInitializedCallback( + INDEX_TO_TEST, &TestAnalogOutInitializationCallback, &callbackParam, + false); + ASSERT_TRUE(0 != callbackId); + + int32_t status; + HAL_PortHandle portHandle; + HAL_DigitalHandle analogOutHandle; + + // Use out of range index + status = 0; + portHandle = 8000; + gTestAnalogOutCallbackName = "Unset"; + analogOutHandle = HAL_InitializeAnalogOutputPort(portHandle, &status); + EXPECT_EQ(HAL_kInvalidHandle, analogOutHandle); + EXPECT_EQ(PARAMETER_OUT_OF_RANGE, status); + EXPECT_STREQ("Unset", gTestAnalogOutCallbackName.c_str()); + + // Successful setup + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestAnalogOutCallbackName = "Unset"; + analogOutHandle = HAL_InitializeAnalogOutputPort(portHandle, &status); + EXPECT_TRUE(HAL_kInvalidHandle != analogOutHandle); + EXPECT_EQ(0, status); + EXPECT_STREQ("Initialized", gTestAnalogOutCallbackName.c_str()); + + // Double initialize... should fail + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestAnalogOutCallbackName = "Unset"; + analogOutHandle = HAL_InitializeAnalogOutputPort(portHandle, &status); + EXPECT_EQ(HAL_kInvalidHandle, analogOutHandle); + EXPECT_EQ(RESOURCE_IS_ALLOCATED, status); + EXPECT_STREQ("Unset", gTestAnalogOutCallbackName.c_str()); + + // Reset, should allow you to re-register + hal::HandleBase::ResetGlobalHandles(); + HALSIM_ResetAnalogOutData(INDEX_TO_TEST); + callbackId = HALSIM_RegisterAnalogOutInitializedCallback( + INDEX_TO_TEST, &TestAnalogOutInitializationCallback, &callbackParam, + false); + + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestAnalogOutCallbackName = "Unset"; + analogOutHandle = HAL_InitializeAnalogOutputPort(portHandle, &status); + EXPECT_TRUE(HAL_kInvalidHandle != analogOutHandle); + EXPECT_EQ(0, status); + EXPECT_STREQ("Initialized", gTestAnalogOutCallbackName.c_str()); +} +} // namespace hal diff --git a/hal/src/test/native/cpp/MockData/DIODataTests.cpp b/hal/src/test/native/cpp/MockData/DIODataTests.cpp new file mode 100644 index 0000000000..4529c7814e --- /dev/null +++ b/hal/src/test/native/cpp/MockData/DIODataTests.cpp @@ -0,0 +1,81 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) 2015-2017 FIRST. All Rights Reserved. */ +/* Open Source Software - may be modified and shared by FRC teams. The code */ +/* must be accompanied by the FIRST BSD license file in the root directory of */ +/* the project. */ +/*----------------------------------------------------------------------------*/ + +#include "HAL/DIO.h" +#include "HAL/HAL.h" +#include "HAL/handles/HandlesInternal.h" +#include "MockData/DIOData.h" +#include "gtest/gtest.h" + +namespace hal { + +std::string gTestDigitalIoCallbackName; +HAL_Value gTestDigitalIoCallbackValue; + +void TestDigitalIoInitializationCallback(const char* name, void* param, + const struct HAL_Value* value) { + gTestDigitalIoCallbackName = name; + gTestDigitalIoCallbackValue = *value; +} + +TEST(DigitalIoSimTests, TestDigitalIoInitialization) { + const int INDEX_TO_TEST = 3; + + int callbackParam = 0; + int callbackId = HALSIM_RegisterDIOInitializedCallback( + INDEX_TO_TEST, &TestDigitalIoInitializationCallback, &callbackParam, + false); + ASSERT_TRUE(0 != callbackId); + + int32_t status; + HAL_PortHandle portHandle; + HAL_DigitalHandle digitalIoHandle; + + // Use out of range index + status = 0; + portHandle = 8000; + gTestDigitalIoCallbackName = "Unset"; + digitalIoHandle = HAL_InitializeDIOPort(portHandle, true, &status); + EXPECT_EQ(HAL_kInvalidHandle, digitalIoHandle); + EXPECT_EQ(PARAMETER_OUT_OF_RANGE, status); + EXPECT_STREQ("Unset", gTestDigitalIoCallbackName.c_str()); + + // Successful setup + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestDigitalIoCallbackName = "Unset"; + digitalIoHandle = HAL_InitializeDIOPort(portHandle, true, &status); + EXPECT_TRUE(HAL_kInvalidHandle != digitalIoHandle); + EXPECT_EQ(0, status); + EXPECT_STREQ("Initialized", gTestDigitalIoCallbackName.c_str()); + + // Double initialize... should fail + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestDigitalIoCallbackName = "Unset"; + digitalIoHandle = HAL_InitializeDIOPort(portHandle, true, &status); + EXPECT_EQ(HAL_kInvalidHandle, digitalIoHandle); + EXPECT_EQ(RESOURCE_IS_ALLOCATED, status); + EXPECT_STREQ("Unset", gTestDigitalIoCallbackName.c_str()); + + // Reset, should allow you to re-register + hal::HandleBase::ResetGlobalHandles(); + HALSIM_ResetDIOData(INDEX_TO_TEST); + callbackId = HALSIM_RegisterDIOInitializedCallback( + INDEX_TO_TEST, &TestDigitalIoInitializationCallback, &callbackParam, + false); + + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestDigitalIoCallbackName = "Unset"; + digitalIoHandle = HAL_InitializeDIOPort(portHandle, true, &status); + EXPECT_TRUE(HAL_kInvalidHandle != digitalIoHandle); + EXPECT_EQ(0, status); + EXPECT_STREQ("Initialized", gTestDigitalIoCallbackName.c_str()); +} + +} // namespace hal diff --git a/hal/src/test/native/cpp/DriverStationTests.cpp b/hal/src/test/native/cpp/MockData/DriverStationDataTests.cpp similarity index 100% rename from hal/src/test/native/cpp/DriverStationTests.cpp rename to hal/src/test/native/cpp/MockData/DriverStationDataTests.cpp diff --git a/hal/src/test/native/cpp/MockData/I2CDataTests.cpp b/hal/src/test/native/cpp/MockData/I2CDataTests.cpp new file mode 100644 index 0000000000..25baf98868 --- /dev/null +++ b/hal/src/test/native/cpp/MockData/I2CDataTests.cpp @@ -0,0 +1,43 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) 2015-2017 FIRST. All Rights Reserved. */ +/* Open Source Software - may be modified and shared by FRC teams. The code */ +/* must be accompanied by the FIRST BSD license file in the root directory of */ +/* the project. */ +/*----------------------------------------------------------------------------*/ + +#include "HAL/HAL.h" +#include "HAL/I2C.h" +#include "HAL/handles/HandlesInternal.h" +#include "MockData/I2CData.h" +#include "gtest/gtest.h" + +namespace hal { + +std::string gTestI2CCallbackName; +HAL_Value gTestI2CCallbackValue; + +void TestI2CInitializationCallback(const char* name, void* param, + const struct HAL_Value* value) { + gTestI2CCallbackName = name; + gTestI2CCallbackValue = *value; +} + +TEST(I2CSimTests, TestI2CInitialization) { + const int INDEX_TO_TEST = 1; + + int32_t status; + HAL_I2CPort port; + + int callbackParam = 0; + int callbackId = HALSIM_RegisterI2CInitializedCallback( + INDEX_TO_TEST, &TestI2CInitializationCallback, &callbackParam, false); + ASSERT_TRUE(0 != callbackId); + + status = 0; + port = HAL_I2C_kMXP; + gTestI2CCallbackName = "Unset"; + HAL_InitializeI2C(port, &status); + EXPECT_STREQ("Initialized", gTestI2CCallbackName.c_str()); +} + +} // namespace hal diff --git a/hal/src/test/native/cpp/MockData/PCMDataTests.cpp b/hal/src/test/native/cpp/MockData/PCMDataTests.cpp new file mode 100644 index 0000000000..27f66a69ae --- /dev/null +++ b/hal/src/test/native/cpp/MockData/PCMDataTests.cpp @@ -0,0 +1,83 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) 2015-2017 FIRST. All Rights Reserved. */ +/* Open Source Software - may be modified and shared by FRC teams. The code */ +/* must be accompanied by the FIRST BSD license file in the root directory of */ +/* the project. */ +/*----------------------------------------------------------------------------*/ + +#include "HAL/HAL.h" +#include "HAL/Solenoid.h" +#include "HAL/handles/HandlesInternal.h" +#include "MockData/PCMData.h" +#include "gtest/gtest.h" + +namespace hal { + +std::string gTestSolenoidCallbackName; +HAL_Value gTestSolenoidCallbackValue; + +void TestSolenoidInitializationCallback(const char* name, void* param, + const struct HAL_Value* value) { + gTestSolenoidCallbackName = name; + gTestSolenoidCallbackValue = *value; +} + +TEST(SolenoidSimTests, TestSolenoidInitialization) { + const int MODULE_TO_TEST = 2; + const int CHANNEL_TO_TEST = 3; + + int callbackParam = 0; + int callbackId = HALSIM_RegisterPCMSolenoidInitializedCallback( + MODULE_TO_TEST, CHANNEL_TO_TEST, &TestSolenoidInitializationCallback, + &callbackParam, false); + ASSERT_TRUE(0 != callbackId); + + int32_t status; + HAL_PortHandle portHandle; + HAL_DigitalHandle solenoidHandle; + + // Use out of range index + status = 0; + portHandle = 8000; + gTestSolenoidCallbackName = "Unset"; + solenoidHandle = HAL_InitializeSolenoidPort(portHandle, &status); + EXPECT_EQ(HAL_kInvalidHandle, solenoidHandle); + EXPECT_EQ(HAL_HANDLE_ERROR, status); + EXPECT_STREQ("Unset", gTestSolenoidCallbackName.c_str()); + + // Successful setup + status = 0; + portHandle = HAL_GetPortWithModule(MODULE_TO_TEST, CHANNEL_TO_TEST); + gTestSolenoidCallbackName = "Unset"; + solenoidHandle = HAL_InitializeSolenoidPort(portHandle, &status); + EXPECT_TRUE(HAL_kInvalidHandle != solenoidHandle); + EXPECT_EQ(0, status); + EXPECT_STREQ("SolenoidInitialized", gTestSolenoidCallbackName.c_str()); + + // Double initialize... should fail + status = 0; + portHandle = HAL_GetPortWithModule(MODULE_TO_TEST, CHANNEL_TO_TEST); + gTestSolenoidCallbackName = "Unset"; + solenoidHandle = HAL_InitializeSolenoidPort(portHandle, &status); + EXPECT_EQ(HAL_kInvalidHandle, solenoidHandle); + EXPECT_EQ(NO_AVAILABLE_RESOURCES, status); + EXPECT_STREQ("Unset", gTestSolenoidCallbackName.c_str()); + + // Reset, should allow you to re-register + hal::HandleBase::ResetGlobalHandles(); + HALSIM_ResetPCMData(MODULE_TO_TEST); + callbackId = HALSIM_RegisterPCMSolenoidInitializedCallback( + MODULE_TO_TEST, CHANNEL_TO_TEST, &TestSolenoidInitializationCallback, + &callbackParam, false); + ASSERT_TRUE(0 != callbackId); + + status = 0; + portHandle = HAL_GetPortWithModule(MODULE_TO_TEST, CHANNEL_TO_TEST); + gTestSolenoidCallbackName = "Unset"; + solenoidHandle = HAL_InitializeSolenoidPort(portHandle, &status); + EXPECT_TRUE(HAL_kInvalidHandle != solenoidHandle); + EXPECT_EQ(0, status); + EXPECT_STREQ("SolenoidInitialized", gTestSolenoidCallbackName.c_str()); +} + +} // namespace hal diff --git a/hal/src/test/native/cpp/MockData/PDPDataTests.cpp b/hal/src/test/native/cpp/MockData/PDPDataTests.cpp new file mode 100644 index 0000000000..a745e70aa0 --- /dev/null +++ b/hal/src/test/native/cpp/MockData/PDPDataTests.cpp @@ -0,0 +1,43 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) 2015-2017 FIRST. All Rights Reserved. */ +/* Open Source Software - may be modified and shared by FRC teams. The code */ +/* must be accompanied by the FIRST BSD license file in the root directory of */ +/* the project. */ +/*----------------------------------------------------------------------------*/ + +#include "HAL/HAL.h" +#include "HAL/PDP.h" +#include "HAL/handles/HandlesInternal.h" +#include "MockData/PDPData.h" +#include "gtest/gtest.h" + +namespace hal { + +std::string gTestPdpCallbackName; +HAL_Value gTestPdpCallbackValue; + +void TestPdpInitializationCallback(const char* name, void* param, + const struct HAL_Value* value) { + gTestPdpCallbackName = name; + gTestPdpCallbackValue = *value; +} + +TEST(PdpSimTests, TestPdpInitialization) { + const int INDEX_TO_TEST = 1; + + int callbackParam = 0; + int callbackId = HALSIM_RegisterPDPInitializedCallback( + INDEX_TO_TEST, &TestPdpInitializationCallback, &callbackParam, false); + ASSERT_TRUE(0 != callbackId); + + int32_t status; + + // Use out of range index + status = 0; + gTestPdpCallbackName = "Unset"; + HAL_InitializePDP(INDEX_TO_TEST, &status); + EXPECT_EQ(0, status); + EXPECT_STREQ("Initialized", gTestPdpCallbackName.c_str()); +} + +} // namespace hal diff --git a/hal/src/test/native/cpp/MockData/PWMDataTests.cpp b/hal/src/test/native/cpp/MockData/PWMDataTests.cpp new file mode 100644 index 0000000000..9210845c1e --- /dev/null +++ b/hal/src/test/native/cpp/MockData/PWMDataTests.cpp @@ -0,0 +1,78 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) 2015-2017 FIRST. All Rights Reserved. */ +/* Open Source Software - may be modified and shared by FRC teams. The code */ +/* must be accompanied by the FIRST BSD license file in the root directory of */ +/* the project. */ +/*----------------------------------------------------------------------------*/ + +#include "HAL/HAL.h" +#include "HAL/PWM.h" +#include "HAL/handles/HandlesInternal.h" +#include "MockData/PWMData.h" +#include "gtest/gtest.h" + +namespace hal { + +std::string gTestPwmCallbackName; +HAL_Value gTestPwmCallbackValue; + +void TestPwmInitializationCallback(const char* name, void* param, + const struct HAL_Value* value) { + gTestPwmCallbackName = name; + gTestPwmCallbackValue = *value; +} + +TEST(PWMSimTests, TestPwmInitialization) { + const int INDEX_TO_TEST = 7; + + int callbackParam = 0; + int callbackId = HALSIM_RegisterPWMInitializedCallback( + INDEX_TO_TEST, &TestPwmInitializationCallback, &callbackParam, false); + ASSERT_TRUE(0 != callbackId); + + int32_t status; + HAL_PortHandle portHandle; + HAL_DigitalHandle pwmHandle; + + // Use out of range index + status = 0; + portHandle = 8000; + gTestPwmCallbackName = "Unset"; + pwmHandle = HAL_InitializePWMPort(portHandle, &status); + EXPECT_EQ(HAL_kInvalidHandle, pwmHandle); + EXPECT_EQ(PARAMETER_OUT_OF_RANGE, status); + EXPECT_STREQ("Unset", gTestPwmCallbackName.c_str()); + + // Successful setup + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestPwmCallbackName = "Unset"; + pwmHandle = HAL_InitializePWMPort(portHandle, &status); + EXPECT_TRUE(HAL_kInvalidHandle != pwmHandle); + EXPECT_EQ(0, status); + EXPECT_STREQ("Initialized", gTestPwmCallbackName.c_str()); + + // Double initialize... should fail + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestPwmCallbackName = "Unset"; + pwmHandle = HAL_InitializePWMPort(portHandle, &status); + EXPECT_EQ(HAL_kInvalidHandle, pwmHandle); + EXPECT_EQ(RESOURCE_IS_ALLOCATED, status); + EXPECT_STREQ("Unset", gTestPwmCallbackName.c_str()); + + // Reset, should allow you to re-register + hal::HandleBase::ResetGlobalHandles(); + HALSIM_ResetPWMData(INDEX_TO_TEST); + callbackId = HALSIM_RegisterPWMInitializedCallback( + INDEX_TO_TEST, &TestPwmInitializationCallback, &callbackParam, false); + + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestPwmCallbackName = "Unset"; + pwmHandle = HAL_InitializePWMPort(portHandle, &status); + EXPECT_TRUE(HAL_kInvalidHandle != pwmHandle); + EXPECT_EQ(0, status); + EXPECT_STREQ("Initialized", gTestPwmCallbackName.c_str()); +} +} // namespace hal diff --git a/hal/src/test/native/cpp/MockData/RelayDataTests.cpp b/hal/src/test/native/cpp/MockData/RelayDataTests.cpp new file mode 100644 index 0000000000..0015dac1a2 --- /dev/null +++ b/hal/src/test/native/cpp/MockData/RelayDataTests.cpp @@ -0,0 +1,79 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) 2015-2017 FIRST. All Rights Reserved. */ +/* Open Source Software - may be modified and shared by FRC teams. The code */ +/* must be accompanied by the FIRST BSD license file in the root directory of */ +/* the project. */ +/*----------------------------------------------------------------------------*/ + +#include "HAL/HAL.h" +#include "HAL/Relay.h" +#include "HAL/handles/HandlesInternal.h" +#include "MockData/RelayData.h" +#include "gtest/gtest.h" + +namespace hal { + +std::string gTestRelayCallbackName; +HAL_Value gTestRelayCallbackValue; + +void TestRelayInitializationCallback(const char* name, void* param, + const struct HAL_Value* value) { + gTestRelayCallbackName = name; + gTestRelayCallbackValue = *value; +} + +TEST(RelaySimTests, TestRelayInitialization) { + const int INDEX_TO_TEST = 3; + + int callbackParam = 0; + int callbackId = HALSIM_RegisterRelayInitializedForwardCallback( + INDEX_TO_TEST, &TestRelayInitializationCallback, &callbackParam, false); + ASSERT_TRUE(0 != callbackId); + + int32_t status; + HAL_PortHandle portHandle; + HAL_DigitalHandle pdpHandle; + + // Use out of range index + status = 0; + portHandle = 8000; + gTestRelayCallbackName = "Unset"; + pdpHandle = HAL_InitializeRelayPort(portHandle, true, &status); + EXPECT_EQ(HAL_kInvalidHandle, pdpHandle); + EXPECT_EQ(PARAMETER_OUT_OF_RANGE, status); + EXPECT_STREQ("Unset", gTestRelayCallbackName.c_str()); + + // Successful setup + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestRelayCallbackName = "Unset"; + pdpHandle = HAL_InitializeRelayPort(portHandle, true, &status); + EXPECT_TRUE(HAL_kInvalidHandle != pdpHandle); + EXPECT_EQ(0, status); + EXPECT_STREQ("InitializedForward", gTestRelayCallbackName.c_str()); + + // Double initialize... should fail + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestRelayCallbackName = "Unset"; + pdpHandle = HAL_InitializeRelayPort(portHandle, true, &status); + EXPECT_EQ(HAL_kInvalidHandle, pdpHandle); + EXPECT_EQ(RESOURCE_IS_ALLOCATED, status); + EXPECT_STREQ("Unset", gTestRelayCallbackName.c_str()); + + // Reset, should allow you to re-register + hal::HandleBase::ResetGlobalHandles(); + HALSIM_ResetRelayData(INDEX_TO_TEST); + callbackId = HALSIM_RegisterRelayInitializedForwardCallback( + INDEX_TO_TEST, &TestRelayInitializationCallback, &callbackParam, false); + + status = 0; + portHandle = HAL_GetPort(INDEX_TO_TEST); + gTestRelayCallbackName = "Unset"; + pdpHandle = HAL_InitializeRelayPort(portHandle, true, &status); + EXPECT_TRUE(HAL_kInvalidHandle != pdpHandle); + EXPECT_EQ(0, status); + EXPECT_STREQ("InitializedForward", gTestRelayCallbackName.c_str()); +} + +} // namespace hal diff --git a/hal/src/test/native/cpp/MockData/SPIDataTests.cpp b/hal/src/test/native/cpp/MockData/SPIDataTests.cpp new file mode 100644 index 0000000000..e75fe02d76 --- /dev/null +++ b/hal/src/test/native/cpp/MockData/SPIDataTests.cpp @@ -0,0 +1,43 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) 2015-2017 FIRST. All Rights Reserved. */ +/* Open Source Software - may be modified and shared by FRC teams. The code */ +/* must be accompanied by the FIRST BSD license file in the root directory of */ +/* the project. */ +/*----------------------------------------------------------------------------*/ + +#include "HAL/HAL.h" +#include "HAL/SPI.h" +#include "HAL/handles/HandlesInternal.h" +#include "MockData/SPIData.h" +#include "gtest/gtest.h" + +namespace hal { + +std::string gTestSpiCallbackName; +HAL_Value gTestSpiCallbackValue; + +void TestSpiInitializationCallback(const char* name, void* param, + const struct HAL_Value* value) { + gTestSpiCallbackName = name; + gTestSpiCallbackValue = *value; +} + +TEST(SpiSimTests, TestSpiInitialization) { + const int INDEX_TO_TEST = 2; + + int32_t status; + HAL_SPIPort port; + + int callbackParam = 0; + int callbackId = HALSIM_RegisterSPIInitializedCallback( + INDEX_TO_TEST, &TestSpiInitializationCallback, &callbackParam, false); + ASSERT_TRUE(0 != callbackId); + + status = 0; + port = HAL_SPI_kOnboardCS2; + gTestSpiCallbackName = "Unset"; + HAL_InitializeSPI(port, &status); + EXPECT_STREQ("Initialized", gTestSpiCallbackName.c_str()); +} + +} // namespace hal