mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-21 01:01:43 +00:00
[wpilib] Remove Shuffleboard API (#7730)
This commit is contained in:
@@ -1,16 +0,0 @@
|
||||
// Copyright (c) FIRST and other WPILib contributors.
|
||||
// Open Source Software; you can modify and/or share it under the terms of
|
||||
// the WPILib BSD license file in the root directory of this project.
|
||||
|
||||
#include "shuffleboard/MockActuatorSendable.h"
|
||||
|
||||
#include <wpi/sendable/SendableBuilder.h>
|
||||
#include <wpi/sendable/SendableRegistry.h>
|
||||
|
||||
MockActuatorSendable::MockActuatorSendable(std::string_view name) {
|
||||
wpi::SendableRegistry::Add(this, name);
|
||||
}
|
||||
|
||||
void MockActuatorSendable::InitSendable(wpi::SendableBuilder& builder) {
|
||||
builder.SetActuator(true);
|
||||
}
|
||||
@@ -1,130 +0,0 @@
|
||||
// Copyright (c) FIRST and other WPILib contributors.
|
||||
// Open Source Software; you can modify and/or share it under the terms of
|
||||
// the WPILib BSD license file in the root directory of this project.
|
||||
|
||||
#include "frc/shuffleboard/ShuffleboardInstance.h" // NOLINT(build/include_order)
|
||||
|
||||
#include <string_view>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <networktables/NetworkTableInstance.h>
|
||||
#include <networktables/NetworkTableListener.h>
|
||||
#include <networktables/StringTopic.h>
|
||||
|
||||
#include "shuffleboard/MockActuatorSendable.h"
|
||||
|
||||
class NTWrapper {
|
||||
public:
|
||||
NTWrapper() { inst = nt::NetworkTableInstance::Create(); }
|
||||
|
||||
~NTWrapper() { nt::NetworkTableInstance::Destroy(inst); }
|
||||
|
||||
nt::NetworkTableInstance inst;
|
||||
};
|
||||
|
||||
TEST(ShuffleboardInstanceTest, PathFluent) {
|
||||
NTWrapper ntInst;
|
||||
frc::detail::ShuffleboardInstance shuffleboardInst{ntInst.inst};
|
||||
|
||||
auto entry = shuffleboardInst.GetTab("Tab Title")
|
||||
.GetLayout("List", "List Layout")
|
||||
.Add("Data", "string")
|
||||
.WithWidget("Text View")
|
||||
.GetEntry();
|
||||
|
||||
EXPECT_EQ("string", entry->GetString("")) << "Wrong entry value";
|
||||
EXPECT_EQ("/Shuffleboard/Tab Title/List/Data", entry->GetTopic().GetName())
|
||||
<< "Entry path generated incorrectly";
|
||||
}
|
||||
|
||||
TEST(ShuffleboardInstanceTest, NestedLayoutsFluent) {
|
||||
NTWrapper ntInst;
|
||||
frc::detail::ShuffleboardInstance shuffleboardInst{ntInst.inst};
|
||||
|
||||
auto entry = shuffleboardInst.GetTab("Tab")
|
||||
.GetLayout("First", "List")
|
||||
.GetLayout("Second", "List")
|
||||
.GetLayout("Third", "List")
|
||||
.GetLayout("Fourth", "List")
|
||||
.Add("Value", "string")
|
||||
.GetEntry();
|
||||
|
||||
EXPECT_EQ("string", entry->GetString("")) << "Wrong entry value";
|
||||
EXPECT_EQ("/Shuffleboard/Tab/First/Second/Third/Fourth/Value",
|
||||
entry->GetTopic().GetName())
|
||||
<< "Entry path generated incorrectly";
|
||||
}
|
||||
|
||||
TEST(ShuffleboardInstanceTest, NestedLayoutsOop) {
|
||||
NTWrapper ntInst;
|
||||
frc::detail::ShuffleboardInstance shuffleboardInst{ntInst.inst};
|
||||
|
||||
frc::ShuffleboardTab& tab = shuffleboardInst.GetTab("Tab");
|
||||
frc::ShuffleboardLayout& first = tab.GetLayout("First", "List");
|
||||
frc::ShuffleboardLayout& second = first.GetLayout("Second", "List");
|
||||
frc::ShuffleboardLayout& third = second.GetLayout("Third", "List");
|
||||
frc::ShuffleboardLayout& fourth = third.GetLayout("Fourth", "List");
|
||||
frc::SimpleWidget& widget = fourth.Add("Value", "string");
|
||||
auto entry = widget.GetEntry();
|
||||
|
||||
EXPECT_EQ("string", entry->GetString("")) << "Wrong entry value";
|
||||
EXPECT_EQ("/Shuffleboard/Tab/First/Second/Third/Fourth/Value",
|
||||
entry->GetTopic().GetName())
|
||||
<< "Entry path generated incorrectly";
|
||||
}
|
||||
|
||||
TEST(ShuffleboardInstanceTest, LayoutTypeIsSet) {
|
||||
NTWrapper ntInst;
|
||||
frc::detail::ShuffleboardInstance shuffleboardInst{ntInst.inst};
|
||||
|
||||
std::string_view layoutType = "Type";
|
||||
shuffleboardInst.GetTab("Tab").GetLayout("Title", layoutType);
|
||||
shuffleboardInst.Update();
|
||||
auto entry = ntInst.inst.GetEntry(
|
||||
"/Shuffleboard/.metadata/Tab/Title/PreferredComponent");
|
||||
EXPECT_EQ(layoutType, entry.GetString("Not Set")) << "Layout type not set";
|
||||
}
|
||||
|
||||
TEST(ShuffleboardInstanceTest, NestedActuatorWidgetsAreDisabled) {
|
||||
NTWrapper ntInst;
|
||||
frc::detail::ShuffleboardInstance shuffleboardInst{ntInst.inst};
|
||||
|
||||
MockActuatorSendable sendable("Actuator");
|
||||
shuffleboardInst.GetTab("Tab").GetLayout("Title", "Layout").Add(sendable);
|
||||
auto controllableEntry =
|
||||
ntInst.inst.GetEntry("/Shuffleboard/Tab/Title/Actuator/.controllable");
|
||||
shuffleboardInst.Update();
|
||||
|
||||
// Note: we use the unsafe `GetBoolean()` method because if the value is NOT
|
||||
// a boolean, or if it is not present, then something has clearly gone very,
|
||||
// very wrong
|
||||
bool controllable = controllableEntry.GetValue().GetBoolean();
|
||||
// Sanity check
|
||||
EXPECT_TRUE(controllable)
|
||||
<< "The nested actuator widget should be enabled by default";
|
||||
shuffleboardInst.DisableActuatorWidgets();
|
||||
controllable = controllableEntry.GetValue().GetBoolean();
|
||||
EXPECT_FALSE(controllable)
|
||||
<< "The nested actuator widget should have been disabled";
|
||||
}
|
||||
|
||||
TEST(ShuffleboardInstanceTest, DuplicateSelectTabs) {
|
||||
NTWrapper ntInst;
|
||||
frc::detail::ShuffleboardInstance shuffleboardInst{ntInst.inst};
|
||||
std::atomic_int counter = 0;
|
||||
auto subscriber =
|
||||
ntInst.inst.GetStringTopic("/Shuffleboard/.metadata/Selected")
|
||||
.Subscribe("", {.keepDuplicates = true});
|
||||
ntInst.inst.AddListener(
|
||||
subscriber, nt::EventFlags::kValueAll | nt::EventFlags::kImmediate,
|
||||
[&counter](auto& event) { counter++; });
|
||||
|
||||
// There shouldn't be anything there
|
||||
EXPECT_EQ(0, counter);
|
||||
|
||||
shuffleboardInst.SelectTab("tab1");
|
||||
shuffleboardInst.SelectTab("tab1");
|
||||
EXPECT_TRUE(ntInst.inst.WaitForListenerQueue(1.0))
|
||||
<< "Listener queue timed out!";
|
||||
EXPECT_EQ(2, counter);
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
// Copyright (c) FIRST and other WPILib contributors.
|
||||
// Open Source Software; you can modify and/or share it under the terms of
|
||||
// the WPILib BSD license file in the root directory of this project.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "frc/shuffleboard/Shuffleboard.h"
|
||||
|
||||
TEST(ShuffleboardTest, TabObjectsCached) {
|
||||
auto& tab1 = frc::Shuffleboard::GetTab("testTabObjectsCached");
|
||||
auto& tab2 = frc::Shuffleboard::GetTab("testTabObjectsCached");
|
||||
EXPECT_EQ(&tab1, &tab2) << "Tab objects were not cached";
|
||||
}
|
||||
@@ -1,110 +0,0 @@
|
||||
// Copyright (c) FIRST and other WPILib contributors.
|
||||
// Open Source Software; you can modify and/or share it under the terms of
|
||||
// the WPILib BSD license file in the root directory of this project.
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <networktables/NetworkTableEntry.h>
|
||||
#include <networktables/NetworkTableInstance.h>
|
||||
|
||||
#include "frc/shuffleboard/ShuffleboardInstance.h"
|
||||
#include "frc/shuffleboard/ShuffleboardTab.h"
|
||||
|
||||
using namespace frc;
|
||||
|
||||
class NTWrapper {
|
||||
public:
|
||||
NTWrapper() { inst = nt::NetworkTableInstance::Create(); }
|
||||
|
||||
~NTWrapper() { nt::NetworkTableInstance::Destroy(inst); }
|
||||
|
||||
nt::NetworkTableInstance inst;
|
||||
};
|
||||
|
||||
class SuppliedValueWidgetTest : public testing::Test {
|
||||
protected:
|
||||
NTWrapper m_ntInst;
|
||||
frc::detail::ShuffleboardInstance m_shuffleboardInst{m_ntInst.inst};
|
||||
frc::ShuffleboardTab* m_tab = &(m_shuffleboardInst.GetTab("Tab"));
|
||||
};
|
||||
|
||||
TEST_F(SuppliedValueWidgetTest, AddString) {
|
||||
std::string str = "foo";
|
||||
m_tab->AddString("String", [&str]() { return str; });
|
||||
auto entry = m_ntInst.inst.GetEntry("/Shuffleboard/Tab/String");
|
||||
|
||||
m_shuffleboardInst.Update();
|
||||
EXPECT_EQ("foo", entry.GetValue().GetString());
|
||||
}
|
||||
|
||||
TEST_F(SuppliedValueWidgetTest, AddNumber) {
|
||||
int num = 0;
|
||||
m_tab->AddNumber("Num", [&num]() { return ++num; });
|
||||
auto entry = m_ntInst.inst.GetEntry("/Shuffleboard/Tab/Num");
|
||||
|
||||
m_shuffleboardInst.Update();
|
||||
EXPECT_FLOAT_EQ(1.0, entry.GetValue().GetDouble());
|
||||
}
|
||||
|
||||
TEST_F(SuppliedValueWidgetTest, AddBoolean) {
|
||||
bool value = true;
|
||||
m_tab->AddBoolean("Bool", [&value]() { return value; });
|
||||
auto entry = m_ntInst.inst.GetEntry("/Shuffleboard/Tab/Bool");
|
||||
|
||||
m_shuffleboardInst.Update();
|
||||
EXPECT_EQ(true, entry.GetValue().GetBoolean());
|
||||
}
|
||||
|
||||
TEST_F(SuppliedValueWidgetTest, AddStringArray) {
|
||||
std::vector<std::string> strings = {"foo", "bar"};
|
||||
m_tab->AddStringArray("Strings", [&strings]() { return strings; });
|
||||
auto entry = m_ntInst.inst.GetEntry("/Shuffleboard/Tab/Strings");
|
||||
|
||||
m_shuffleboardInst.Update();
|
||||
auto actual = entry.GetValue().GetStringArray();
|
||||
|
||||
EXPECT_EQ(strings.size(), actual.size());
|
||||
for (size_t i = 0; i < strings.size(); i++) {
|
||||
EXPECT_EQ(strings[i], actual[i]);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(SuppliedValueWidgetTest, AddNumberArray) {
|
||||
std::vector<double> nums = {0, 1, 2, 3};
|
||||
m_tab->AddNumberArray("Numbers", [&nums]() { return nums; });
|
||||
auto entry = m_ntInst.inst.GetEntry("/Shuffleboard/Tab/Numbers");
|
||||
|
||||
m_shuffleboardInst.Update();
|
||||
auto actual = entry.GetValue().GetDoubleArray();
|
||||
|
||||
EXPECT_EQ(nums.size(), actual.size());
|
||||
for (size_t i = 0; i < nums.size(); i++) {
|
||||
EXPECT_FLOAT_EQ(nums[i], actual[i]);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(SuppliedValueWidgetTest, AddBooleanArray) {
|
||||
std::vector<int> bools = {true, false};
|
||||
m_tab->AddBooleanArray("Booleans", [&bools]() { return bools; });
|
||||
auto entry = m_ntInst.inst.GetEntry("/Shuffleboard/Tab/Booleans");
|
||||
|
||||
m_shuffleboardInst.Update();
|
||||
auto actual = entry.GetValue().GetBooleanArray();
|
||||
|
||||
EXPECT_EQ(bools.size(), actual.size());
|
||||
for (size_t i = 0; i < bools.size(); i++) {
|
||||
EXPECT_FLOAT_EQ(bools[i], actual[i]);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(SuppliedValueWidgetTest, AddRaw) {
|
||||
std::vector<uint8_t> bytes = {1, 2, 3};
|
||||
m_tab->AddRaw("Raw", [&bytes]() { return bytes; });
|
||||
auto entry = m_ntInst.inst.GetEntry("/Shuffleboard/Tab/Raw");
|
||||
|
||||
m_shuffleboardInst.Update();
|
||||
auto actual = entry.GetValue().GetRaw();
|
||||
EXPECT_EQ(bytes, std::vector<uint8_t>(actual.begin(), actual.end()));
|
||||
}
|
||||
Reference in New Issue
Block a user