mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-20 00:51:42 +00:00
101 lines
3.6 KiB
C++
101 lines
3.6 KiB
C++
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* Copyright (c) FIRST 2017. 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 <DriverStation.h>
|
||
|
|
#include <RobotState.h>
|
||
|
|
|
||
|
|
#include "Commands/ConditionalCommand.h"
|
||
|
|
#include "Commands/Scheduler.h"
|
||
|
|
#include "command/MockCommand.h"
|
||
|
|
#include "command/MockConditionalCommand.h"
|
||
|
|
#include "gtest/gtest.h"
|
||
|
|
|
||
|
|
using namespace frc;
|
||
|
|
|
||
|
|
class ConditionalCommandTest : public testing::Test {
|
||
|
|
public:
|
||
|
|
MockConditionalCommand* m_command;
|
||
|
|
MockCommand* m_onTrue;
|
||
|
|
MockCommand* m_onFalse;
|
||
|
|
|
||
|
|
protected:
|
||
|
|
void SetUp() override {
|
||
|
|
RobotState::SetImplementation(DriverStation::GetInstance());
|
||
|
|
Scheduler::GetInstance()->SetEnabled(true);
|
||
|
|
|
||
|
|
m_onTrue = new MockCommand();
|
||
|
|
m_onFalse = new MockCommand();
|
||
|
|
m_command = new MockConditionalCommand(m_onTrue, m_onFalse);
|
||
|
|
}
|
||
|
|
|
||
|
|
void TearDown() override { delete m_command; }
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Tears Down the Scheduler at the end of each test.
|
||
|
|
*
|
||
|
|
* Must be called at the end of each test inside each test in order to prevent
|
||
|
|
* them being deallocated when they leave the scope of the test (causing a
|
||
|
|
* segfault). This cannot be done within the virtual void Teardown() method
|
||
|
|
* because it is called outside of the scope of the test.
|
||
|
|
*/
|
||
|
|
void TeardownScheduler() { Scheduler::GetInstance()->ResetAll(); }
|
||
|
|
|
||
|
|
void AssertCommandState(MockCommand& command, int32_t initialize,
|
||
|
|
int32_t execute, int32_t isFinished, int32_t end,
|
||
|
|
int32_t interrupted) {
|
||
|
|
EXPECT_EQ(initialize, command.GetInitializeCount());
|
||
|
|
EXPECT_EQ(execute, command.GetExecuteCount());
|
||
|
|
EXPECT_EQ(isFinished, command.GetIsFinishedCount());
|
||
|
|
EXPECT_EQ(end, command.GetEndCount());
|
||
|
|
EXPECT_EQ(interrupted, command.GetInterruptedCount());
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
TEST_F(ConditionalCommandTest, OnTrueTest) {
|
||
|
|
m_command->SetCondition(true);
|
||
|
|
|
||
|
|
Scheduler::GetInstance()->AddCommand(m_command);
|
||
|
|
AssertCommandState(*m_onTrue, 0, 0, 0, 0, 0);
|
||
|
|
Scheduler::GetInstance()->Run(); // init command and select m_onTrue
|
||
|
|
AssertCommandState(*m_onTrue, 0, 0, 0, 0, 0);
|
||
|
|
Scheduler::GetInstance()->Run(); // init m_onTrue
|
||
|
|
AssertCommandState(*m_onTrue, 0, 0, 0, 0, 0);
|
||
|
|
Scheduler::GetInstance()->Run();
|
||
|
|
AssertCommandState(*m_onTrue, 1, 1, 2, 0, 0);
|
||
|
|
Scheduler::GetInstance()->Run();
|
||
|
|
AssertCommandState(*m_onTrue, 1, 2, 4, 0, 0);
|
||
|
|
|
||
|
|
EXPECT_TRUE(m_onTrue->GetInitializeCount() > 0)
|
||
|
|
<< "Did not initialize the true command\n";
|
||
|
|
EXPECT_TRUE(m_onFalse->GetInitializeCount() == 0)
|
||
|
|
<< "Initialized the false command\n";
|
||
|
|
|
||
|
|
TeardownScheduler();
|
||
|
|
}
|
||
|
|
|
||
|
|
TEST_F(ConditionalCommandTest, OnFalseTest) {
|
||
|
|
m_command->SetCondition(false);
|
||
|
|
|
||
|
|
Scheduler::GetInstance()->AddCommand(m_command);
|
||
|
|
AssertCommandState(*m_onFalse, 0, 0, 0, 0, 0);
|
||
|
|
Scheduler::GetInstance()->Run(); // init command and select m_onTrue
|
||
|
|
AssertCommandState(*m_onFalse, 0, 0, 0, 0, 0);
|
||
|
|
Scheduler::GetInstance()->Run(); // init m_onTrue
|
||
|
|
AssertCommandState(*m_onFalse, 0, 0, 0, 0, 0);
|
||
|
|
Scheduler::GetInstance()->Run();
|
||
|
|
AssertCommandState(*m_onFalse, 1, 1, 2, 0, 0);
|
||
|
|
Scheduler::GetInstance()->Run();
|
||
|
|
AssertCommandState(*m_onFalse, 1, 2, 4, 0, 0);
|
||
|
|
|
||
|
|
EXPECT_TRUE(m_onFalse->GetInitializeCount() > 0)
|
||
|
|
<< "Did not initialize the false command";
|
||
|
|
EXPECT_TRUE(m_onTrue->GetInitializeCount() == 0)
|
||
|
|
<< "Initialized the true command";
|
||
|
|
|
||
|
|
TeardownScheduler();
|
||
|
|
}
|