F´ Flight Software - C/C++ Documentation NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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.