Commit a6b8531dcb7aa8d39a69f5cb72d6cdfe2a8e8cf3

Authored by Peter M. Groen
1 parent c96f4e8b

Implemented the Variant and tests

.gitignore
@@ -2,3 +2,4 @@ @@ -2,3 +2,4 @@
2 /.gitmodules 2 /.gitmodules
3 ./build/ 3 ./build/
4 build/ 4 build/
  5 +/CMakeLists.txt.user
CMakeLists.txt
@@ -4,10 +4,10 @@ LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/submodules/cmake) @@ -4,10 +4,10 @@ LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/submodules/cmake)
4 include(projectheader) 4 include(projectheader)
5 project_header(datatypes) 5 project_header(datatypes)
6 6
7 -# set(REPOSITORY_PACKAGE_NAME ${PROJECT_NAME} CACHE STRING "Repository name for ${PROJECT_NAME}" FORCE) 7 +set(REPOSITORY_PACKAGE_NAME ${PROJECT_NAME} CACHE STRING "Repository name for ${PROJECT_NAME}" FORCE)
8 add_subdirectory(src) 8 add_subdirectory(src)
9 9
10 # Test applications for each component. 10 # Test applications for each component.
11 -# add_subdirectory(tests) 11 +add_subdirectory(tests)
12 12
13 13
src/Variant.cpp
@@ -2,75 +2,137 @@ @@ -2,75 +2,137 @@
2 2
3 using namespace osdev::components; 3 using namespace osdev::components;
4 4
5 -Variant::Variant()  
6 -{  
7 -}  
8 -  
9 -Variant::Variant(Type type)  
10 -{  
11 -}  
12 -  
13 -Variant::Variant(bool value)  
14 -{  
15 -}  
16 -  
17 -Variant::Variant(int value)  
18 -{  
19 -}  
20 -  
21 -Variant::Variant(uint value)  
22 -{  
23 -}  
24 -  
25 -Variant::Variant(double value)  
26 -{  
27 -} 5 +Variant::Type Variant::getType()
  6 +{
  7 + if(std::holds_alternative<bool>(m_variable))
  8 + {
  9 + return Variant::Type::Bool;
  10 + }
  11 + else if(std::holds_alternative<int>(m_variable))
  12 + {
  13 + return Variant::Type::Int;
  14 + }
  15 + else if(std::holds_alternative<double>(m_variable))
  16 + {
  17 + return Variant::Type::Double;
  18 + }
  19 + else if(std::holds_alternative<float>(m_variable))
  20 + {
  21 + return Variant::Type::Float;
  22 + }
  23 + else if(std::holds_alternative<char>(m_variable))
  24 + {
  25 + return Variant::Type::Char;
  26 + }
  27 + else if(std::holds_alternative<std::string>(m_variable))
  28 + {
  29 + return Variant::Type::String;
  30 + }
  31 + else if(std::holds_alternative<uint8_t>(m_variable))
  32 + {
  33 + return Variant::Type::UInt8;
  34 + }
  35 + else if(std::holds_alternative<uint16_t>(m_variable))
  36 + {
  37 + return Variant::Type::UInt16;
  38 + }
  39 + else if(std::holds_alternative<uint64_t>(m_variable))
  40 + {
  41 + return Variant::Type::UInt64;
  42 + }
28 43
29 -Variant::Variant(float value)  
30 -{ 44 + return Variant::Type::Invalid;
31 } 45 }
32 46
33 -Variant::Variant(char value) 47 +bool Variant::CanConvert(Variant::Type typeWanted)
34 { 48 {
  49 + switch(typeWanted)
  50 + {
  51 + case Variant::Bool:
  52 + {
  53 + return std::holds_alternative<bool>(m_variable);
  54 + }
  55 + case Variant::Int:
  56 + {
  57 + return std::holds_alternative<int>(m_variable);
  58 + }
  59 + case Variant::Double:
  60 + {
  61 + return std::holds_alternative<double>(m_variable);
  62 + }
  63 + case Variant::Float:
  64 + {
  65 + return std::holds_alternative<float>(m_variable);
  66 + }
  67 + case Variant::Char:
  68 + {
  69 + return std::holds_alternative<char>(m_variable);
  70 + }
  71 + case Variant::String:
  72 + {
  73 + return std::holds_alternative<std::string>(m_variable);
  74 + }
  75 + case Variant::UInt8:
  76 + {
  77 + return std::holds_alternative<uint8_t>(m_variable);
  78 + }
  79 + case Variant::UInt16:
  80 + {
  81 + return std::holds_alternative<uint16_t>(m_variable);
  82 + }
  83 + case Variant::UInt64:
  84 + {
  85 + return std::holds_alternative<uint64_t>(m_variable);
  86 + }
  87 + case Variant::Invalid:
  88 + {
  89 + return false;
  90 + }
  91 + }
  92 + return false;
35 } 93 }
36 94
37 -Variant::Variant(std::string value) 95 +bool Variant::toBool()
38 { 96 {
  97 + return std::get<bool>(m_variable);
39 } 98 }
40 99
41 -Variant::Variant(uint8_t value) 100 +int Variant::toInt()
42 { 101 {
  102 + return std::get<int>(m_variable);
43 } 103 }
44 104
45 -Variant::Variant(uint16_t value) 105 +double Variant::toDouble()
46 { 106 {
  107 + return std::get<double>(m_variable);
47 } 108 }
48 109
49 -Variant::Variant(uint32_t value) 110 +float Variant::toFloat()
50 { 111 {
  112 + return std::get<float>(m_variable);
51 } 113 }
52 114
53 -Variant::Variant(uint64_t value) 115 +char Variant::toChar()
54 { 116 {
  117 + return std::get<char>(m_variable);
55 } 118 }
56 119
57 -Variant::Variant(int8_t value) 120 +std::string Variant::toString()
58 { 121 {
  122 + return std::get<std::string>(m_variable);
59 } 123 }
60 124
61 -Variant::Variant(int16_t value) 125 +uint8_t Variant::toUInt8()
62 { 126 {
  127 + return std::get<uint8_t>(m_variable);
63 } 128 }
64 129
65 -Variant::Variant(int32_t value) 130 +uint16_t Variant::toUInt16()
66 { 131 {
  132 + return std::get<uint16_t>(m_variable);
67 } 133 }
68 134
69 -Variant::Variant(int64_t value) 135 +uint64_t Variant::toUInt64()
70 { 136 {
  137 + return std::get<uint64_t>(m_variable);
71 } 138 }
72 -  
73 -Type Variant::getType()  
74 -{  
75 -  
76 -}  
77 \ No newline at end of file 139 \ No newline at end of file
src/Variant.h
1 -#pragma one 1 +#pragma once
2 2
  3 +#include <cstdint>
