1 /* Copyright (C) 2013 BMW Group
2 * Author: Manfred Bathelt (manfred.bathelt@bmw.de)
3 * Author: Juergen Gehring (juergen.gehring@bmw.de)
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
8 #include <gtest/gtest.h>
9 #include <CommonAPI/SerializableVariant.h>
11 using namespace CommonAPI;
13 class VariantTest: public ::testing::Test {
16 typedef Variant<int, double, std::string> BasicVariantType;
21 fromString = "123abcsadfaljkawlöfasklöerklöfjasklfjysklfjaskfjsklösdfdko4jdfasdjioögjopefgip3rtgjiprg!";
29 std::string fromString;
32 TEST_F(VariantTest, HandlesInts) {
33 BasicVariantType myVariant(fromInt);
35 EXPECT_TRUE(myVariant.isType<int>());
36 EXPECT_FALSE(myVariant.isType<double>());
37 EXPECT_FALSE(myVariant.isType<std::string>());
39 const int myInt = myVariant.get<int>();
40 EXPECT_EQ(myInt, fromInt);
42 EXPECT_ANY_THROW(myVariant.get<double>());
43 EXPECT_ANY_THROW(myVariant.get<std::string>());
46 TEST_F(VariantTest, HandlesDoubles) {
47 BasicVariantType myVariant(fromDouble);
49 EXPECT_FALSE(myVariant.isType<int>());
50 EXPECT_TRUE(myVariant.isType<double>());
51 EXPECT_FALSE(myVariant.isType<std::string>());
53 EXPECT_ANY_THROW(myVariant.get<int>());
55 const double myDouble = myVariant.get<double>();
56 EXPECT_EQ(myDouble, fromDouble);
58 EXPECT_ANY_THROW(myVariant.get<std::string>());
61 TEST_F(VariantTest, HandlesStrings) {
62 BasicVariantType myVariant(fromString);
64 EXPECT_FALSE(myVariant.isType<int>());
65 EXPECT_FALSE(myVariant.isType<double>());
66 EXPECT_TRUE(myVariant.isType<std::string>());
68 EXPECT_ANY_THROW(myVariant.get<int>());
69 EXPECT_ANY_THROW(myVariant.get<double>());
71 const std::string myString = myVariant.get<std::string>();
72 EXPECT_EQ(myString, fromString);
75 TEST_F(VariantTest, HandlesStringVectors) {
76 typedef Variant<int, double, std::vector<std::string>> VectorVariantType;
78 std::vector<std::string> testVector;
79 for(int i = 0; i < 10; i++) {
80 testVector.push_back(fromString);
83 VectorVariantType vectorVariant(testVector);
84 const std::vector<std::string> resultVector = vectorVariant.get<std::vector<std::string>>();
85 EXPECT_EQ(resultVector, testVector);
88 TEST_F(VariantTest, HandlesAssignment) {
89 Variant<int, double, std::string> myVariant = fromInt;
91 myVariant = fromString;
93 EXPECT_FALSE(myVariant.isType<int>());
94 EXPECT_FALSE(myVariant.isType<double>());
95 EXPECT_TRUE(myVariant.isType<std::string>());
97 EXPECT_ANY_THROW(myVariant.get<int>());
99 const std::string myString = myVariant.get<std::string>();
100 EXPECT_EQ(myString, fromString);
103 TEST_F(VariantTest, HandlesVariantConstructionByAssignment) {
104 Variant<int, double, std::string> myVariant = fromInt;
106 EXPECT_TRUE(myVariant.isType<int>());
107 EXPECT_FALSE(myVariant.isType<double>());
108 EXPECT_FALSE(myVariant.isType<std::string>());
110 const int myInt = myVariant.get<int>();
111 EXPECT_EQ(myInt, fromInt);
114 TEST_F(VariantTest, HandlesVariantCopy) {
115 BasicVariantType myVariant(fromInt);
116 Variant<int, double, std::string> myVariantAssigned = myVariant;
118 EXPECT_TRUE(myVariantAssigned.isType<int>());
119 EXPECT_FALSE(myVariantAssigned.isType<double>());
120 EXPECT_FALSE(myVariantAssigned.isType<std::string>());
122 const int myInt2 = myVariantAssigned.get<int>();
123 EXPECT_EQ(myInt2, fromInt);
125 Variant<int, double, std::string> myVariantCopied(myVariant);
126 EXPECT_EQ(myVariant, myVariantCopied);
128 EXPECT_TRUE(myVariantCopied.isType<int>());
129 EXPECT_FALSE(myVariantCopied.isType<double>());
130 EXPECT_FALSE(myVariantCopied.isType<std::string>());
132 const int& myIntCopy = myVariantCopied.get<int>();
133 EXPECT_EQ(myIntCopy, fromInt);
136 TEST_F(VariantTest, HandlesVariantsWithinVariants) {
137 typedef Variant<int, double, BasicVariantType > VariantInVariantType;
138 BasicVariantType fromInnerVariant(fromInt);
139 VariantInVariantType myOuterVariant(fromInnerVariant);
141 EXPECT_FALSE(myOuterVariant.isType<int>());
142 EXPECT_FALSE(myOuterVariant.isType<double>());
143 EXPECT_TRUE(myOuterVariant.isType<BasicVariantType>());
145 EXPECT_ANY_THROW(myOuterVariant.get<int>());
146 EXPECT_ANY_THROW(myOuterVariant.get<double>());
148 const BasicVariantType myInnerVariant = myOuterVariant.get<BasicVariantType>();
149 EXPECT_EQ(fromInnerVariant, myInnerVariant);
153 TEST_F(VariantTest, VariantStringArray) {
155 std::vector<std::string> testVector;
156 testVector.push_back("Test 1");
157 testVector.push_back("Test 2");
158 testVector.push_back("Test 3");
159 testVector.push_back("Test 4");
161 CommonAPI::Variant<int, double, std::vector<std::string>>* vectorVariant = new CommonAPI::Variant<int, double, std::vector<std::string>>(testVector);
163 std::vector<std::string> readVector = vectorVariant->get<std::vector<std::string> >();
164 EXPECT_EQ(readVector, testVector);
166 delete vectorVariant;
169 int main(int argc, char** argv) {
170 ::testing::InitGoogleTest(&argc, argv);
171 return RUN_ALL_TESTS();