1 //Copyright (c) 2020 Ultimaker B.V.
2 //libSavitar is released under the terms of the AGPLv3 or higher.
3 
4 #include "../src/Namespace.h"
5 
6 #include <fstream>
7 #include <gtest/gtest.h>
8 #include <iostream>
9 #include <string>
10 #include "../pugixml/src/pugixml.hpp"
11 
12 namespace xml_namespace
13 {
14     class NamespaceTest : public testing::Test
15     {
16     public:
17         pugi::xml_document document;
18         pugi::xml_node main_xml_node;
19 
SetUp()20         void SetUp()
21         {
22             std::ifstream test_model_file("../tests/namespaces.xml");
23             if (test_model_file.is_open())
24             {
25                 const std::string xml_string(std::istreambuf_iterator<char>{test_model_file}, {});
26 
27                 pugi::xml_parse_result result = document.load_string(xml_string.c_str());
28                 main_xml_node = document.child("main");
29             }
30         }
31     };
32 
TEST_F(NamespaceTest,getAncestralNamespaces)33     TEST_F(NamespaceTest, getAncestralNamespaces)
34     {
35         ASSERT_TRUE(main_xml_node);
36 
37         pugi::xml_node node;
38         xml_namespace::xmlns_map_t result;
39 
40         node = main_xml_node.child("simple");
41         result = xml_namespace::getAncestralNamespaces(node);
42         ASSERT_EQ(result.size(), 2); // <-- including default namespace
43         ASSERT_EQ(result["_a_"].size(), 1);
44         ASSERT_EQ(result["_a_"].count("a"), 1);
45 
46         node = main_xml_node.child("multiple");
47         result = xml_namespace::getAncestralNamespaces(node);
48         ASSERT_EQ(result["_a_"].count("a"), 1);
49         ASSERT_EQ(result["_b_"].count("b"), 1);
50         ASSERT_EQ(result["_c_"].count("c"), 1);
51 
52         node = main_xml_node.child("overwrite"); // _before_ overwrite
53         result = xml_namespace::getAncestralNamespaces(node);
54         ASSERT_EQ(result.size(), 2);
55         ASSERT_EQ(result["_b_"].size(), 1);
56         ASSERT_EQ(result["_b_"].count("b"), 1);
57 
58         node = main_xml_node.child("overwrite").child("sub"); // _after_ overwrite
59         result = xml_namespace::getAncestralNamespaces(node);
60         ASSERT_EQ(result.size(), 2);
61         ASSERT_EQ(result.count("_b_"), 0);
62         ASSERT_EQ(result["_c_"].size(), 1);
63         ASSERT_EQ(result["_c_"].count("b"), 1);
64 
65         node = main_xml_node.child("combine").child("sub");
66         result = xml_namespace::getAncestralNamespaces(node);
67         ASSERT_EQ(result.size(), 2);
68         ASSERT_EQ(result["_s_"].size(), 2);
69         ASSERT_EQ(result["_s_"].count("s"), 1);
70         ASSERT_EQ(result["_s_"].count("n"), 1);
71 
72         node = main_xml_node.child("deep").child("sub");
73         result = xml_namespace::getAncestralNamespaces(node);
74         ASSERT_EQ(result.size(), 3);
75         ASSERT_EQ(result.count("_w_"), 0);
76         ASSERT_EQ(result.count("_x_"), 1);
77 
78         node = main_xml_node.child("deep").child("sub").child("subber").child("subbest");
79         result = xml_namespace::getAncestralNamespaces(node);
80         ASSERT_EQ(result.size(), 6);
81         ASSERT_EQ(result.count("_w_"), 1);
82         ASSERT_EQ(result.count("_x_"), 1);
83 
84         node = main_xml_node.child("multideep").child("sub").child("subber").child("subbest");
85         result = xml_namespace::getAncestralNamespaces(node);
86         ASSERT_EQ(result.size(), 6);
87         ASSERT_EQ(result.count("_w_"), 1);
88         ASSERT_EQ(result.count("_x_"), 1);
89 
90         node = main_xml_node.child("multideep").child("subber").child("subbest");
91         result = xml_namespace::getAncestralNamespaces(node);
92         ASSERT_EQ(result.size(), 5);
93         ASSERT_EQ(result.count("_w_"), 0);
94         ASSERT_EQ(result.count("_e_"), 1);
95         ASSERT_EQ(result.count("_q_"), 1);
96         ASSERT_EQ(result.count("_r_"), 1);
97 
98         node = main_xml_node.child("multideep").child("subbest");
99         result = xml_namespace::getAncestralNamespaces(node);
100         ASSERT_EQ(result.size(), 3);
101         ASSERT_EQ(result.count("_e_"), 0);
102         ASSERT_EQ(result.count("_q_"), 1);
103     }
104 
105     // std::set<std::string> getNamesFor(const xmlns_map_t& map, const std::string& uri);
TEST_F(NamespaceTest,getNamesFor)106     TEST_F(NamespaceTest, getNamesFor)
107     {
108         ASSERT_TRUE(main_xml_node);
109         pugi::xml_node node = main_xml_node.child("multideep").child("sub").child("subber").child("subbest");
110         xml_namespace::xmlns_map_t map = xml_namespace::getAncestralNamespaces(node);
111         ASSERT_EQ(xml_namespace::getNamesFor(map, "_w_").count("w"), 1);
112         ASSERT_EQ(xml_namespace::getNamesFor(map, "_p_").size(), 0);
113     }
114 
115 } // namespace xml_namespace
116