F´ Flight Software - C/C++ Documentation NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
Loading...
Searching...
No Matches
ArrayTest.hpp
Go to the documentation of this file.
1// ======================================================================
2// \title ArrayTest.hpp
3// \author T. Chieu
4// \brief hpp file for ArrayTest class
5//
6// \copyright
7// Copyright (C) 2009-2022 California Institute of Technology.
8// ALL RIGHTS RESERVED. United States Government Sponsorship
9// acknowledged.
10//
11// ======================================================================
12
13#ifndef FPP_TEST_ARRAY_TEST_HPP
14#define FPP_TEST_ARRAY_TEST_HPP
15
17
18#include "STest/Pick/Pick.hpp"
19#include "gtest/gtest.h"
20
21#include <sstream>
22
23namespace FppTest {
24
25 namespace Array {
26
27 // Set default values for an array type
28 template <typename ArrayType>
30 (typename ArrayType::ElementType (&a)[ArrayType::SIZE]) {}
31
32 // Set test values for an array type
33 template <typename ArrayType>
35 (typename ArrayType::ElementType (&a)[ArrayType::SIZE]);
36
37 template <typename ArrayType>
39 (typename ArrayType::ElementType (&a)[ArrayType::SIZE]);
40
41 // Get the serialized size of an array
42 template <typename ArrayType>
44 (typename ArrayType::ElementType (&a)[ArrayType::SIZE]) {
45 return ArrayType::SERIALIZED_SIZE;
46 }
47
48 } // namespace Array
49
50} // namespace FppTest
51
52// Test an array class
53template <typename ArrayType>
54class ArrayTest : public ::testing::Test {
55protected:
56 void SetUp() override {
57 FppTest::Array::setDefaultVals<ArrayType>(defaultVals);
58
59 FppTest::Array::setTestVals<ArrayType>(testVals);
60 ASSERT_FALSE(valsAreEqual());
61 };
62
63 bool valsAreEqual() {
64 for (U32 i = 0; i < ArrayType::SIZE; i++) {
65 if (defaultVals[i] != testVals[i]) {
66 return false;
67 }
68 }
69
70 return true;
71 }
72
73 typename ArrayType::ElementType defaultVals[ArrayType::SIZE];
74 typename ArrayType::ElementType testVals[ArrayType::SIZE];
75};
76
78
79// Test array constants and default constructor
81 TypeParam a;
82
83 // Constants
84 ASSERT_EQ(TypeParam::SIZE, 3);
85 ASSERT_EQ(
86 TypeParam::SERIALIZED_SIZE,
87 TypeParam::SIZE * TypeParam::ElementType::SERIALIZED_SIZE
88 );
89
90 // Default constructor
91 for (U32 i = 0; i < TypeParam::SIZE; i++) {
92 ASSERT_EQ(a[i], this->defaultVals[i]);
93 }
94}
95
96// Test array constructors
97TYPED_TEST_P(ArrayTest, Constructors) {
98 // Array constructor
99 TypeParam a1(this->testVals);
100 for (U32 i = 0; i < TypeParam::SIZE; i++) {
101 ASSERT_EQ(a1[i], this->testVals[i]);
102 }
103
104 // Single element constructor
105 TypeParam a2(this->testVals[0]);
106 for (U32 i = 0; i < TypeParam::SIZE; i++) {
107 ASSERT_EQ(a2[i], this->testVals[0]);
108 }
109
110 // Multiple element constructor
111 TypeParam a3 = FppTest::Array::getMultiElementConstructedArray<TypeParam>
112 (this->testVals);
113 for (U32 i = 0; i < TypeParam::SIZE; i++) {
114 ASSERT_EQ(a3[i], this->testVals[i]);
115 }
116
117 // Copy constructor
118 TypeParam a4(a1);
119 for (U32 i = 0; i < TypeParam::SIZE; i++) {
120 ASSERT_EQ(a4[i], a1[i]);
121 }
122}
123
124// Test array subscript operator
125TYPED_TEST_P(ArrayTest, SubscriptOp) {
126 TypeParam a;
127
128 for (U32 i = 0; i < TypeParam::SIZE; i++) {
129 a[i] = this->testVals[0];
130 ASSERT_EQ(a[i], this->testVals[0]);
131 }
132}
133
134// Test array assignment operator
135TYPED_TEST_P(ArrayTest, AssignmentOp) {
136 TypeParam a1, a2;
137
138 // Array assignment
139 a1 = this->testVals;
140 for (U32 i = 0; i < TypeParam::SIZE; i++) {
141 ASSERT_EQ(a1[i], this->testVals[i]);
142 }
143
144 // Copy assignment
145 TypeParam& a1Ref = a1;
146 a1 = a1Ref;
147 ASSERT_EQ(&a1, &a1Ref);
148
149 a1 = a2;
150 for (U32 i = 0; i < TypeParam::SIZE; i++) {
151 ASSERT_EQ(a2[i], a1[i]);
152 }
153
154 // Single element assignment
155 a1 = this->testVals[0];
156 for (U32 i = 0; i < TypeParam::SIZE; i++) {
157 ASSERT_EQ(a1[i], this->testVals[0]);
158 }
159}
160
161// Test array equality and inequality operators
163 TypeParam a1, a2;
164
165 ASSERT_TRUE(a1 == a2);
166 ASSERT_FALSE(a1 != a2);
167
168 a2 = this->testVals;
169
170 ASSERT_FALSE(a1 == a2);
171 ASSERT_TRUE(a1 != a2);
172
173 a1 = a2;
174
175 ASSERT_TRUE(a1 == a2);
176 ASSERT_FALSE(a1 != a2);
177}
178
179// Test array serialization and deserialization
180TYPED_TEST_P(ArrayTest, Serialization) {
181 TypeParam a(this->testVals);
182
183 U32 serializedSize =
184 FppTest::Array::getSerializedSize<TypeParam>(this->testVals);
185 Fw::SerializeStatus status;
186
187 // Test successful serialization
188 TypeParam aCopy;
189 U8 data[TypeParam::SERIALIZED_SIZE];
190 Fw::SerialBuffer buf(data, sizeof(data));
191
192 // Serialize
193 status = buf.serialize(a);
194
195 ASSERT_EQ(status, Fw::FW_SERIALIZE_OK);
196 ASSERT_EQ(
197 buf.getBuffLength(),
198 serializedSize
199 );
200
201 // Deserialize
202 status = buf.deserialize(aCopy);
203
204 ASSERT_EQ(status, Fw::FW_SERIALIZE_OK);
205 ASSERT_EQ(a, aCopy);
206
207 // Test unsuccessful serialization
208 TypeParam aCopy2;
209 U8 data2[serializedSize-1];
210 Fw::SerialBuffer buf2(data2, sizeof(data2));
211
212 // Serialize
213 status = buf2.serialize(a);
214
215 ASSERT_NE(status, Fw::FW_SERIALIZE_OK);
216 ASSERT_NE(
217 buf2.getBuffLength(),
218 serializedSize
219 );
220
221 // Deserialize
222 status = buf2.deserialize(aCopy2);
223
224 ASSERT_NE(status, Fw::FW_SERIALIZE_OK);
225}
226
227// Register all test patterns
229 Default,
230 Constructors,
231 SubscriptOp,
232 AssignmentOp,
233 EqualityOp,
234 Serialization
235);
236
237#endif
TYPED_TEST_SUITE_P(ArrayTest)
REGISTER_TYPED_TEST_SUITE_P(ArrayTest, Default, Constructors, SubscriptOp, AssignmentOp, EqualityOp, Serialization)
TYPED_TEST_P(ArrayTest, Default)
Definition ArrayTest.hpp:80
uint8_t U8
8-bit unsigned integer
Definition BasicTypes.h:26
void SetUp() override
Definition ArrayTest.hpp:56
bool valsAreEqual()
Definition ArrayTest.hpp:63
ArrayType::ElementType defaultVals[ArrayType::SIZE]
Definition ArrayTest.hpp:73
ArrayType::ElementType testVals[ArrayType::SIZE]
Definition ArrayTest.hpp:74
A variable-length serializable buffer.
SerializeStatus deserialize(U8 &val)
deserialize 8-bit unsigned int
SerializeStatus serialize(U8 val)
serialize 8-bit unsigned int
NATIVE_UINT_TYPE getBuffLength() const
returns current buffer size
ArrayType getMultiElementConstructedArray(typename ArrayType::ElementType(&a)[ArrayType::SIZE])
void setTestVals(typename ArrayType::ElementType(&a)[ArrayType::SIZE])
U32 getSerializedSize(typename ArrayType::ElementType(&a)[ArrayType::SIZE])
Definition ArrayTest.hpp:44
void setDefaultVals(typename ArrayType::ElementType(&a)[ArrayType::SIZE])
Definition ArrayTest.hpp:30
SerializeStatus
forward declaration for string
@ FW_SERIALIZE_OK
Serialization/Deserialization operation was successful.