3 #include <string> 4 #include <string>
  5 +#include <variant>
  6 +
4 namespace osdev::components { 7 namespace osdev::components {
  8 +
5 class Variant 9 class Variant
6 { 10 {
7 public: 11 public:
8 enum Type { 12 enum Type {
9 Invalid, // Unknown 13 Invalid, // Unknown
10 Bool, // bool 14 Bool, // bool
11 - Int, // int (standard)  
12 - UInt, // Unsigned int  
13 Double, // double 15 Double, // double
14 Float, // float 16 Float, // float
15 Char, // char 17 Char, // char
16 String, // std::string 18 String, // std::string
17 UInt8, // uint8_t 19 UInt8, // uint8_t
18 UInt16, // uint16_t 20 UInt16, // uint16_t
19 - UInt32, // uint32_t  
20 UInt64, // uint64_t 21 UInt64, // uint64_t
21 - Int8, // int8_t  
22 - Int16, // int16_t  
23 - Int32, // int32_t  
24 - Int64 // int64_t 22 + Int // int -->> Size determined by platform and compiler
25 }; 23 };
26 24
27 /*! 25 /*!
28 - * All Constructors available 26 + * All Constructors available.
  27 + * The type of the argument determines the internal type of the variant
29 */ 28 */
30 - Variant();  
31 - Variant(Type type);  
32 - Variant(bool value);  
33 - Variant(int value);  
34 - Variant(uint value);  
35 - Variant(double value);  
36 - Variant(float value);  
37 - Variant(char value);  
38 - Variant(std::string value);  
39 - Variant(uint8_t value);  
40 - Variant(uint16_t value);  
41 - Variant(uint32_t value);  
42 - Variant(uint64_t value);  
43 - Variant(int8_t value);  
44 - Variant(int16_t value);  
45 - Variant(int32_t value);  
46 - Variant(int64_t value);  
47 -  
48 - 29 + Variant() : m_variable() {};
  30 + Variant(bool value) : m_variable(value) {};
  31 + Variant(int value) : m_variable(value) {};
  32 + Variant(double value) : m_variable(value) {};
  33 + Variant(float value) : m_variable(value) {};
  34 + Variant(char value) : m_variable(value) {};
  35 + Variant(std::string value) : m_variable(value) {};
  36 + Variant(uint8_t value) : m_variable(value) {};
  37 + Variant(uint16_t value) : m_variable(value) {};
  38 + Variant(uint64_t value) : m_variable(value) {};
  39 +
  40 + /// Return the type of the value stored in this variant
  41 + Variant::Type getType();
  42 +
  43 + /// Check to see if the value can be converted to the desired type.
  44 + /// @param - The requested type as an enum
  45 + /// @return - true if the conversion can happen. False if not.
  46 + bool CanConvert(Variant::Type typeWanted);
  47 +
  48 + bool toBool();
  49 + double toDouble();
  50 + float toFloat();
  51 + char toChar();
  52 + std::string toString();
  53 + int toInt();
  54 + uint8_t toUInt8();
  55 + uint16_t toUInt16();
  56 + uint64_t toUInt64();
  57 +
  58 +
  59 +
  60 +private:
  61 + std::variant<bool, int,
  62 + double, float,
  63 + char, std::string,
  64 + uint8_t, uint16_t,
  65 + uint64_t> m_variable;
  66 +
49 }; 67 };
50 68
51 -} /* End namespace osdev::components */  
52 \ No newline at end of file 69 \ No newline at end of file
  70 +} /* End namespace osdev::components */
