summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/common/VariantConverter.cpp27
-rw-r--r--src/core/common/VariantConverter.hpp19
-rw-r--r--src/core/common/VariantReader.cpp20
-rw-r--r--test/core/common/VariantConverterTest.cpp362
4 files changed, 401 insertions, 27 deletions
diff --git a/src/core/common/VariantConverter.cpp b/src/core/common/VariantConverter.cpp
index 03eb2e8..ff7c5a1 100644
--- a/src/core/common/VariantConverter.cpp
+++ b/src/core/common/VariantConverter.cpp
@@ -22,12 +22,14 @@
#include <string>
#include <sstream>
+#include "CharReader.hpp"
#include "Function.hpp"
#include "Logger.hpp"
#include "Number.hpp"
#include "Rtti.hpp"
#include "Variant.hpp"
#include "VariantConverter.hpp"
+#include "VariantReader.hpp"
#include "VariantWriter.hpp"
namespace ousia {
@@ -389,9 +391,11 @@ bool VariantConverter::toMap(Variant &var, const Rtti &innerType,
bool VariantConverter::toCardinality(Variant &var, Logger &logger, Mode mode)
{
+ if (var.isCardinality()) {
+ return true;
+ }
// Perform safe conversions (all these operations are considered "lossless")
- const VariantType type = var.getType();
- if (type == VariantType::INT) {
+ if (var.isInt()) {
int value = var.asInt();
var.setCardinality(Variant::cardinalityType{});
Variant::cardinalityType &card = var.asCardinality();
@@ -406,6 +410,7 @@ bool VariantConverter::toCardinality(Variant &var, Logger &logger, Mode mode)
// Perform lossy conversions
if (mode == Mode::ALL) {
+ const VariantType type = var.getType();
switch (type) {
case VariantType::NULLPTR:
var.setCardinality(Variant::cardinalityType{});
@@ -465,11 +470,11 @@ bool VariantConverter::toCardinality(Variant &var, Logger &logger, Mode mode)
return false;
}
int end = endVar.asInt();
- if (end <= start) {
+ if (end < start) {
logger.error(
std::string("The supposed start value ") +
std::to_string(start) +
- " was bigger or equal to the supposed end value " +
+ " was bigger than the supposed end value " +
std::to_string(end) + " of the Range.");
return false;
}
@@ -479,11 +484,15 @@ bool VariantConverter::toCardinality(Variant &var, Logger &logger, Mode mode)
return true;
}
case VariantType::STRING: {
- var.setCardinality(Variant::cardinalityType{});
- // Variant::cardinalityType &card =
- // var.asCardinality();
- // TODO: Implement!
- return false;
+ CharReader reader{var.asString().c_str()};
+ auto res = VariantReader::parseCardinality(reader, logger);
+ if (res.first) {
+ var.setCardinality(res.second);
+ return true;
+ } else {
+ var.setCardinality(Variant::cardinalityType{});
+ return false;
+ }
}
default:
break;
diff --git a/src/core/common/VariantConverter.hpp b/src/core/common/VariantConverter.hpp
index 7e317a2..92cc40a 100644
--- a/src/core/common/VariantConverter.hpp
+++ b/src/core/common/VariantConverter.hpp
@@ -84,10 +84,10 @@ public:
* to Mode::SAFE, only integers can be converted to integers. For all other
* types the conversion fails. If "mode" is set to Mode::ALL, booleans are
* converted to 0, 1, nullptr is converted to 0, doubles are truncated,
- * strings are parsed and truncated, arrays with one element are converted
- * to an integer. Conversion fails for objects, functions, maps and arrays
- * with zero or more than one entry. If the conversion fails, 0 is returned
- * as default value.
+ * strings are parsed and truncated, arrays and cardinalities with one
+ * element are converted to an integer. Conversion fails for objects,
+ * functions, maps and arrays with zero or more than one entry. If the
+ * conversion fails, 0 is returned as default value.
*
* @param var is instance of the Variant class that should be converted to
* the requested type.
@@ -105,7 +105,8 @@ public:
* to Mode::SAFE, only integers and doubles can be converted to doubles. For
* all other types the conversion fails. If "mode" is set to Mode::ALL,
* booleans are converted to 0.0, 1.0, nullptr is converted to 0.0, strings
- * are parsed, arrays with one element are converted to a double.
+ * are parsed, arrays and cardinalities with one element are converted to a
+ * double.
* Conversion fails for objects, functions, maps and arrays with zero or
* more than one entry. If the conversion fails, 0.0 is returned as default
* value.
@@ -125,10 +126,10 @@ public:
* Converts the given variant to a string. If the "mode" parameter is set
* to Mode::SAFE, all primitive types can be converted to strings. For
* all other types the conversion fails. If "mode" is set to Mode::ALL,
- * maps and arrays are converted to a JSON representation, objects and
- * functions are converted to an informative string containing their pointer
- * and type. If the conversion fails, an empty string is returned as default
- * value.
+ * maps and arrays are converted to a JSON representation, cardinalities
+ * to their parsing syntax and objects and functions are converted to an
+ * informative string containing their pointer and type. If the conversion
+ * fails, an empty string is returned as default value.
*
* @param var is instance of the Variant class that should be converted to
* the requested type.
diff --git a/src/core/common/VariantReader.cpp b/src/core/common/VariantReader.cpp
index bbceac5..7320973 100644
--- a/src/core/common/VariantReader.cpp
+++ b/src/core/common/VariantReader.cpp
@@ -518,7 +518,7 @@ std::pair<bool, Variant::mapType> VariantReader::parseObject(CharReader &reader,
return std::make_pair(res.first, res.second.asMap());
}
-static const std::unordered_set<char> cardDelims{' ', ',', '}'};
+static const std::unordered_set<char> cardDelims{' ', ',', '}', '-'};
std::pair<bool, Variant::cardinalityType> VariantReader::parseCardinality(
CharReader &reader, Logger &logger)
@@ -533,6 +533,7 @@ std::pair<bool, Variant::cardinalityType> VariantReader::parseCardinality(
Variant::cardinalityType card{};
+ reader.consumePeek();
reader.consumeWhitespace();
// which should in turn be followed by ranges.
@@ -541,14 +542,15 @@ std::pair<bool, Variant::cardinalityType> VariantReader::parseCardinality(
// in case of a numeric character we want to read an integer.
reader.resetPeek();
Number n;
- n.parse(reader, logger, cardDelims);
- if (!n.isInt() || n.intValue() < 0) {
+ if (!n.parse(reader, logger, cardDelims) || !n.isInt() ||
+ n.intValue() < 0) {
return error(reader, logger, "Invalid number for cardinality!",
Variant::cardinalityType{});
}
unsigned int start = (unsigned int)n.intValue();
// if we have that we might either find a } or , making this a
// range or a - leading us to expect another integer.
+ reader.consumePeek();
reader.consumeWhitespace();
if (!reader.peek(c)) {
error(reader, logger, ERR_UNEXPECTED_END,
@@ -560,16 +562,16 @@ std::pair<bool, Variant::cardinalityType> VariantReader::parseCardinality(
reader.resetPeek();
break;
case '-': {
- reader.consumePeek();
// get another integer.
+ reader.consumePeek();
reader.consumeWhitespace();
if (!reader.peek(c)) {
error(reader, logger, ERR_UNEXPECTED_END,
Variant::cardinalityType{});
}
Number n2;
- n2.parse(reader, logger, cardDelims);
- if (!n2.isInt() || n2.intValue() < 0) {
+ if (!n2.parse(reader, logger, cardDelims) || !n2.isInt() ||
+ n2.intValue() < 0) {
return error(reader, logger,
"Invalid number for cardinality!",
Variant::cardinalityType{});
@@ -583,9 +585,6 @@ std::pair<bool, Variant::cardinalityType> VariantReader::parseCardinality(
return unexpected(reader, logger, "}, , or -", c,
Variant::cardinalityType{});
}
- if (c == '{' || c == ',') {
- reader.resetPeek();
- }
} else {
switch (c) {
case '*':
@@ -596,6 +595,7 @@ std::pair<bool, Variant::cardinalityType> VariantReader::parseCardinality(
case '<':
case '>': {
// in case of an open range we expect a number.
+ reader.consumePeek();
reader.consumeWhitespace();
Number n;
if (!n.parse(reader, logger, cardDelims)) {
@@ -625,6 +625,7 @@ std::pair<bool, Variant::cardinalityType> VariantReader::parseCardinality(
}
}
// after we have parsed a range, read all whitespaces.
+ reader.consumePeek();
reader.consumeWhitespace();
// ... and check if we are at the end.
if (!reader.read(c)) {
@@ -635,6 +636,7 @@ std::pair<bool, Variant::cardinalityType> VariantReader::parseCardinality(
case '}':
return std::make_pair(true, card);
case ',':
+ reader.consumePeek();
reader.consumeWhitespace();
break;
diff --git a/test/core/common/VariantConverterTest.cpp b/test/core/common/VariantConverterTest.cpp
index a655aa0..ab18f14 100644
--- a/test/core/common/VariantConverterTest.cpp
+++ b/test/core/common/VariantConverterTest.cpp
@@ -41,6 +41,7 @@ TEST(VariantConverter, toBool)
{
// setup
Logger logger;
+ Variant n = nullptr;
Variant b = true;
Variant i = 0;
Variant d = 2.3;
@@ -52,6 +53,8 @@ TEST(VariantConverter, toBool)
Variant C = card;
// in safe mode only bool to bool conversion should be possible.
+ assertBoolConversion(n, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
assertBoolConversion(b, b, true, VariantConverter::Mode::SAFE, logger);
assertBoolConversion(i, nullptr, false, VariantConverter::Mode::SAFE,
logger);
@@ -67,6 +70,7 @@ TEST(VariantConverter, toBool)
logger);
// in all mode more should be possible.
+ assertBoolConversion(n, false, true, VariantConverter::Mode::ALL, logger);
assertBoolConversion(b, b, true, VariantConverter::Mode::ALL, logger);
assertBoolConversion(i, false, true, VariantConverter::Mode::ALL, logger);
assertBoolConversion(d, true, true, VariantConverter::Mode::ALL, logger);
@@ -92,6 +96,7 @@ TEST(VariantConverter, toInt)
{
// setup
Logger logger;
+ Variant n = nullptr;
Variant b = true;
Variant i = 6;
Variant d = 2.7;
@@ -103,6 +108,8 @@ TEST(VariantConverter, toInt)
Variant C = card;
// in safe mode only int to int conversion should be possible.
+ assertIntConversion(n, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
assertIntConversion(b, nullptr, false, VariantConverter::Mode::SAFE,
logger);
assertIntConversion(i, i, true, VariantConverter::Mode::SAFE, logger);
@@ -118,6 +125,7 @@ TEST(VariantConverter, toInt)
logger);
// in all mode more should be possible.
+ assertIntConversion(n, 0, true, VariantConverter::Mode::ALL, logger);
assertIntConversion(b, 1, true, VariantConverter::Mode::ALL, logger);
assertIntConversion(i, i, true, VariantConverter::Mode::ALL, logger);
assertIntConversion(d, 2, true, VariantConverter::Mode::ALL, logger);
@@ -126,5 +134,359 @@ TEST(VariantConverter, toInt)
assertIntConversion(M, nullptr, false, VariantConverter::Mode::ALL, logger);
assertIntConversion(C, 4, true, VariantConverter::Mode::ALL, logger);
}
+
+static void assertDoubleConversion(Variant conv, Variant expected,
+ bool expectedSuccess,
+ VariantConverter::Mode mode, Logger &logger)
+{
+ EXPECT_EQ(expectedSuccess, VariantConverter::toDouble(conv, logger, mode));
+ if (expectedSuccess) {
+ EXPECT_EQ(expected, conv);
+ }
+}
+
+TEST(VariantConverter, toDouble)
+{
+ // setup
+ Logger logger;
+ Variant n = nullptr;
+ Variant b = true;
+ Variant i = 6;
+ Variant d = 2.7;
+ Variant s = "test";
+ Variant A = Variant::arrayType{d};
+ 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 double and double to double conversion should be
+ // possible.
+ assertDoubleConversion(n, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertDoubleConversion(b, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertDoubleConversion(i, 6.0, true, VariantConverter::Mode::SAFE, logger);
+ assertDoubleConversion(d, d, true, VariantConverter::Mode::SAFE, logger);
+ assertDoubleConversion(s, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertDoubleConversion(A, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertDoubleConversion(M, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertDoubleConversion(C, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+
+ // in all mode more should be possible.
+ assertDoubleConversion(n, 0.0, true, VariantConverter::Mode::ALL, logger);
+ assertDoubleConversion(b, 1.0, true, VariantConverter::Mode::ALL, logger);
+ assertDoubleConversion(i, 6.0, true, VariantConverter::Mode::ALL, logger);
+ assertDoubleConversion(d, d, true, VariantConverter::Mode::ALL, logger);
+ assertDoubleConversion(s, nullptr, false, VariantConverter::Mode::ALL,
+ logger);
+ assertDoubleConversion(A, d, true, VariantConverter::Mode::ALL, logger);
+ assertDoubleConversion(M, nullptr, false, VariantConverter::Mode::ALL,
+ logger);
+ assertDoubleConversion(C, 4.0, true, VariantConverter::Mode::ALL, logger);
+}
+
+static void assertStringConversion(Variant conv, Variant expected,
+ bool expectedSuccess,
+ VariantConverter::Mode mode, Logger &logger)
+{
+ EXPECT_EQ(expectedSuccess, VariantConverter::toString(conv, logger, mode));
+ if (expectedSuccess) {
+ EXPECT_EQ(expected, conv);
+ }
+}
+
+TEST(VariantConverter, toString)
+{
+ // setup
+ Logger logger;
+ Variant n = nullptr;
+ Variant b = true;
+ Variant i = 6;
+ Variant d = 2.7;
+ 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, 4});
+ card.merge(Variant::rangeType::typeRangeFrom(7));
+ Variant C = card;
+
+ // in safe mode only primitive types should be converted to strings.
+ assertStringConversion(n, "null", true, VariantConverter::Mode::SAFE,
+ logger);
+ assertStringConversion(b, "true", true, VariantConverter::Mode::SAFE,
+ logger);
+ assertStringConversion(i, "6", true, VariantConverter::Mode::SAFE, logger);
+ assertStringConversion(d, "2.7", true, VariantConverter::Mode::SAFE,
+ logger);
+ assertStringConversion(s, s, true, VariantConverter::Mode::SAFE, logger);
+ assertStringConversion(A, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertStringConversion(M, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertStringConversion(C, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+
+ // in all mode more should be possible.
+ assertStringConversion(n, "null", true, VariantConverter::Mode::ALL,
+ logger);
+ assertStringConversion(b, "true", true, VariantConverter::Mode::ALL,
+ logger);
+ assertStringConversion(i, "6", true, VariantConverter::Mode::ALL, logger);
+ assertStringConversion(d, "2.7", true, VariantConverter::Mode::ALL, logger);
+ assertStringConversion(s, s, true, VariantConverter::Mode::ALL, logger);
+ assertStringConversion(A, "[true,6,2.7,\"test\"]", true,
+ VariantConverter::Mode::ALL, logger);
+ assertStringConversion(M, "{\"b\":true,\"d\":2.7,\"i\":6,\"s\":\"test\"}",
+ true, VariantConverter::Mode::ALL, logger);
+ assertStringConversion(C, "<cardinality {2-4, >6}>", true,
+ VariantConverter::Mode::ALL, logger);
+}
+
+static void assertArrayConversion(Variant conv, Variant expected,
+ bool expectedSuccess, const Rtti &innerType,
+ VariantConverter::Mode mode, Logger &logger)
+{
+ EXPECT_EQ(expectedSuccess,
+ VariantConverter::toArray(conv, innerType, logger, mode));
+ if (expectedSuccess) {
+ EXPECT_EQ(expected, conv);
+ }
+}
+
+TEST(VariantConverter, toArray)
+{
+ // setup
+ Logger logger;
+ Variant n = nullptr;
+ Variant b = true;
+ Variant i = 6;
+ Variant d = 2.7;
+ Variant s = "9";
+ 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, 4});
+ card.merge(Variant::rangeType::typeRangeFrom(7));
+ Variant C = card;
+
+ // in safe mode only array to array conversion should be possible.
+ assertArrayConversion(n, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+ assertArrayConversion(b, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+ assertArrayConversion(i, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+ assertArrayConversion(d, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+ assertArrayConversion(s, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+ assertArrayConversion(A, A, true, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+ assertArrayConversion(M, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+ assertArrayConversion(C, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+
+ // in all mode more should be possible.
+ assertArrayConversion(n, Variant::arrayType{n}, true, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ assertArrayConversion(b, Variant::arrayType{b}, true, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ assertArrayConversion(i, Variant::arrayType{i}, true, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ assertArrayConversion(d, Variant::arrayType{d}, true, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ assertArrayConversion(s, Variant::arrayType{s}, true, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ assertArrayConversion(A, A, true, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ assertArrayConversion(M, Variant::arrayType{M}, true, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ assertArrayConversion(C, Variant::arrayType{C}, true, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ // as an example also check the inner type converion
+ assertArrayConversion(
+ A, Variant::arrayType{Variant(1), Variant(6), Variant(2), Variant(9)},
+ true, RttiTypes::Int, VariantConverter::Mode::ALL, logger);
+}
+
+static void assertMapConversion(Variant conv, Variant expected,
+ bool expectedSuccess, const Rtti &innerType,
+ VariantConverter::Mode mode, Logger &logger)
+{
+ EXPECT_EQ(expectedSuccess,
+ VariantConverter::toMap(conv, innerType, logger, mode));
+ if (expectedSuccess) {
+ EXPECT_EQ(expected, conv);
+ }
+}
+
+TEST(VariantConverter, toMap)
+{
+ // setup
+ Logger logger;
+ Variant n = nullptr;
+ Variant b = true;
+ Variant i = 6;
+ Variant d = 2.7;
+ Variant s = "9";
+ 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, 4});
+ card.merge(Variant::rangeType::typeRangeFrom(7));
+ Variant C = card;
+
+ // in safe mode only map to map conversion should be possible.
+ assertMapConversion(n, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+ assertMapConversion(b, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+ assertMapConversion(i, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+ assertMapConversion(d, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+ assertMapConversion(s, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+ assertMapConversion(A, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+ assertMapConversion(M, M, true, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+ assertMapConversion(C, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::SAFE, logger);
+
+ // in all mode that should be the same.
+ assertMapConversion(n, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ assertMapConversion(b, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ assertMapConversion(i, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ assertMapConversion(d, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ assertMapConversion(s, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ assertMapConversion(A, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ assertMapConversion(M, M, true, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+ assertMapConversion(C, nullptr, false, RttiTypes::None,
+ VariantConverter::Mode::ALL, logger);
+
+ // but we should be able to convert the inner type.
+ assertMapConversion(M, Variant::mapType{{"b", Variant(1)},
+ {"i", Variant(6)},
+ {"d", Variant(2)},
+ {"s", Variant(9)}},
+ true, RttiTypes::Int, VariantConverter::Mode::ALL,
+ logger);
+ // which should not work in SAFE mode.
+ assertMapConversion(M, Variant::mapType{{"b", Variant(1)},
+ {"i", Variant(6)},
+ {"d", Variant(2)},
+ {"s", Variant(9)}},
+ false, RttiTypes::Int, VariantConverter::Mode::SAFE,
+ logger);
+}
+
+static void assertCardinalityConversion(Variant conv, Variant expected,
+ bool expectedSuccess,
+ VariantConverter::Mode mode,
+ Logger &logger)
+{
+ EXPECT_EQ(expectedSuccess,
+ VariantConverter::toCardinality(conv, logger, mode));
+ if (expectedSuccess) {
+ EXPECT_EQ(expected, conv);
+ }
+}
+
+TEST(VariantConverter, toCardinality)
+{
+ // setup
+ Logger logger;
+ Variant n = nullptr;
+ Variant b = true;
+ Variant i = 6;
+ Variant d = 2.7;
+ Variant s = "{2-3, >9}";
+ Variant A =
+ Variant::arrayType{Variant(2), Variant(7), Variant(10), Variant(10)};
+ Variant M = Variant::mapType{{"b", b}, {"i", i}, {"d", d}, {"s", s}};
+ Variant::cardinalityType card;
+ card.merge({2, 4});
+ card.merge(Variant::rangeType::typeRangeFrom(7));
+ Variant C = card;
+
+ // in safe mode only ints and cardinalities should be convertible.
+ assertCardinalityConversion(n, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertCardinalityConversion(b, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ {
+ Variant::cardinalityType expected;
+ expected.merge({6});
+ assertCardinalityConversion(i, expected, true,
+ VariantConverter::Mode::SAFE, logger);
+ }
+ assertCardinalityConversion(d, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertCardinalityConversion(s, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertCardinalityConversion(A, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertCardinalityConversion(M, nullptr, false, VariantConverter::Mode::SAFE,
+ logger);
+ assertCardinalityConversion(C, C, true, VariantConverter::Mode::SAFE,
+ logger);
+
+ // in all mode more should be possible.
+ assertCardinalityConversion(n, Variant::cardinalityType{}, true,
+ VariantConverter::Mode::ALL, logger);
+
+ {
+ Variant::cardinalityType expected;
+ expected.merge({Variant::rangeType::typeRange()});
+ assertCardinalityConversion(b, expected, true,
+ VariantConverter::Mode::ALL, logger);
+ }
+ {
+ Variant::cardinalityType expected;
+ expected.merge({6});
+ assertCardinalityConversion(i, expected, true,
+ VariantConverter::Mode::ALL, logger);
+ }
+ {
+ Variant::cardinalityType expected;
+ expected.merge({3});
+ assertCardinalityConversion(d, expected, true,
+ VariantConverter::Mode::ALL, logger);
+ }
+ {
+ Variant::cardinalityType expected;
+ expected.merge({2, 3});
+ expected.merge(Variant::rangeType::typeRangeFrom(10));
+ assertCardinalityConversion(s, expected, true,
+ VariantConverter::Mode::ALL, logger);
+ }
+ {
+ Variant::cardinalityType expected;
+ expected.merge({2, 7});
+ expected.merge({10});
+ assertCardinalityConversion(A, expected, true,
+ VariantConverter::Mode::ALL, logger);
+ }
+ // for Map we still have no conversion
+ assertCardinalityConversion(M, nullptr, false, VariantConverter::Mode::ALL,
+ logger);
+ assertCardinalityConversion(C, C, true, VariantConverter::Mode::ALL,
+ logger);
+}
}