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
EnumTest.hpp
Go to the documentation of this file.
1// ======================================================================
2// \title EnumTest.hpp
3// \author T. Chieu
4// \brief hpp file for EnumTest 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_ENUM_TEST_HPP
14#define FPP_TEST_ENUM_TEST_HPP
15
17
18#include "STest/Pick/Pick.hpp"
19#include "gtest/gtest.h"
20
21#include <limits>
22
23namespace FppTest {
24
25 namespace Enum {
26
27 // Get the default value of an enum
28 template <typename EnumType>
29 typename EnumType::T getDefaultValue() {
30 return static_cast<typename EnumType::T>(0);
31 }
32
33 // Get a valid value of an enum
34 template <typename EnumType>
35 typename EnumType::T getValidValue() {
36 U32 val = STest::Pick::startLength(
37 0,
38 EnumType::NUM_CONSTANTS
39 );
40
41 return static_cast<typename EnumType::T>(val);
42 }
43
44 // Get an invalid value of an enum
45 template <typename EnumType>
46 typename EnumType::T getInvalidValue() {
47 U8 sign = 0;
48 if (std::numeric_limits<typename EnumType::SerialType>::min() < 0) {
49 sign = STest::Pick::lowerUpper(0, 1);
50 }
51
52 switch (sign) {
53 case 0:
54 return static_cast<typename EnumType::T>(STest::Pick::lowerUpper(
55 EnumType::NUM_CONSTANTS,
56 static_cast<U32>(
57 std::numeric_limits<typename EnumType::SerialType>::max()
58 )
59 ));
60 default:
61 return static_cast<typename EnumType::T>(STest::Pick::lowerUpper(
62 1,
63 static_cast<U32>((-1) *
64 (std::numeric_limits<typename EnumType::SerialType>::min() + 1)
65 )
66 ) * (-1));
67 }
68 }
69
70 } // namespace Enum
71
72} // namespace FppTest
73
74// Test core enum interface
75template <typename EnumType>
76class EnumTest : public ::testing::Test {};
77
79
80// Test enum constants and default construction
82 TypeParam e;
83
84 // Constants
85 ASSERT_EQ(
86 TypeParam::SERIALIZED_SIZE,
87 sizeof(typename TypeParam::SerialType)
88 );
89
90 // Default constructor
91 ASSERT_EQ(e.e, FppTest::Enum::getDefaultValue<TypeParam>());
92}
93
94// Test enum constructors
95TYPED_TEST_P(EnumTest, Constructors) {
96 typename TypeParam::T validVal = FppTest::Enum::getValidValue<TypeParam>();
97
98 // Raw enum value constructor
99 TypeParam e1(validVal);
100 ASSERT_EQ(e1.e, validVal);
101
102 // Copy constructor
103 TypeParam e2(e1);
104 ASSERT_EQ(e2.e, validVal);
105}
106
107// Test enum assignment operator
108TYPED_TEST_P(EnumTest, AssignmentOp) {
109 TypeParam e1;
110 TypeParam e2;
111
112 typename TypeParam::T validVal = FppTest::Enum::getValidValue<TypeParam>();
113
114 // Raw enum value assignment
115 e1 = validVal;
116 ASSERT_EQ(e1.e, validVal);
117
118 // Object assignment
119 e2 = e1;
120 ASSERT_EQ(e2.e, validVal);
121}
122
123// Test enum equality and inequality operator
124TYPED_TEST_P(EnumTest, EqualityOp) {
125 // Initialize two distinct valid values
126 typename TypeParam::T validVal1 = FppTest::Enum::getValidValue<TypeParam>();
127 typename TypeParam::T validVal2 = FppTest::Enum::getValidValue<TypeParam>();
128 while (validVal1 == validVal2) {
129 validVal2 = FppTest::Enum::getValidValue<TypeParam>();
130 }
131
132 TypeParam e1;
133 TypeParam e2;
134 TypeParam e3(validVal1);
135 TypeParam e4(validVal2);
136
137 // operator==
138 ASSERT_TRUE(e3 == validVal1);
139 ASSERT_TRUE(e4 == validVal2);
140 ASSERT_FALSE(e3 == validVal2);
141 ASSERT_FALSE(e4 == validVal1);
142
143 ASSERT_TRUE(e1 == e2);
144 ASSERT_FALSE(e3 == e4);
145
146 // operator!=
147 ASSERT_TRUE(e3 != validVal2);
148 ASSERT_TRUE(e4 != validVal1);
149 ASSERT_FALSE(e3 != validVal1);
150 ASSERT_FALSE(e4 != validVal2);
151
152 ASSERT_TRUE(e3 != e4);
153 ASSERT_FALSE(e1 != e2);
154}
155
156// Test enum isValid() function
157TYPED_TEST_P(EnumTest, IsValidFunction) {
158 TypeParam validEnum = FppTest::Enum::getValidValue<TypeParam>();
159 TypeParam invalidEnum = FppTest::Enum::getInvalidValue<TypeParam>();
160
161 ASSERT_TRUE(validEnum.isValid());
162 ASSERT_FALSE(invalidEnum.isValid());
163}
164
165// Test enum serialization and deserialization
166TYPED_TEST_P(EnumTest, Serialization) {
167 TypeParam validEnum = FppTest::Enum::getValidValue<TypeParam>();
168 TypeParam invalidEnum = FppTest::Enum::getInvalidValue<TypeParam>();
169
170 // Copy of enums to test after serialization
171 TypeParam validEnumCopy;
172 TypeParam invalidEnumCopy;
173
174 Fw::SerializeStatus status;
175 U8 data[TypeParam::SERIALIZED_SIZE * 2];
176 Fw::SerialBuffer buf(data, sizeof(data));
177
178 // Serialize the enums
179 status = buf.serialize(validEnum);
180
181 ASSERT_EQ(status, Fw::FW_SERIALIZE_OK);
182 ASSERT_EQ(buf.getBuffLength(), sizeof(typename TypeParam::SerialType));
183
184 status = buf.serialize(invalidEnum);
185
186 ASSERT_EQ(status, Fw::FW_SERIALIZE_OK);
187 ASSERT_EQ(buf.getBuffLength(), sizeof(typename TypeParam::SerialType) * 2);
188
189 // Deserialize the enums
190 status = buf.deserialize(validEnumCopy);
191
192 ASSERT_EQ(status, Fw::FW_SERIALIZE_OK);
193 ASSERT_EQ(validEnumCopy, validEnum);
194
195 status = buf.deserialize(invalidEnumCopy);
196
197 ASSERT_EQ(status, Fw::FW_DESERIALIZE_FORMAT_ERROR);
198}
199
200// Register all test patterns
202 Default,
203 Constructors,
204 AssignmentOp,
205 EqualityOp,
206 IsValidFunction,
207 Serialization
208);
209
210#endif
uint8_t U8
8-bit unsigned integer
Definition BasicTypes.h:26
TYPED_TEST_P(EnumTest, Default)
Definition EnumTest.hpp:81
REGISTER_TYPED_TEST_SUITE_P(EnumTest, Default, Constructors, AssignmentOp, EqualityOp, IsValidFunction, Serialization)
TYPED_TEST_SUITE_P(EnumTest)
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
EnumType::T getValidValue()
Definition EnumTest.hpp:35
EnumType::T getDefaultValue()
Definition EnumTest.hpp:29
EnumType::T getInvalidValue()
Definition EnumTest.hpp:46
SerializeStatus
forward declaration for string
@ FW_DESERIALIZE_FORMAT_ERROR
Deserialization data had incorrect values (unexpected data types)
@ FW_SERIALIZE_OK
Serialization/Deserialization operation was successful.