summaryrefslogtreecommitdiff
path: root/test/core/common/ArgumentTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/core/common/ArgumentTest.cpp')
-rw-r--r--test/core/common/ArgumentTest.cpp441
1 files changed, 427 insertions, 14 deletions
diff --git a/test/core/common/ArgumentTest.cpp b/test/core/common/ArgumentTest.cpp
index 8976fba..d555cd8 100644
--- a/test/core/common/ArgumentTest.cpp
+++ b/test/core/common/ArgumentTest.cpp
@@ -20,8 +20,10 @@
#include <gtest/gtest.h>
-#include <core/common/Logger.hpp>
#include <core/common/Argument.hpp>
+#include <core/common/Function.hpp>
+#include <core/common/Logger.hpp>
+#include <core/common/Rtti.hpp>
#include <core/managed/Managed.hpp>
@@ -30,10 +32,32 @@ namespace ousia {
//static Logger logger;
static TerminalLogger logger(std::cerr, true);
+namespace {
+
+class TestManaged1 : public Managed {
+public:
+ using Managed::Managed;
+};
+
+class TestManaged2 : public TestManaged1 {
+public:
+ using TestManaged1::TestManaged1;
+};
+}
+
+namespace RttiTypes {
+static const Rtti<ousia::TestManaged1> TestManaged1 =
+ RttiBuilder("TestManaged1");
+static const Rtti<ousia::TestManaged2> TestManaged2 =
+ RttiBuilder("TestManaged2").parent(&TestManaged1);
+}
+
TEST(Argument, validateBool)
{
Argument a = Argument::Bool("a");
+ ASSERT_FALSE(a.hasDefault);
+
{
Variant v{true};
ASSERT_TRUE(a.validate(v, logger));
@@ -60,16 +84,37 @@ TEST(Argument, validateBoolDefault)
{
Argument a = Argument::Bool("a", true);
- Variant v{1};
- ASSERT_FALSE(a.validate(v, logger));
- ASSERT_TRUE(v.isBool());
- ASSERT_TRUE(v.asBool());
+ ASSERT_TRUE(a.hasDefault);
+ ASSERT_TRUE(a.defaultValue.asBool());
+
+ {
+ Variant v{true};
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isBool());
+ ASSERT_TRUE(v.asBool());
+ }
+
+ {
+ Variant v{false};
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isBool());
+ ASSERT_FALSE(v.asBool());
+ }
+
+ {
+ Variant v{1};
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isBool());
+ ASSERT_TRUE(v.asBool());
+ }
}
TEST(Argument, validateInt)
{
Argument a = Argument::Int("a");
+ ASSERT_FALSE(a.hasDefault);
+
{
Variant v{123};
ASSERT_TRUE(a.validate(v, logger));
@@ -89,16 +134,30 @@ TEST(Argument, validateIntDefault)
{
Argument a = Argument::Int("a", 42);
- Variant v{1.1};
- ASSERT_FALSE(a.validate(v, logger));
- ASSERT_TRUE(v.isInt());
- ASSERT_EQ(42, v.asInt());
+ ASSERT_TRUE(a.hasDefault);
+ ASSERT_EQ(42, a.defaultValue.asInt());
+
+ {
+ Variant v{123};
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isInt());
+ ASSERT_EQ(123, v.asInt());
+ }
+
+ {
+ Variant v{1.1};
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isInt());
+ ASSERT_EQ(42, v.asInt());
+ }
}
TEST(Argument, validateDouble)
{
Argument a = Argument::Double("a");
+ ASSERT_FALSE(a.hasDefault);
+
{
Variant v{123};
ASSERT_TRUE(a.validate(v, logger));
@@ -112,7 +171,7 @@ TEST(Argument, validateDouble)
ASSERT_TRUE(v.isDouble());
ASSERT_EQ(1.1, v.asDouble());
}
-
+
{
Variant v{"1.0"};
ASSERT_FALSE(a.validate(v, logger));
@@ -125,16 +184,37 @@ TEST(Argument, validateDoubleDefault)
{
Argument a = Argument::Double("a", 42.0);
- Variant v{"1.0"};
- ASSERT_FALSE(a.validate(v, logger));
- ASSERT_TRUE(v.isDouble());
- ASSERT_EQ(42.0, v.asDouble());
+ ASSERT_TRUE(a.hasDefault);
+ ASSERT_EQ(42.0, a.defaultValue.asDouble());
+
+ {
+ Variant v{123};
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isDouble());
+ ASSERT_EQ(123.0, v.asDouble());
+ }
+
+ {
+ Variant v{1.1};
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isDouble());
+ ASSERT_EQ(1.1, v.asDouble());
+ }
+
+ {
+ Variant v{"1.0"};
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isDouble());
+ ASSERT_EQ(42.0, v.asDouble());
+ }
}
TEST(Argument, validateString)
{
Argument a = Argument::String("a");
+ ASSERT_FALSE(a.hasDefault);
+
{
Variant v{"test"};
ASSERT_TRUE(a.validate(v, logger));
@@ -182,6 +262,44 @@ TEST(Argument, validateStringDefault)
{
Argument a = Argument::String("a", "test2");
+ ASSERT_TRUE(a.hasDefault);
+ ASSERT_EQ("test2", a.defaultValue.asString());
+
+ {
+ Variant v{"test"};
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isString());
+ ASSERT_EQ("test", v.asString());
+ }
+
+ {
+ Variant v{true};
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isString());
+ ASSERT_EQ("true", v.asString());
+ }
+
+ {
+ Variant v{nullptr};
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isString());
+ ASSERT_EQ("null", v.asString());
+ }
+
+ {
+ Variant v{42};
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isString());
+ ASSERT_EQ("42", v.asString());
+ }
+
+ {
+ Variant v{42.5};
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isString());
+ ASSERT_EQ("42.5", v.asString());
+ }
+
{
Variant v{{1, 2, 3}};
ASSERT_FALSE(a.validate(v, logger));
@@ -190,5 +308,300 @@ TEST(Argument, validateStringDefault)
}
}
+TEST(Argument, validateObject)
+{
+ Manager mgr;
+ Argument a = Argument::Object("a", RttiTypes::TestManaged1);
+
+ ASSERT_FALSE(a.hasDefault);
+
+ {
+ Rooted<Managed> m{new Managed(mgr)};
+ Variant v(m);
+
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isObject());
+ ASSERT_EQ(nullptr, v.asObject());
+ }
+
+ {
+ Rooted<TestManaged1> m{new TestManaged1(mgr)};
+ Variant v(m);
+
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isObject());
+ ASSERT_EQ(m, v.asObject());
+ }
+
+ {
+ Rooted<TestManaged2> m{new TestManaged2(mgr)};
+ Variant v(m);
+
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isObject());
+ ASSERT_EQ(m, v.asObject());
+ }
+
+ {
+ Rooted<TestManaged1> m1{nullptr};
+ Variant v(m1);
+
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isObject());
+ ASSERT_EQ(nullptr, v.asObject());
+ }
+
+ {
+ Variant v("test");
+
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isObject());
+ ASSERT_EQ(nullptr, v.asObject());
+ }
+}
+
+TEST(Argument, validateObjectDefault)
+{
+ Manager mgr;
+ Argument a = Argument::Object("a", RttiTypes::TestManaged1, nullptr);
+
+ ASSERT_TRUE(a.hasDefault);
+ ASSERT_TRUE(a.defaultValue.isObject());
+ ASSERT_EQ(nullptr, a.defaultValue.asObject());
+
+ {
+ Rooted<Managed> m{new Managed(mgr)};
+ Variant v(m);
+
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isObject());
+ ASSERT_EQ(nullptr, v.asObject());
+ }
+
+ {
+ Rooted<TestManaged1> m{new TestManaged1(mgr)};
+ Variant v(m);
+
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isObject());
+ ASSERT_EQ(m, v.asObject());
+ }
+
+ {
+ Rooted<TestManaged2> m{new TestManaged2(mgr)};
+ Variant v(m);
+
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isObject());
+ ASSERT_EQ(m, v.asObject());
+ }
+
+ {
+ Rooted<TestManaged1> m1{nullptr};
+ Variant v(m1);
+
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isObject());
+ ASSERT_EQ(nullptr, v.asObject());
+ }
+
+ {
+ Variant v("test");
+
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isObject());
+ ASSERT_EQ(nullptr, v.asObject());
+ }
+}
+
+static std::shared_ptr<Function> helloWorldFun{new Method<void>{[](
+ const Variant::arrayType &arr, void *) { return Variant{"Hello World"}; }}};
+
+static std::shared_ptr<Function> goodbyeWorldFun{
+ new Method<void>{[](const Variant::arrayType &arr,
+ void *) { return Variant{"Goodbye Cruel World"}; }}};
+
+TEST(Argument, validateFunction)
+{
+ Argument a = Argument::Function("a");
+
+ ASSERT_FALSE(a.hasDefault);
+
+ {
+ Variant v = Variant::fromFunction(helloWorldFun);
+
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isFunction());
+ ASSERT_EQ("Hello World", v.asFunction()->call().asString());
+ }
+
+ {
+ Variant v{"foo"};
+
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isFunction());
+ ASSERT_TRUE(v.asFunction()->call().isNull());
+ }
+}
+
+TEST(Argument, validateFunctionDefault)
+{
+ Argument a = Argument::Function("a", goodbyeWorldFun);
+
+ ASSERT_TRUE(a.hasDefault);
+ ASSERT_TRUE(a.defaultValue.isFunction());
+ ASSERT_EQ(goodbyeWorldFun, a.defaultValue.asFunction());
+
+ {
+ Variant v = Variant::fromFunction(helloWorldFun);
+
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isFunction());
+ ASSERT_EQ("Hello World", v.asFunction()->call().asString());
+ }
+
+ {
+ Variant v{"foo"};
+
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isFunction());
+ ASSERT_EQ("Goodbye Cruel World", v.asFunction()->call().asString());
+ }
+}
+
+TEST(Argument, validateArray)
+{
+ Argument a = Argument::Array("a");
+
+ ASSERT_FALSE(a.hasDefault);
+
+ {
+ Variant::arrayType arr{1, "a", nullptr};
+ Variant v{arr};
+
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isArray());
+ ASSERT_EQ(arr, v.asArray());
+ }
+
+ {
+ Variant v{"foo"};
+
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isArray());
+ ASSERT_EQ(Variant::arrayType{}, v.asArray());
+ }
+}
+
+TEST(Argument, validateArrayDefault)
+{
+ Variant::arrayType arrDefault{1, "a", nullptr};
+ Argument a = Argument::Array("a", arrDefault);
+
+ ASSERT_TRUE(a.hasDefault);
+ ASSERT_TRUE(a.defaultValue.isArray());
+ ASSERT_EQ(arrDefault, a.defaultValue.asArray());
+
+ {
+ Variant::arrayType arr{"test1", 42.5};
+ Variant v{arr};
+
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isArray());
+ ASSERT_EQ(arr, v.asArray());
+ }
+
+ {
+ Variant v{"foo"};
+
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isArray());
+ ASSERT_EQ(arrDefault, v.asArray());
+ }
+}
+
+TEST(Argument, validateArrayInner)
+{
+ Argument a = Argument::Array("a", RttiTypes::String);
+
+ ASSERT_FALSE(a.hasDefault);
+
+ {
+ Variant::arrayType arr{1, "a", nullptr};
+ Variant v{arr};
+
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isArray());
+ ASSERT_EQ(Variant::arrayType({"1", "a", "null"}), v.asArray());
+ }
+
+ {
+ Variant::arrayType arr{1, "a", Variant::fromObject(nullptr)};
+ Variant v{arr};
+
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isArray());
+ ASSERT_EQ(Variant::arrayType({"1", "a", ""}), v.asArray());
+ }
+
+ {
+ Variant v{"foo"};
+
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isArray());
+ ASSERT_EQ(Variant::arrayType{}, v.asArray());
+ }
+}
+
+TEST(Argument, validateArrayInnerDefault)
+{
+ Variant::arrayType arrDefault{1, "a", nullptr};
+ Argument a = Argument::Array("a", RttiTypes::String, arrDefault);
+
+ ASSERT_TRUE(a.hasDefault);
+ ASSERT_TRUE(a.defaultValue.isArray());
+ ASSERT_EQ(arrDefault, a.defaultValue.asArray());
+
+ {
+ Variant::arrayType arr{"test1", 42.5};
+ Variant v{arr};
+
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isArray());
+ ASSERT_EQ(Variant::arrayType({"test1", "42.5"}), v.asArray());
+ }
+
+ {
+ Variant v{"foo"};
+
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isArray());
+ ASSERT_EQ(arrDefault, v.asArray());
+ }
+}
+
+TEST(Argument, validateMap)
+{
+ Argument a = Argument::Map("a");
+
+ ASSERT_FALSE(a.hasDefault);
+
+ {
+ Variant::mapType map{{"key1", 1}, {"key2", "a"}, {"key3", nullptr}};
+ Variant v{map};
+
+ ASSERT_TRUE(a.validate(v, logger));
+ ASSERT_TRUE(v.isMap());
+ ASSERT_EQ(map, v.asMap());
+ }
+
+ {
+ Variant v{"foo"};
+
+ ASSERT_FALSE(a.validate(v, logger));
+ ASSERT_TRUE(v.isMap());
+ ASSERT_EQ(Variant::mapType{}, v.asMap());
+ }
+}
}