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
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.