blob: 8f08fcbba2912eaa8d6b8837d2a9420e87765acd [file] [log] [blame]
Brian Silverman246cb222019-02-02 16:38:18 -08001#include "y2019/jevois/spi.h"
2
3#include <stdint.h>
4
5#include "gtest/gtest.h"
6
7namespace frc971 {
8namespace jevois {
9namespace testing {
10
11// Tests packing and then unpacking an empty message.
12TEST(SpiToRoborioPackTest, Empty) {
13 TeensyToRoborio input_message;
14 const SpiTransfer transfer = SpiPackToRoborio(input_message);
15 const auto output_message = SpiUnpackToRoborio(transfer);
16 ASSERT_TRUE(output_message);
17 EXPECT_EQ(input_message, output_message.value());
18}
19
20// Tests that unpacking after the message has been modified results in a
21// checksum failure.
22TEST(SpiToRoborioPackTest, CorruptChecksum) {
23 TeensyToRoborio input_message;
24 {
25 SpiTransfer transfer = SpiPackToRoborio(input_message);
26 transfer[0]++;
27 ASSERT_FALSE(SpiUnpackToRoborio(transfer));
28 }
29 {
30 SpiTransfer transfer = SpiPackToRoborio(input_message);
31 transfer[0] ^= 0xFF;
32 ASSERT_FALSE(SpiUnpackToRoborio(transfer));
33 }
34 {
35 SpiTransfer transfer = SpiPackToRoborio(input_message);
36 transfer[transfer.size() - 1]++;
37 ASSERT_FALSE(SpiUnpackToRoborio(transfer));
38 }
39 input_message.frames.push_back({});
40 {
41 SpiTransfer transfer = SpiPackToRoborio(input_message);
42 transfer[0]++;
43 ASSERT_FALSE(SpiUnpackToRoborio(transfer));
44 }
45 {
46 SpiTransfer transfer = SpiPackToRoborio(input_message);
47 transfer[3]++;
48 ASSERT_FALSE(SpiUnpackToRoborio(transfer));
49 }
50 input_message.frames.back().targets.push_back({});
51 {
52 SpiTransfer transfer = SpiPackToRoborio(input_message);
53 transfer[3]++;
54 ASSERT_FALSE(SpiUnpackToRoborio(transfer));
55 }
56}
57
58// Tests packing and then unpacking a full message.
59TEST(SpiToRoborioPackTest, Full) {
60 TeensyToRoborio input_message;
61 input_message.frames.push_back({});
62 input_message.frames.back().age = camera_duration(9);
63 input_message.frames.push_back({});
64 input_message.frames.back().age = camera_duration(7);
65 input_message.frames.push_back({});
66 input_message.frames.back().age = camera_duration(1);
67
68 const SpiTransfer transfer = SpiPackToRoborio(input_message);
69 const auto output_message = SpiUnpackToRoborio(transfer);
70 ASSERT_TRUE(output_message);
71 EXPECT_EQ(input_message, output_message.value());
72}
73
74// Tests that packing and unpacking a target results in values close to before.
75TEST(SpiToRoborioPackTest, Target) {
76 TeensyToRoborio input_message;
77 input_message.frames.push_back({});
78 input_message.frames.back().targets.push_back({});
79 input_message.frames.back().targets.back().distance = 9;
80 input_message.frames.back().targets.back().height = 1;
81 input_message.frames.back().targets.back().heading = 0.5;
82 input_message.frames.back().targets.back().skew = -0.5;
83 input_message.frames.push_back({});
84 input_message.frames.back().targets.push_back({});
85 input_message.frames.back().targets.push_back({});
86 input_message.frames.push_back({});
87 input_message.frames.back().targets.push_back({});
88 input_message.frames.back().targets.push_back({});
89 input_message.frames.back().targets.push_back({});
90
91 const SpiTransfer transfer = SpiPackToRoborio(input_message);
92 const auto output_message = SpiUnpackToRoborio(transfer);
93 ASSERT_TRUE(output_message);
94 ASSERT_EQ(3u, output_message->frames.size());
95 ASSERT_EQ(1u, output_message->frames[0].targets.size());
96 ASSERT_EQ(2u, output_message->frames[1].targets.size());
97 ASSERT_EQ(3u, output_message->frames[2].targets.size());
98 EXPECT_NEAR(input_message.frames.back().targets.back().distance,
99 output_message->frames.back().targets.back().distance, 0.1);
100 EXPECT_NEAR(input_message.frames.back().targets.back().height,
101 output_message->frames.back().targets.back().height, 0.1);
102 EXPECT_NEAR(input_message.frames.back().targets.back().heading,
103 output_message->frames.back().targets.back().heading, 0.1);
104 EXPECT_NEAR(input_message.frames.back().targets.back().skew,
105 output_message->frames.back().targets.back().skew, 0.1);
106}
107
Brian Silvermana10b87e2019-02-24 15:20:07 -0800108// Tests packing and then unpacking an empty message.
109TEST(SpiToTeensyPackTest, Empty) {
110 RoborioToTeensy input_message;
111 const SpiTransfer transfer = SpiPackToTeensy(input_message);
112 const auto output_message = SpiUnpackToTeensy(transfer);
113 ASSERT_TRUE(output_message);
114 EXPECT_EQ(input_message, output_message.value());
115}
116
Brian Silverman246cb222019-02-02 16:38:18 -0800117} // namespace testing
118} // namespace jevois
119} // namespace frc971