2 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 // Enable debug log for test coverage
19 #define DEBUG_ENABLED 1
21 #include "dali-scene-loader/public-api/scene-definition.h"
22 #include "dali-scene-loader/public-api/utils.h"
23 #include <dali-test-suite-utils.h>
26 using namespace Dali::SceneLoader;
28 int UtcDaliSceneDefinitionAddNode(void)
30 SceneDefinition sceneDef;
32 DALI_TEST_EQUAL(sceneDef.GetNodeCount(), 0u);
33 auto node = new NodeDefinition();
34 node->mName = "First";
36 auto result = sceneDef.AddNode(std::unique_ptr<NodeDefinition>{ node });
37 DALI_TEST_EQUAL(result, node);
38 DALI_TEST_EQUAL(sceneDef.GetNodeCount(), 1u);
39 DALI_TEST_EQUAL(sceneDef.GetNode(0), node);
40 DALI_TEST_EQUAL(sceneDef.FindNode(node->mName), node);
42 auto node2 = new NodeDefinition();
43 node2->mName = node->mName;
44 result = sceneDef.AddNode(std::unique_ptr<NodeDefinition>{ node2 });
45 DALI_TEST_EQUAL(result, static_cast<NodeDefinition*>(nullptr)); // failed
46 DALI_TEST_EQUAL(sceneDef.GetNodeCount(), 1u); // still
47 DALI_TEST_EQUAL(sceneDef.GetNode(0), node); // still
48 DALI_TEST_EQUAL(sceneDef.FindNode(node->mName), node); // still
50 auto child = new NodeDefinition();
51 child->mName = "Second";
52 child->mParentIdx = 0;
54 DALI_TEST_CHECK(node->mChildren.empty()); // these are hooked up by AddNode, base on parent idx.
56 result = sceneDef.AddNode(std::unique_ptr<NodeDefinition>{ child });
57 DALI_TEST_EQUAL(result, child);
58 DALI_TEST_EQUAL(sceneDef.GetNodeCount(), 2u);
59 DALI_TEST_EQUAL(sceneDef.GetNode(1), child);
60 DALI_TEST_EQUAL(sceneDef.FindNode(child->mName), child);
62 DALI_TEST_EQUAL(node->mChildren[0], 1u); // these are hooked up by AddNode, base on parent idx.
67 int UtcDaliSceneDefinitionAddRootsFail(void)
69 SceneDefinition sceneDef;
71 DALI_TEST_ASSERTION(sceneDef.AddRootNode(0), "index out of bounds");
72 DALI_TEST_CHECK(sceneDef.GetRoots().empty());
73 DALI_TEST_EQUAL(sceneDef.GetNodeCount(), 0u);
83 SceneDefinition sceneDef;
85 NodeDefinition* childA;
86 NodeDefinition* childB;
90 root{ new NodeDefinition{ "Root" }},
91 childA{ new NodeDefinition{ "A" }},
92 childB{ new NodeDefinition{ "B" }}
94 childA->mParentIdx = 0;
95 childB->mParentIdx = 0;
97 root = sceneDef.AddNode(std::unique_ptr<NodeDefinition>{ root });
98 childA = sceneDef.AddNode(std::unique_ptr<NodeDefinition>{ childA });
99 childB = sceneDef.AddNode(std::unique_ptr<NodeDefinition>{ childB });
110 struct NodeVisitor : NodeDefinition::IVisitor
115 NodeDefinition* node;
117 bool operator==(const Visit& other) const
119 return event == other.event && node == other.node;
123 void Start(NodeDefinition& n) override
125 visits.push_back({ START, &n });
128 void Finish(NodeDefinition& n) override
130 visits.push_back({ FINISH, &n });
133 std::vector<Visit> visits;
136 struct ConstNodeVisitor : NodeDefinition::IConstVisitor
141 const NodeDefinition* node;
143 bool operator==(const Visit& other) const
145 return event == other.event && node == other.node;
149 void Start(const NodeDefinition& n) override
151 visits.push_back({ START, &n });
154 void Finish(const NodeDefinition& n) override
156 visits.push_back({ FINISH, &n });
159 std::vector<Visit> visits;
164 int UtcDaliSceneDefinitionAddRemoveRootNode(void)
168 DALI_TEST_EQUAL(ctx.sceneDef.AddRootNode(0), 0);
169 DALI_TEST_EQUAL(ctx.sceneDef.GetRoots().size(), 1u);
170 DALI_TEST_EQUAL(ctx.sceneDef.GetRoots()[0], 0);
172 ctx.sceneDef.RemoveRootNode(0);
173 DALI_TEST_EQUAL(ctx.sceneDef.GetRoots().size(), 0);
175 DALI_TEST_EQUAL(ctx.sceneDef.GetNodeCount(), 3u);
180 int UtcDaliSceneDefinitionVisit(void)
185 ctx.sceneDef.Visit(0, Customization::Choices{}, visitor);
187 const NodeVisitor::Visit expected[] {
189 { START, ctx.childA },
190 { FINISH, ctx.childA },
191 { START, ctx.childB },
192 { FINISH, ctx.childB },
193 { FINISH, ctx.root },
195 DALI_TEST_CHECK(std::equal(visitor.visits.begin(), visitor.visits.end(), expected));
200 int UtcDaliSceneDefinitionConstVisit(void)
204 ConstNodeVisitor visitor;
205 ctx.sceneDef.Visit(0, Customization::Choices{}, visitor);
207 const ConstNodeVisitor::Visit expected[] {
209 { START, ctx.childA },
210 { FINISH, ctx.childA },
211 { START, ctx.childB },
212 { FINISH, ctx.childB },
213 { FINISH, ctx.root },
215 DALI_TEST_CHECK(std::equal(visitor.visits.begin(), visitor.visits.end(), expected));
220 int UtcDaliSceneDefinitionVisitCustomized(void)
224 ctx.root->mCustomization.reset(new NodeDefinition::CustomizationDefinition{ "A/B" });
226 const NodeVisitor::Visit expected[] {
228 { START, ctx.childB },
229 { FINISH, ctx.childB },
230 { FINISH, ctx.root },
233 Customization::Choices choices;
234 for (auto i : { 1, 2 })
236 choices.Set("A/B", i);
239 ctx.sceneDef.Visit(0, choices, visitor);
241 DALI_TEST_CHECK(std::equal(visitor.visits.begin(), visitor.visits.end(), std::begin(expected)));
247 int UtcDaliSceneDefinitionConstVisitCustomized(void)
251 ctx.root->mCustomization.reset(new NodeDefinition::CustomizationDefinition{ "A/B" });
253 const ConstNodeVisitor::Visit expected[] {
255 { START, ctx.childB },
256 { FINISH, ctx.childB },
257 { FINISH, ctx.root },
260 Customization::Choices choices;
261 for (auto i : { 1, 2 })
263 choices.Set("A/B", i);
265 ConstNodeVisitor visitor;
266 ctx.sceneDef.Visit(0, choices, visitor);
268 DALI_TEST_CHECK(std::equal(visitor.visits.begin(), visitor.visits.end(), std::begin(expected)));
274 int UtcDaliSceneDefinitionGetCustomizationOptions(void)
278 ctx.sceneDef.AddRootNode(0); // GetCustomizationOptions requires this.
280 ctx.root->mCustomization.reset(new NodeDefinition::CustomizationDefinition{ "A/B" });
281 ctx.childA->mCustomization.reset(new NodeDefinition::CustomizationDefinition{ "hello" });
282 ctx.childB->mCustomization.reset(new NodeDefinition::CustomizationDefinition{ "goodbye" });
284 Customization::Choices choices;
285 Customization::Map options;
286 ctx.sceneDef.GetCustomizationOptions(choices, options, &choices);
288 DALI_TEST_EQUAL(choices.Size(), 2u);
289 DALI_TEST_EQUAL(options.Size(), 2u);
294 Customization customization;
295 Customization::OptionType choice;
298 std::vector<TestOption> testOptions {
299 { "A/B", { 2, { "Root" } }, 0 },
300 { "hello", { 0, { "A" } }, 0 },
302 for (auto& testOption: testOptions)
304 auto iFind = choices.Get(testOption.name);
305 DALI_TEST_EQUAL(iFind, testOption.choice);
307 auto iFindOption = options.Get(testOption.name);
308 DALI_TEST_CHECK(iFindOption != nullptr);
309 DALI_TEST_EQUAL(iFindOption->numOptions, testOption.customization.numOptions);
310 DALI_TEST_EQUAL(iFindOption->nodes.size(), testOption.customization.nodes.size());
311 DALI_TEST_CHECK(std::equal(iFindOption->nodes.begin(), iFindOption->nodes.end(),
312 testOption.customization.nodes.begin()));
316 choices.Set("A/B", 1);
317 *options.Get("A/B") = {};
319 testOptions[0].choice = 1;
320 testOptions[1].name = "goodbye";
321 testOptions[1].customization.nodes[0] = "B";
323 ctx.sceneDef.GetCustomizationOptions(choices, options, &choices);
325 DALI_TEST_EQUAL(choices.Size(), 2u);
326 DALI_TEST_EQUAL(options.Size(), 3u);
328 for (auto& testOption: testOptions)
330 auto iFind = choices.Get(testOption.name);
331 DALI_TEST_EQUAL(iFind, testOption.choice);
333 auto iFindOption = options.Get(testOption.name);
334 DALI_TEST_CHECK(iFindOption != nullptr);
335 DALI_TEST_EQUAL(iFindOption->numOptions, testOption.customization.numOptions);
336 DALI_TEST_EQUAL(iFindOption->nodes.size(), testOption.customization.nodes.size());
337 DALI_TEST_CHECK(std::equal(iFindOption->nodes.begin(), iFindOption->nodes.end(),
338 testOption.customization.nodes.begin()));
344 int UtcDaliSceneDefinitionFindNode(void)
348 Index result = INVALID_INDEX;
349 for (auto n: { ctx.root, ctx.childA, ctx.childB })
351 ctx.sceneDef.FindNode(n->mName, &result);
352 DALI_TEST_CHECK(result != INVALID_INDEX);
353 DALI_TEST_EQUAL(ctx.sceneDef.GetNode(result), n);
359 int UtcDaliSceneDefinitionConstFindNode(void)
363 Index result = INVALID_INDEX;
364 for (auto n: { ctx.root, ctx.childA, ctx.childB })
366 const_cast<const TestContext&>(ctx).sceneDef.FindNode(n->mName, &result);
367 DALI_TEST_CHECK(result != INVALID_INDEX);
368 DALI_TEST_EQUAL(ctx.sceneDef.GetNode(result), n);
374 int UtcDaliSceneDefinitionFindNodeIndex(void)
378 Index result = INVALID_INDEX;
379 for (auto n: { ctx.root, ctx.childA, ctx.childB })
381 result = ctx.sceneDef.FindNodeIndex(*n);
382 DALI_TEST_CHECK(result != INVALID_INDEX);
383 DALI_TEST_EQUAL(ctx.sceneDef.GetNode(result), n);
389 int UtcDaliSceneDefinitionFindNodes(void)
393 std::vector<NodeDefinition*> nodes;
394 auto nodeConsumer = [&nodes](NodeDefinition& nd) {
395 nodes.push_back(&nd);
398 auto nodePredicate = [](const NodeDefinition& nd) {
399 return nd.mName.length() == 1;
402 ctx.sceneDef.FindNodes(nodePredicate, nodeConsumer, 1);
403 DALI_TEST_EQUAL(nodes.size(), 1);
404 DALI_TEST_EQUAL(nodes[0]->mName, "A");
405 DALI_TEST_EQUAL(nodes[0], ctx.childA);
408 ctx.sceneDef.FindNodes(nodePredicate, nodeConsumer);
410 DALI_TEST_EQUAL(nodes.size(), 2);
411 DALI_TEST_EQUAL(nodes[0]->mName, "A");
412 DALI_TEST_EQUAL(nodes[0], ctx.childA);
413 DALI_TEST_EQUAL(nodes[1]->mName, "B");
414 DALI_TEST_EQUAL(nodes[1], ctx.childB);
419 int UtcDaliSceneDefinitionRemoveNode(void)
422 DALI_TEST_EQUAL(ctx.sceneDef.RemoveNode("doesn't exist"), false);
425 DALI_TEST_EQUAL(ctx.sceneDef.GetNodeCount(), 3u);
426 DALI_TEST_EQUAL(ctx.root->mChildren.size(), 2u);
429 DALI_TEST_EQUAL(ctx.sceneDef.FindNode("B", &result), ctx.childB);
430 DALI_TEST_EQUAL(result, 2);
432 DALI_TEST_EQUAL(ctx.sceneDef.RemoveNode("A"), true);
435 DALI_TEST_EQUAL(ctx.sceneDef.GetNodeCount(), 2u);
438 DALI_TEST_EQUAL(ctx.sceneDef.FindNode("A", &result), static_cast<NodeDefinition*>(nullptr));
439 DALI_TEST_EQUAL(result, 12345); // doesn't change
441 DALI_TEST_EQUAL(ctx.sceneDef.FindNode("B", &result), ctx.childB);
442 DALI_TEST_EQUAL(result, 1); // dropped
444 DALI_TEST_EQUAL(ctx.root->mChildren.size(), 1u);
445 DALI_TEST_EQUAL(ctx.root->mChildren[0], 1u);
448 DALI_TEST_EQUAL(ctx.sceneDef.RemoveNode("Root"), true);
449 DALI_TEST_EQUAL(ctx.sceneDef.GetNodeCount(), 0);
454 int UtcDaliSceneDefinitionReparentNode(void)
458 ctx.sceneDef.ReparentNode("B", "A", 0);
460 DALI_TEST_EQUAL(ctx.childB->mParentIdx, ctx.sceneDef.FindNodeIndex(*ctx.childA));
461 DALI_TEST_EQUAL(ctx.childA->mChildren.size(), 1u);
462 DALI_TEST_EQUAL(ctx.childA->mChildren[0], ctx.sceneDef.FindNodeIndex(*ctx.childB));