-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathContainerTests.cpp
More file actions
133 lines (107 loc) · 4 KB
/
Copy pathContainerTests.cpp
File metadata and controls
133 lines (107 loc) · 4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// Copyright (c) Prograda Pty. Ltd.
// Licensed under the MIT license. See LICENSE file in the project root for details.
#include <catch2/catch.hpp>
#include <SkyboltReflect/Reflection.h>
using namespace skybolt::refl;
TEST_CASE("Type has expected container accessor class")
{
TypeRegistry registry;
SECTION("value")
{
auto accessor = registry.getOrCreateType<int>()->getContainerValueAccessor();
CHECK(accessor == nullptr);
}
SECTION("std::optional")
{
auto accessor = registry.getOrCreateType<std::optional<int>>()->getContainerValueAccessor();
auto optionalAccessor = dynamic_cast<StdOptionalValueAccessor*>(accessor.get());
REQUIRE(optionalAccessor);
CHECK(optionalAccessor->valueTypeName == registry.getOrCreateType<int>()->getName());
}
SECTION("std::vector")
{
auto accessor = registry.getOrCreateType<std::vector<int>>()->getContainerValueAccessor();
auto vectorAccessor = dynamic_cast<StdVectorValueAccessor*>(accessor.get());
REQUIRE(vectorAccessor);
CHECK(vectorAccessor->valueTypeName == registry.getOrCreateType<int>()->getName());
}
}
TEST_CASE("std::optional accessor can read and write value")
{
TypeRegistry registry;
auto accessor = registry.getOrCreateType<std::optional<int>>()->getContainerValueAccessor();
auto optionalAccessor = dynamic_cast<StdOptionalValueAccessor*>(accessor.get());
REQUIRE(optionalAccessor);
SECTION("Read empty optional")
{
Instance instance = makeValueInstance(registry, std::optional<int>());
auto values = optionalAccessor->getValues(registry, instance);
CHECK(values.empty());
}
SECTION("Read present optional")
{
Instance instance = makeValueInstance(registry, std::optional<int>(123));
auto values = optionalAccessor->getValues(registry, instance);
REQUIRE(values.size() == 1);
CHECK(values.front().cast<int>() == 123);
}
SECTION("Write empty optional")
{
// Create with optional present
Instance instance = makeValueInstance(registry, std::optional<int>(123));
// Set null optional
optionalAccessor->setValues(instance, {});
// Check that optional is null
auto values = optionalAccessor->getValues(registry, instance);
CHECK(values.empty());
}
SECTION("Write present optional")
{
Instance instance = makeValueInstance(registry, std::optional<int>(123));
auto values = optionalAccessor->getValues(registry, instance);
REQUIRE(values.size() == 1);
CHECK(values.front().cast<int>() == 123);
}
}
TEST_CASE("std::vector accessor can read and write values")
{
TypeRegistry registry;
auto accessor = registry.getOrCreateType<std::vector<int>>()->getContainerValueAccessor();
auto vectorAccessor = dynamic_cast<StdVectorValueAccessor*>(accessor.get());
REQUIRE(vectorAccessor);
SECTION("Read empty vector")
{
Instance instance = makeValueInstance(registry, std::vector<int>());
auto values = vectorAccessor->getValues(registry, instance);
CHECK(values.empty());
}
SECTION("Read vector with values")
{
Instance instance = makeValueInstance(registry, std::vector<int>({1, 2}));
auto values = vectorAccessor->getValues(registry, instance);
REQUIRE(values.size() == 2);
CHECK(values.front().cast<int>() == 1);
CHECK(values.back().cast<int>() == 2);
}
SECTION("Write empty vector")
{
// Create with values in vector
Instance instance = makeValueInstance(registry, std::vector<int>({1, 2}));
// Clear vector
vectorAccessor->setValues(instance, {});
// Check that vector is empty
auto values = vectorAccessor->getValues(registry, instance);
CHECK(values.empty());
}
SECTION("Write vector with values")
{
// Create with empty vector
Instance instance = makeValueInstance(registry, std::vector<int>());
// Add value to vector
vectorAccessor->setValues(instance, {makeValueInstance(registry, 1)});
// Check that vector has values
auto values = vectorAccessor->getValues(registry, instance);
REQUIRE(values.size() == 1);
CHECK(values.front().cast<int>() == 1);
}
}