1*93b82f45SMichał Górny //===-- XMLTest.cpp -------------------------------------------------------===//
2*93b82f45SMichał Górny //
3*93b82f45SMichał Górny // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*93b82f45SMichał Górny // See https://llvm.org/LICENSE.txt for license information.
5*93b82f45SMichał Górny // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*93b82f45SMichał Górny //
7*93b82f45SMichał Górny //===----------------------------------------------------------------------===//
8*93b82f45SMichał Górny
9*93b82f45SMichał Górny #include "lldb/Host/XML.h"
10*93b82f45SMichał Górny #include "gtest/gtest.h"
11*93b82f45SMichał Górny
12*93b82f45SMichał Górny using namespace lldb_private;
13*93b82f45SMichał Górny
14*93b82f45SMichał Górny #if LLDB_ENABLE_LIBXML2
15*93b82f45SMichał Górny
assertGetElement(XMLNode & root,const char * element_name,bool expected_uint_success,uint64_t expected_uint,bool expected_double_success,double expected_double)16*93b82f45SMichał Górny static void assertGetElement(XMLNode &root, const char *element_name,
17*93b82f45SMichał Górny bool expected_uint_success, uint64_t expected_uint,
18*93b82f45SMichał Górny bool expected_double_success,
19*93b82f45SMichał Górny double expected_double) {
20*93b82f45SMichał Górny XMLNode node = root.FindFirstChildElementWithName(element_name);
21*93b82f45SMichał Górny ASSERT_TRUE(node.IsValid());
22*93b82f45SMichał Górny
23*93b82f45SMichał Górny uint64_t uint_val;
24*93b82f45SMichał Górny EXPECT_EQ(node.GetElementTextAsUnsigned(uint_val, 66, 0),
25*93b82f45SMichał Górny expected_uint_success);
26*93b82f45SMichał Górny EXPECT_EQ(uint_val, expected_uint);
27*93b82f45SMichał Górny
28*93b82f45SMichał Górny double double_val;
29*93b82f45SMichał Górny EXPECT_EQ(node.GetElementTextAsFloat(double_val, 66.0),
30*93b82f45SMichał Górny expected_double_success);
31*93b82f45SMichał Górny EXPECT_EQ(double_val, expected_double);
32*93b82f45SMichał Górny
33*93b82f45SMichał Górny XMLNode attr_node = root.FindFirstChildElementWithName("attr");
34*93b82f45SMichał Górny ASSERT_TRUE(node.IsValid());
35*93b82f45SMichał Górny
36*93b82f45SMichał Górny EXPECT_EQ(
37*93b82f45SMichał Górny attr_node.GetAttributeValueAsUnsigned(element_name, uint_val, 66, 0),
38*93b82f45SMichał Górny expected_uint_success);
39*93b82f45SMichał Górny EXPECT_EQ(uint_val, expected_uint);
40*93b82f45SMichał Górny }
41*93b82f45SMichał Górny
42*93b82f45SMichał Górny #define ASSERT_GET(element_name, ...) \
43*93b82f45SMichał Górny { \
44*93b82f45SMichał Górny SCOPED_TRACE("at element/attribute " element_name); \
45*93b82f45SMichał Górny assertGetElement(root, element_name, __VA_ARGS__); \
46*93b82f45SMichał Górny }
47*93b82f45SMichał Górny
TEST(XML,GetAs)48*93b82f45SMichał Górny TEST(XML, GetAs) {
49*93b82f45SMichał Górny std::string test_xml =
50*93b82f45SMichał Górny "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
51*93b82f45SMichał Górny "<test>\n"
52*93b82f45SMichał Górny " <empty/>\n"
53*93b82f45SMichał Górny " <text>123foo</text>\n"
54*93b82f45SMichał Górny " <positive-int>11</positive-int>\n"
55*93b82f45SMichał Górny " <negative-int>-11</negative-int>\n"
56*93b82f45SMichał Górny " <positive-overflow>18446744073709551616</positive-overflow>\n"
57*93b82f45SMichał Górny " <negative-overflow>-9223372036854775809</negative-overflow>\n"
58*93b82f45SMichał Górny " <hex>0x1234</hex>\n"
59*93b82f45SMichał Górny " <positive-float>12.5</positive-float>\n"
60*93b82f45SMichał Górny " <negative-float>-12.5</negative-float>\n"
61*93b82f45SMichał Górny " <attr empty=\"\"\n"
62*93b82f45SMichał Górny " text=\"123foo\"\n"
63*93b82f45SMichał Górny " positive-int=\"11\"\n"
64*93b82f45SMichał Górny " negative-int=\"-11\"\n"
65*93b82f45SMichał Górny " positive-overflow=\"18446744073709551616\"\n"
66*93b82f45SMichał Górny " negative-overflow=\"-9223372036854775809\"\n"
67*93b82f45SMichał Górny " hex=\"0x1234\"\n"
68*93b82f45SMichał Górny " positive-float=\"12.5\"\n"
69*93b82f45SMichał Górny " negative-float=\"-12.5\"\n"
70*93b82f45SMichał Górny " />\n"
71*93b82f45SMichał Górny "</test>\n";
72*93b82f45SMichał Górny
73*93b82f45SMichał Górny XMLDocument doc;
74*93b82f45SMichał Górny ASSERT_TRUE(doc.ParseMemory(test_xml.data(), test_xml.size()));
75*93b82f45SMichał Górny
76*93b82f45SMichał Górny XMLNode root = doc.GetRootElement();
77*93b82f45SMichał Górny ASSERT_TRUE(root.IsValid());
78*93b82f45SMichał Górny
79*93b82f45SMichał Górny ASSERT_GET("empty", false, 66, false, 66.0);
80*93b82f45SMichał Górny ASSERT_GET("text", false, 66, false, 66.0);
81*93b82f45SMichał Górny ASSERT_GET("positive-int", true, 11, true, 11.0);
82*93b82f45SMichał Górny ASSERT_GET("negative-int", false, 66, true, -11.0);
83*93b82f45SMichał Górny ASSERT_GET("positive-overflow", false, 66, true, 18446744073709551616.0);
84*93b82f45SMichał Górny ASSERT_GET("negative-overflow", false, 66, true, -9223372036854775809.0);
85*93b82f45SMichał Górny ASSERT_GET("hex", true, 0x1234, true, 4660.0);
86*93b82f45SMichał Górny ASSERT_GET("positive-float", false, 66, true, 12.5);
87*93b82f45SMichał Górny ASSERT_GET("negative-float", false, 66, true, -12.5);
88*93b82f45SMichał Górny }
89*93b82f45SMichał Górny
90*93b82f45SMichał Górny #else // !LLDB_ENABLE_LIBXML2
91*93b82f45SMichał Górny
TEST(XML,GracefulNoXML)92*93b82f45SMichał Górny TEST(XML, GracefulNoXML) {
93*93b82f45SMichał Górny std::string test_xml =
94*93b82f45SMichał Górny "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
95*93b82f45SMichał Górny "<test>\n"
96*93b82f45SMichał Górny " <text attribute=\"123\">123</text>\n"
97*93b82f45SMichał Górny "</test>\n";
98*93b82f45SMichał Górny
99*93b82f45SMichał Górny XMLDocument doc;
100*93b82f45SMichał Górny ASSERT_FALSE(doc.ParseMemory(test_xml.data(), test_xml.size()));
101*93b82f45SMichał Górny
102*93b82f45SMichał Górny XMLNode root = doc.GetRootElement();
103*93b82f45SMichał Górny EXPECT_FALSE(root.IsValid());
104*93b82f45SMichał Górny
105*93b82f45SMichał Górny XMLNode node = root.FindFirstChildElementWithName("text");
106*93b82f45SMichał Górny EXPECT_FALSE(node.IsValid());
107*93b82f45SMichał Górny
108*93b82f45SMichał Górny uint64_t uint_val;
109*93b82f45SMichał Górny EXPECT_FALSE(node.GetElementTextAsUnsigned(uint_val, 66, 0));
110*93b82f45SMichał Górny EXPECT_EQ(uint_val, 66U);
111*93b82f45SMichał Górny EXPECT_FALSE(node.GetAttributeValueAsUnsigned("attribute", uint_val, 66, 0));
112*93b82f45SMichał Górny EXPECT_EQ(uint_val, 66U);
113*93b82f45SMichał Górny
114*93b82f45SMichał Górny double double_val;
115*93b82f45SMichał Górny EXPECT_FALSE(node.GetElementTextAsFloat(double_val, 66.0));
116*93b82f45SMichał Górny EXPECT_EQ(double_val, 66.0);
117*93b82f45SMichał Górny }
118*93b82f45SMichał Górny
119*93b82f45SMichał Górny #endif // LLDB_ENABLE_LIBXML2
120