//===-- XMLTest.cpp -------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "lldb/Host/XML.h"
#include "gtest/gtest.h"
using namespace lldb_private;
#if LLDB_ENABLE_LIBXML2
static void assertGetElement(XMLNode &root, const char *element_name,
bool expected_uint_success, uint64_t expected_uint,
bool expected_double_success,
double expected_double) {
XMLNode node = root.FindFirstChildElementWithName(element_name);
ASSERT_TRUE(node.IsValid());
uint64_t uint_val;
EXPECT_EQ(node.GetElementTextAsUnsigned(uint_val, 66, 0),
expected_uint_success);
EXPECT_EQ(uint_val, expected_uint);
double double_val;
EXPECT_EQ(node.GetElementTextAsFloat(double_val, 66.0),
expected_double_success);
EXPECT_EQ(double_val, expected_double);
XMLNode attr_node = root.FindFirstChildElementWithName("attr");
ASSERT_TRUE(node.IsValid());
EXPECT_EQ(
attr_node.GetAttributeValueAsUnsigned(element_name, uint_val, 66, 0),
expected_uint_success);
EXPECT_EQ(uint_val, expected_uint);
}
#define ASSERT_GET(element_name, ...) \
{ \
SCOPED_TRACE("at element/attribute " element_name); \
assertGetElement(root, element_name, __VA_ARGS__); \
}
TEST(XML, GetAs) {
std::string test_xml =
"\n"
"\n"
" \n"
" 123foo\n"
" 11\n"
" -11\n"
" 18446744073709551616\n"
" -9223372036854775809\n"
" 0x1234\n"
" 12.5\n"
" -12.5\n"
" \n"
"\n";
XMLDocument doc;
ASSERT_TRUE(doc.ParseMemory(test_xml.data(), test_xml.size()));
XMLNode root = doc.GetRootElement();
ASSERT_TRUE(root.IsValid());
ASSERT_GET("empty", false, 66, false, 66.0);
ASSERT_GET("text", false, 66, false, 66.0);
ASSERT_GET("positive-int", true, 11, true, 11.0);
ASSERT_GET("negative-int", false, 66, true, -11.0);
ASSERT_GET("positive-overflow", false, 66, true, 18446744073709551616.0);
ASSERT_GET("negative-overflow", false, 66, true, -9223372036854775809.0);
ASSERT_GET("hex", true, 0x1234, true, 4660.0);
ASSERT_GET("positive-float", false, 66, true, 12.5);
ASSERT_GET("negative-float", false, 66, true, -12.5);
}
#else // !LLDB_ENABLE_LIBXML2
TEST(XML, GracefulNoXML) {
std::string test_xml =
"\n"
"\n"
" 123\n"
"\n";
XMLDocument doc;
ASSERT_FALSE(doc.ParseMemory(test_xml.data(), test_xml.size()));
XMLNode root = doc.GetRootElement();
EXPECT_FALSE(root.IsValid());
XMLNode node = root.FindFirstChildElementWithName("text");
EXPECT_FALSE(node.IsValid());
uint64_t uint_val;
EXPECT_FALSE(node.GetElementTextAsUnsigned(uint_val, 66, 0));
EXPECT_EQ(uint_val, 66U);
EXPECT_FALSE(node.GetAttributeValueAsUnsigned("attribute", uint_val, 66, 0));
EXPECT_EQ(uint_val, 66U);
double double_val;
EXPECT_FALSE(node.GetElementTextAsFloat(double_val, 66.0));
EXPECT_EQ(double_val, 66.0);
}
#endif // LLDB_ENABLE_LIBXML2