blob: b5f9100e312ef24893dc63eb3275edb7ef59b1f2 [file] [log] [blame]
Austin Schuhc6423e62017-02-11 16:56:30 -08001#include "frc971/zeroing/wrap.h"
Austin Schuh4fae0fc2018-03-27 23:51:42 -07002
3#include <cmath>
4
Austin Schuhc6423e62017-02-11 16:56:30 -08005#include "gtest/gtest.h"
6
7namespace frc971 {
8namespace zeroing {
9namespace testing {
10
11// Tests some various positive and negative values for wrap.
12TEST(WrapTest, TestWrap) {
13 EXPECT_NEAR(1.0, Wrap(0.0, 1.0, 10.0), 1e-6);
14 EXPECT_NEAR(-1.0, Wrap(0.0, -1.0, 10.0), 1e-6);
15
16 EXPECT_NEAR(1.0, Wrap(5.0, 1.0, 10.0), 1e-6);
17 EXPECT_NEAR(9.0, Wrap(5.0, -1.0, 10.0), 1e-6);
18
19 EXPECT_NEAR(10.0, Wrap(5.0, 10.0, 10.0), 1e-6);
20 EXPECT_NEAR(1.0, Wrap(5.0, -9.0, 10.0), 1e-6);
21}
22
23// Try a bunch of combinations and verify that the result has the right
24// properties. We can be really inefficient here since it is a test.
25TEST(WrapTest, ExhaustiveWrap) {
26 for (double i = -20; i < 20; ++i) {
27 for (double j = -20; j < 20; ++j) {
28 EXPECT_NEAR(i, Wrap(i, j, 10.0), 5.0);
29 const double wrapped_val = Wrap(i, j, 10.0);
30 bool found_interval = false;
31 for (int k = -5; k < 5; ++k) {
32 if (::std::abs(k * 10 + wrapped_val - j) < 1e-6) {
33 found_interval = true;
34 break;
35 }
36 }
37 EXPECT_TRUE(found_interval) << ": Wrap(" << i << ", " << j
38 << ") = " << wrapped_val;
39 }
40 }
41}
42
Austin Schuh4fae0fc2018-03-27 23:51:42 -070043// Tests some various positive and negative values for wrap (with floats).
44TEST(WrapTest, TestFloatWrap) {
45 EXPECT_NEAR(1.0f, Wrap(0.0f, 1.0f, 10.0f), 1e-6f);
46 EXPECT_NEAR(-1.0f, Wrap(0.0f, -1.0f, 10.0f), 1e-6f);
47
48 EXPECT_NEAR(1.0f, Wrap(5.0f, 1.0f, 10.0f), 1e-6f);
49 EXPECT_NEAR(9.0f, Wrap(5.0f, -1.0f, 10.0f), 1e-6f);
50
51 EXPECT_NEAR(10.0f, Wrap(5.0f, 10.0f, 10.0f), 1e-6f);
52 EXPECT_NEAR(1.0f, Wrap(5.0f, -9.0f, 10.0f), 1e-6f);
53}
54
Austin Schuhc6423e62017-02-11 16:56:30 -080055} // namespace testing
56} // namespace zeroing
57} // namespace frc971