blob: cb81fc9cfc75f5b9a998853d95ec5ae0ba59b7da [file] [log] [blame]
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2017-2019 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 "frc/SpeedControllerGroup.h" // NOLINT(build/include_order)
#include <memory>
#include <vector>
#include "MockSpeedController.h"
#include "gtest/gtest.h"
using namespace frc;
enum SpeedControllerGroupTestType { TEST_ONE, TEST_TWO, TEST_THREE };
std::ostream& operator<<(std::ostream& os,
const SpeedControllerGroupTestType& type) {
switch (type) {
case TEST_ONE:
os << "SpeedControllerGroup with one speed controller";
break;
case TEST_TWO:
os << "SpeedControllerGroup with two speed controllers";
break;
case TEST_THREE:
os << "SpeedControllerGroup with three speed controllers";
break;
}
return os;
}
/**
* A fixture used for SpeedControllerGroup testing.
*/
class SpeedControllerGroupTest
: public testing::TestWithParam<SpeedControllerGroupTestType> {
protected:
std::vector<MockSpeedController> m_speedControllers;
std::unique_ptr<SpeedControllerGroup> m_group;
void SetUp() override {
switch (GetParam()) {
case TEST_ONE: {
m_speedControllers.emplace_back();
m_group = std::make_unique<SpeedControllerGroup>(m_speedControllers[0]);
break;
}
case TEST_TWO: {
m_speedControllers.emplace_back();
m_speedControllers.emplace_back();
m_group = std::make_unique<SpeedControllerGroup>(m_speedControllers[0],
m_speedControllers[1]);
break;
}
case TEST_THREE: {
m_speedControllers.emplace_back();
m_speedControllers.emplace_back();
m_speedControllers.emplace_back();
m_group = std::make_unique<SpeedControllerGroup>(m_speedControllers[0],
m_speedControllers[1],
m_speedControllers[2]);
break;
}
}
}
};
TEST_P(SpeedControllerGroupTest, Set) {
m_group->Set(1.0);
for (auto& speedController : m_speedControllers) {
EXPECT_FLOAT_EQ(speedController.Get(), 1.0);
}
}
TEST_P(SpeedControllerGroupTest, GetInverted) {
m_group->SetInverted(true);
EXPECT_TRUE(m_group->GetInverted());
}
TEST_P(SpeedControllerGroupTest, SetInvertedDoesNotModifySpeedControllers) {
for (auto& speedController : m_speedControllers) {
speedController.SetInverted(false);
}
m_group->SetInverted(true);
for (auto& speedController : m_speedControllers) {
EXPECT_EQ(speedController.GetInverted(), false);
}
}
TEST_P(SpeedControllerGroupTest, SetInvertedDoesInvert) {
m_group->SetInverted(true);
m_group->Set(1.0);
for (auto& speedController : m_speedControllers) {
EXPECT_FLOAT_EQ(speedController.Get(), -1.0);
}
}
TEST_P(SpeedControllerGroupTest, Disable) {
m_group->Set(1.0);
m_group->Disable();
for (auto& speedController : m_speedControllers) {
EXPECT_FLOAT_EQ(speedController.Get(), 0.0);
}
}
TEST_P(SpeedControllerGroupTest, StopMotor) {
m_group->Set(1.0);
m_group->StopMotor();
for (auto& speedController : m_speedControllers) {
EXPECT_FLOAT_EQ(speedController.Get(), 0.0);
}
}
TEST_P(SpeedControllerGroupTest, PIDWrite) {
m_group->PIDWrite(1.0);
for (auto& speedController : m_speedControllers) {
EXPECT_FLOAT_EQ(speedController.Get(), 1.0);
}
}
INSTANTIATE_TEST_SUITE_P(Test, SpeedControllerGroupTest,
testing::Values(TEST_ONE, TEST_TWO, TEST_THREE));