Check that subsystem range is within pot voltage range

This checks that the subsystem range is within the potentiometer
voltage range, ensuring that the potentiometer won't break, even
at range extremes. The range that the potentiometer can handle
is 0 to 5 volts or -5 to 0 volts, so the subsystem positional
limits should be within these bounds.

Signed-off-by: Nathan Leong <100028864@mvla.net>
Change-Id: I3c7f06595541408111b4c393c6610acb635d4b07
diff --git a/frc971/wpilib/wpilib_utils_test.cc b/frc971/wpilib/wpilib_utils_test.cc
new file mode 100644
index 0000000..2b21438
--- /dev/null
+++ b/frc971/wpilib/wpilib_utils_test.cc
@@ -0,0 +1,158 @@
+#include "frc971/wpilib/wpilib_utils.h"
+
+#include "aos/testing/flatbuffer_eq.h"
+#include "aos/testing/test_logging.h"
+#include "frc971/constants.h"
+
+namespace frc971 {
+namespace wpilib {
+namespace testing {
+namespace {
+
+double climber_pot_translate_inverse_test(double position) {
+  return position * 10.0;
+}
+
+double intake_pot_translate_inverse_test(double position) {
+  return position * 2.0;
+}
+
+TEST(WpilibUtilsTest, ZeroOffsetZeroBuffer) {
+  {
+    // Physical pot range: 0.0 to 0.5
+    constexpr double kPotentiometerOffset = 0.00;
+    constexpr double kLimitBuffer = 0.00;
+
+    ::frc971::constants::Range subsystem_range;
+    subsystem_range = ::frc971::constants::Range{
+        .lower_hard = 0.01, .upper_hard = 0.49, .lower = 0.1, .upper = 0.4};
+    EXPECT_TRUE(SafePotVoltageRange(subsystem_range, kPotentiometerOffset,
+                                    climber_pot_translate_inverse_test, false,
+                                    kLimitBuffer));
+  }
+  {
+    // Physical pot range: 0.0 to 0.5
+    constexpr double kPotentiometerOffset = 0.00;
+    constexpr double kLimitBuffer = 0.00;
+
+    ::frc971::constants::Range subsystem_range;
+    subsystem_range = ::frc971::constants::Range{
+        .lower_hard = 0.0, .upper_hard = 0.5, .lower = 0.1, .upper = 0.4};
+    EXPECT_FALSE(SafePotVoltageRange(subsystem_range, kPotentiometerOffset,
+                                     climber_pot_translate_inverse_test, false,
+                                     kLimitBuffer));
+  }
+}
+
+TEST(WpilibUtilsTest, LimitBuffer) {
+  {
+    // Physical pot range: 0.0 to 0.5
+    constexpr double kPotentiometerOffset = 0.0;
+    constexpr double kLimitBuffer = 0.00;
+
+    ::frc971::constants::Range subsystem_range;
+    subsystem_range = ::frc971::constants::Range{
+        .lower_hard = 0.005, .upper_hard = 0.495, .lower = 0.1, .upper = 0.4};
+    EXPECT_TRUE(SafePotVoltageRange(subsystem_range, kPotentiometerOffset,
+                                    climber_pot_translate_inverse_test, false,
+                                    kLimitBuffer));
+  }
+  {
+    // Physical pot range: 0.0 to 0.5, with limit buffer: 0.005 to 0.495
+    constexpr double kPotentiometerOffset = 0.0;
+    constexpr double kLimitBuffer = 0.05;
+
+    ::frc971::constants::Range subsystem_range;
+    subsystem_range = ::frc971::constants::Range{
+        .lower_hard = 0.005, .upper_hard = 0.495, .lower = 0.1, .upper = 0.4};
+    EXPECT_FALSE(SafePotVoltageRange(subsystem_range, kPotentiometerOffset,
+                                     climber_pot_translate_inverse_test, false,
+                                     kLimitBuffer));
+  }
+}
+
+TEST(WpilibUtilsTest, PotOffset) {
+  {
+    // Physical pot range: 0.0 to 0.5
+    constexpr double kPotentiometerOffset = 0.0;
+    constexpr double kLimitBuffer = 0.00;
+
+    ::frc971::constants::Range subsystem_range;
+    subsystem_range = ::frc971::constants::Range{
+        .lower_hard = 0.01, .upper_hard = 0.49, .lower = 0.1, .upper = 0.4};
+    EXPECT_TRUE(SafePotVoltageRange(subsystem_range, kPotentiometerOffset,
+                                    climber_pot_translate_inverse_test, false,
+                                    kLimitBuffer));
+  }
+  {
+    // Physical pot range: 0.1 to 0.6
+    constexpr double kPotentiometerOffset = 0.1;
+    constexpr double kLimitBuffer = 0.00;
+
+    ::frc971::constants::Range subsystem_range;
+    subsystem_range = ::frc971::constants::Range{
+        .lower_hard = 0.01, .upper_hard = 0.49, .lower = 0.1, .upper = 0.4};
+    EXPECT_FALSE(SafePotVoltageRange(subsystem_range, kPotentiometerOffset,
+                                     climber_pot_translate_inverse_test, false,
+                                     kLimitBuffer));
+  }
+}
+
+TEST(WpilibUtilsTest, TranslateFunction) {
+  {
+    // Physical pot range: 0.0 to 2.5
+    constexpr double kPotentiometerOffset = 0.0;
+    constexpr double kLimitBuffer = 0.00;
+
+    ::frc971::constants::Range subsystem_range;
+    subsystem_range = ::frc971::constants::Range{
+        .lower_hard = 0.01, .upper_hard = 2.49, .lower = 0.1, .upper = 2.4};
+    EXPECT_TRUE(SafePotVoltageRange(subsystem_range, kPotentiometerOffset,
+                                    intake_pot_translate_inverse_test, false,
+                                    kLimitBuffer));
+  }
+  {
+    // Physical pot range: 0.0 to 0.5
+    constexpr double kPotentiometerOffset = 0.0;
+    constexpr double kLimitBuffer = 0.00;
+
+    ::frc971::constants::Range subsystem_range;
+    subsystem_range = ::frc971::constants::Range{
+        .lower_hard = 0.01, .upper_hard = 2.49, .lower = 0.1, .upper = 2.4};
+    EXPECT_FALSE(SafePotVoltageRange(subsystem_range, kPotentiometerOffset,
+                                     climber_pot_translate_inverse_test, false,
+                                     kLimitBuffer));
+  }
+}
+
+TEST(WpilibUtilsTest, ReverseRange) {
+  {
+    // Physical pot range: 0.0 to 0.5, reversed: -0.5 to 0.0
+    constexpr double kPotentiometerOffset = 0.0;
+    constexpr double kLimitBuffer = 0.00;
+
+    ::frc971::constants::Range subsystem_range;
+    subsystem_range = ::frc971::constants::Range{
+        .lower_hard = -0.49, .upper_hard = -0.01, .lower = -0.4, .upper = -0.1};
+    EXPECT_TRUE(SafePotVoltageRange(subsystem_range, kPotentiometerOffset,
+                                    climber_pot_translate_inverse_test, true,
+                                    kLimitBuffer));
+  }
+  {
+    // Physical pot range: 0.0 to 0.5
+    constexpr double kPotentiometerOffset = 0.0;
+    constexpr double kLimitBuffer = 0.00;
+
+    ::frc971::constants::Range subsystem_range;
+    subsystem_range = ::frc971::constants::Range{
+        .lower_hard = -0.49, .upper_hard = -0.01, .lower = -0.4, .upper = -0.1};
+    EXPECT_FALSE(SafePotVoltageRange(subsystem_range, kPotentiometerOffset,
+                                     climber_pot_translate_inverse_test, false,
+                                     kLimitBuffer));
+  }
+}
+
+}  // namespace
+}  // namespace testing
+}  // namespace wpilib
+}  // namespace frc971
\ No newline at end of file