summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2015-01-24 14:42:48 +0100
committerBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2015-01-24 14:42:48 +0100
commit7a2fffd5827d0b645f9fb1624d50ccc5b1d583c0 (patch)
tree892d046e03e86cdf6976594a56fa34daa222c26e
parent6a31c42cb65dd46a3b7ee9935394557c034fff2b (diff)
included VariantConverterTest and started testing of cardinality functionality.
-rw-r--r--CMakeLists.txt1
-rw-r--r--test/core/common/VariantConverterTest.cpp130
-rw-r--r--test/core/common/VariantTest.cpp14
3 files changed, 145 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2ba997d..e9204da 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -223,6 +223,7 @@ IF(TEST)
test/core/common/PropertyTest
test/core/common/RttiTest
test/core/common/SourceContextReaderTest
+ test/core/common/VariantConverterTest
test/core/common/VariantReaderTest
test/core/common/VariantWriterTest
test/core/common/VariantTest
diff --git a/test/core/common/VariantConverterTest.cpp b/test/core/common/VariantConverterTest.cpp
new file mode 100644
index 0000000..a655aa0
--- /dev/null
+++ b/test/core/common/VariantConverterTest.cpp
@@ -0,0 +1,130 @@
+/*
+ Ousía
+ Copyright (C) 2014, 2015 Benjamin Paaßen, Andreas Stöckel
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <iostream>
+
+#include <gtest/gtest.h>
+
+#include <core/common/Logger.hpp>
+#include <core/common/Rtti.hpp>
+#include <core/common/Variant.hpp>
+#include <core/common/VariantConverter.hpp>
+
+namespace ousia {
+
+static void assertBoolConversion(Variant conv, Variant expected,
+ bool expectedSuccess,
+ VariantConverter::Mode mode, Logger &logger)
+{
+ EXPECT_EQ(expectedSuccess, VariantConverter::toBool(conv, logger, mode));
+ if (expectedSuccess) {
+ EXPECT_EQ(expected, conv);
+ }
+}
+
+TEST(VariantConverter, toBool)
+{
+ // setup
+ Logger logger;
+ Variant b = true;
+ Variant i = 0;
+ Variant d = 2.3;
+ Variant s = "test";
+ Variant A = Variant::arrayType{b, i, d, s};
+ Variant M = Variant::mapType{{"b", b}, {"i", i}, {"d", d}, {"s", s}};
+ Variant::cardinalityType card;
+ card.merge({2, 5});
+ Variant C = card;
+
+ // in safe mode only bool to bool conversion should be possible.
+ assertBoolConversion(b, b, true, VariantConverter::Mode::SAFE, logger);
+ assertBoolConversion(i, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertBoolConversion(d, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertBoolConversion(s, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertBoolConversion(A, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertBoolConversion(M, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertBoolConversion(C, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+
+ // in all mode more should be possible.
+ assertBoolConversion(b, b, true, VariantConverter::Mode::ALL, logger);
+ assertBoolConversion(i, false, true, VariantConverter::Mode::ALL, logger);
+ assertBoolConversion(d, true, true, VariantConverter::Mode::ALL, logger);
+ // it may be counter-intuitive at first, but everything else gets just
+ // converted to true.
+ assertBoolConversion(s, true, true, VariantConverter::Mode::ALL, logger);
+ assertBoolConversion(A, true, true, VariantConverter::Mode::ALL, logger);
+ assertBoolConversion(M, true, true, VariantConverter::Mode::ALL, logger);
+ assertBoolConversion(C, true, true, VariantConverter::Mode::ALL, logger);
+}
+
+static void assertIntConversion(Variant conv, Variant expected,
+ bool expectedSuccess,
+ VariantConverter::Mode mode, Logger &logger)
+{
+ EXPECT_EQ(expectedSuccess, VariantConverter::toInt(conv, logger, mode));
+ if (expectedSuccess) {
+ EXPECT_EQ(expected, conv);
+ }
+}
+
+TEST(VariantConverter, toInt)
+{
+ // setup
+ Logger logger;
+ Variant b = true;
+ Variant i = 6;
+ Variant d = 2.7;
+ Variant s = "test";
+ Variant A = Variant::arrayType{i};
+ Variant M = Variant::mapType{{"b", b}, {"i", i}, {"d", d}, {"s", s}};
+ Variant::cardinalityType card;
+ card.merge({4});
+ Variant C = card;
+
+ // in safe mode only int to int conversion should be possible.
+ assertIntConversion(b, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertIntConversion(i, i, true, VariantConverter::Mode::SAFE, logger);
+ assertIntConversion(d, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertIntConversion(s, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertIntConversion(A, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertIntConversion(M, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertIntConversion(C, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+
+ // in all mode more should be possible.
+ assertIntConversion(b, 1, true, VariantConverter::Mode::ALL, logger);
+ assertIntConversion(i, i, true, VariantConverter::Mode::ALL, logger);
+ assertIntConversion(d, 2, true, VariantConverter::Mode::ALL, logger);
+ assertIntConversion(s, nullptr, false, VariantConverter::Mode::ALL, logger);
+ assertIntConversion(A, i, true, VariantConverter::Mode::ALL, logger);
+ assertIntConversion(M, nullptr, false, VariantConverter::Mode::ALL, logger);
+ assertIntConversion(C, 4, true, VariantConverter::Mode::ALL, logger);
+}
+}
+
diff --git a/test/core/common/VariantTest.cpp b/test/core/common/VariantTest.cpp
index 00109d9..6381607 100644
--- a/test/core/common/VariantTest.cpp
+++ b/test/core/common/VariantTest.cpp
@@ -124,6 +124,20 @@ TEST(Variant, stringValueConversion)
ASSERT_EQ(42.5, v.toDouble());
}
+TEST(Variant, cardinalityValue)
+{
+ Variant::cardinalityType card;
+ card.merge({1,4});
+ card.merge({7,12});
+ const Variant v{card};
+ ASSERT_EQ(card, v.asCardinality());
+
+ ASSERT_TRUE(v.isCardinality());
+ ASSERT_EQ(VariantType::CARDINALITY, v.getType());
+ ASSERT_EQ(&RttiTypes::Cardinality, &v.getRtti());
+}
+
+
TEST(Variant, arrayValue)
{
const Variant v{{"test1", 42}};