tests/CMakeLists.txt 0 โ†’ 100644
  1 +# *****************************************************************************
  2 +# Copyright (c)2023 Peter M. Groen
  3 +# This file is licensed under the MIT license found in the LICENSE file
  4 +# in the root directory of this source tree.
  5 +# *****************************************************************************
  6 +add_executable(datatypestest
  7 + datatypestest.cpp
  8 +)
  9 +
  10 +
  11 +target_include_directories(datatypestest PRIVATE
  12 + ${CMAKE_CURRENT_SOURCE_DIR}
  13 + ${CMAKE_SOURCE_DIR}/src
  14 + ${CMAKE_BINARY_DIR}
  15 +)
  16 +
  17 +target_link_libraries(datatypestest PRIVATE
  18 + gmock_main
  19 + gmock
  20 + gtest
  21 + datatypes
  22 +)
  23 +
  24 +add_test(NAME datatypestest COMMAND datatypestest)
  25 +
  26 +set_tests_properties(datatypestest PROPERTIES
  27 + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
  28 +)
tests/datatypestest.cpp 0 โ†’ 100644
  1 +/*****************************************************************************
  2 + * Copyright (c)2023 Peter M. Groen
  3 + * This file is licensed under the MIT license found in the LICENSE file
  4 + * in the root directory of this source tree.
  5 + ******************************************************************************/
  6 +
  7 +#include <gmock/gmock.h>
  8 +#include <gtest/gtest.h>
  9 +
  10 +#include "Variant.h"
  11 +
  12 +using namespace osdev::components;
  13 +
  14 +TEST(DataTypesTest, BooleanTest)
  15 +{
  16 + Variant oVariant(true);
  17 + EXPECT_EQ(oVariant.getType(), Variant::Bool);
  18 + EXPECT_TRUE(oVariant.CanConvert(Variant::Bool));
  19 + EXPECT_TRUE(oVariant.toBool());
  20 +}
  21 +
  22 +TEST(DataTypesTest, PositiveIntegerTest)
  23 +{
  24 + int value = 42;
  25 + Variant oVariant(value);
  26 + EXPECT_EQ(oVariant.getType(), Variant::Int);
  27 + EXPECT_TRUE(oVariant.CanConvert(Variant::Int));
  28 + EXPECT_EQ(oVariant.toInt(), 42);
  29 +}
  30 +
  31 +TEST(DataTypesTest, NegativeIntegerTest)
  32 +{
  33 + int value = -42;
  34 + Variant oVariant(value);
  35 + EXPECT_EQ(oVariant.getType(), Variant::Int);
  36 + EXPECT_TRUE(oVariant.CanConvert(Variant::Int));
  37 + EXPECT_EQ(oVariant.toInt(), -42);
  38 +}
  39 +
  40 +TEST(DataTypesTest, PositiveDoubleTest)
  41 +{
  42 + double value = 42;
  43 + Variant oVariant(value);
  44 + EXPECT_EQ(oVariant.getType(), Variant::Double);
  45 + EXPECT_TRUE(oVariant.CanConvert(Variant::Double));
  46 + EXPECT_EQ(oVariant.toDouble(), 42);
  47 +}
  48 +
  49 +TEST(DataTypesTest, NegativeDoubleTest)
  50 +{
  51 + double value = -42;
  52 + Variant oVariant(value);
  53 + EXPECT_EQ(oVariant.getType(), Variant::Double);
  54 + EXPECT_TRUE(oVariant.CanConvert(Variant::Double));
  55 + EXPECT_EQ(oVariant.toDouble(), -42);
  56 +}
  57 +
  58 +TEST(DataTypesTest, PositiveFloatTest)
  59 +{
  60 + float value = 42.00;
  61 + Variant oVariant(value);
  62 + EXPECT_EQ(oVariant.getType(), Variant::Float);
  63 + EXPECT_TRUE(oVariant.CanConvert(Variant::Float));
  64 + EXPECT_EQ(oVariant.toFloat(), 42.00);
  65 +}
  66 +
  67 +TEST(DataTypesTest, NegativeFloatTest)
  68 +{
  69 + float value = -42.00;
  70 + Variant oVariant(value);
  71 + EXPECT_EQ(oVariant.getType(), Variant::Float);
  72 + EXPECT_TRUE(oVariant.CanConvert(Variant::Float));
  73 + EXPECT_EQ(oVariant.toFloat(), -42.00);
  74 +}
  75 +
  76 +TEST(DataTypesTest, CharTest)
  77 +{
  78 + char value = 'c';
  79 + Variant oVariant(value);
  80 + EXPECT_EQ(oVariant.getType(), Variant::Char);
  81 + EXPECT_TRUE(oVariant.CanConvert(Variant::Char));
  82 + EXPECT_EQ(oVariant.toChar(), 'c');
  83 +}
  84 +
  85 +TEST(DataTypesTest, StringTest)
  86 +{
  87 + std::string value = "This is a string";
  88 + Variant oVariant(value);
  89 + EXPECT_EQ(oVariant.getType(), Variant::String);
  90 + EXPECT_TRUE(oVariant.CanConvert(Variant::String));
  91 + EXPECT_EQ(oVariant.toString(), "This is a string");
  92 +}
  93 +
  94 +TEST(DataTypesTest, UInt8Test)
  95 +{
  96 + uint8_t value = 0xAA;
  97 + Variant oVariant(value);
  98 + EXPECT_EQ(oVariant.getType(), Variant::UInt8);
  99 + EXPECT_TRUE(oVariant.CanConvert(Variant::UInt8));
  100 + EXPECT_EQ(oVariant.toUInt8(), 0xAA);
  101 +}
  102 +
  103 +TEST(DataTypesTest, UInt16Test)
  104 +{
  105 + uint16_t value = 0xAAAA;
  106 + Variant oVariant(value);
  107 + EXPECT_EQ(oVariant.getType(), Variant::UInt16);
  108 + EXPECT_TRUE(oVariant.CanConvert(Variant::UInt16));
  109 + EXPECT_EQ(oVariant.toUInt16(), 0xAAAA);
  110 +}
  111 +
  112 +TEST(DataTypesTest, UInt64Test)
  113 +{
  114 + uint64_t value = 0xAAAAAAAAAAAAAAAA;
  115 + Variant oVariant(value);
  116 + EXPECT_EQ(oVariant.getType(), Variant::UInt64);
  117 + EXPECT_TRUE(oVariant.CanConvert(Variant::UInt64));
  118 + EXPECT_EQ(oVariant.toUInt64(), 0xAAAAAAAAAAAAAAAA);
  119 +}
  120 +
  121 +TEST(DataTypesTest, CanConvertTest)
  122 +{
  123 + uint64_t value = 0xAAAAAAAAAAAAAAAA;
  124 + Variant oVariant(value);
  125 + EXPECT_FALSE(oVariant.CanConvert(Variant::Bool));
  126 + EXPECT_FALSE(oVariant.CanConvert(Variant::Int));
  127 + EXPECT_FALSE(oVariant.CanConvert(Variant::Double));
  128 + EXPECT_FALSE(oVariant.CanConvert(Variant::Float));
  129 + EXPECT_FALSE(oVariant.CanConvert(Variant::Char));
  130 + EXPECT_FALSE(oVariant.CanConvert(Variant::String));
  131 + EXPECT_FALSE(oVariant.CanConvert(Variant::UInt8));
  132 + EXPECT_FALSE(oVariant.CanConvert(Variant::UInt16));
  133 + EXPECT_TRUE(oVariant.CanConvert(Variant::UInt64));
  134 +}
  135 +
  136 +TEST(DataTypesTest, GetWrongTypeTest)
  137 +{
  138 + uint64_t value = 0xAAAAAAAAAAAAAAAA;
  139 + Variant oVariant(value);
  140 + EXPECT_ANY_THROW(oVariant.toBool());
  141 + EXPECT_ANY_THROW(oVariant.toInt());
  142 + EXPECT_ANY_THROW(oVariant.toDouble());
  143 + EXPECT_ANY_THROW(oVariant.toFloat());
  144 + EXPECT_ANY_THROW(oVariant.toChar());
  145 + EXPECT_ANY_THROW(oVariant.toString());
  146 + EXPECT_ANY_THROW(oVariant.toUInt8());
  147 + EXPECT_ANY_THROW(oVariant.toUInt16());
  148 + EXPECT_NO_THROW(oVariant.toUInt64());
  149 +}
  150 +