From e820236e75962fb32d6897fcd217b2d3ad298a11 Mon Sep 17 00:00:00 2001 From: Paul Novotny Date: Thu, 13 Oct 2016 00:48:11 +0100 Subject: [PATCH] Fix some Node::operator[] regressions from 0.5.1 Bug-Debian: https://bugs.debian.org/835417 Origin: upstream, https://github.com/jbeder/yaml-cpp/commit/b426fafff Last-Update: 2016-10-11 Gbp-Pq: Name backport-b426fafff.patch --- include/yaml-cpp/node/impl.h | 10 +++++----- test/node/node_test.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/include/yaml-cpp/node/impl.h b/include/yaml-cpp/node/impl.h index 164c533..9cedfa4 100644 --- a/include/yaml-cpp/node/impl.h +++ b/include/yaml-cpp/node/impl.h @@ -142,7 +142,7 @@ inline const T Node::as() const { template inline const T Node::as(const S& fallback) const { if (!m_isValid) - throw InvalidNode(); + return fallback; return as_if(*this)(fallback); } @@ -275,26 +275,26 @@ inline std::size_t Node::size() const { inline const_iterator Node::begin() const { if (!m_isValid) - throw InvalidNode(); + return const_iterator(); return m_pNode ? const_iterator(m_pNode->begin(), m_pMemory) : const_iterator(); } inline iterator Node::begin() { if (!m_isValid) - throw InvalidNode(); + return iterator(); return m_pNode ? iterator(m_pNode->begin(), m_pMemory) : iterator(); } inline const_iterator Node::end() const { if (!m_isValid) - throw InvalidNode(); + return const_iterator(); return m_pNode ? const_iterator(m_pNode->end(), m_pMemory) : const_iterator(); } inline iterator Node::end() { if (!m_isValid) - throw InvalidNode(); + return iterator(); return m_pNode ? iterator(m_pNode->end(), m_pMemory) : iterator(); } diff --git a/test/node/node_test.cpp b/test/node/node_test.cpp index f54fcc9..5ab4704 100644 --- a/test/node/node_test.cpp +++ b/test/node/node_test.cpp @@ -73,6 +73,12 @@ TEST(NodeTest, MapWithUndefinedValues) { EXPECT_EQ(2, node.size()); } +TEST(NodeTest, UndefinedConstNodeWithFallback) { + Node node; + const Node& cn = node; + EXPECT_EQ(cn["undefined"].as(3), 3); +} + TEST(NodeTest, MapIteratorWithUndefinedValues) { Node node; node["key"] = "value"; @@ -84,6 +90,32 @@ TEST(NodeTest, MapIteratorWithUndefinedValues) { EXPECT_EQ(1, count); } +TEST(NodeTest, ConstIteratorOnConstUndefinedNode) { + Node node; + const Node& cn = node; + const Node& undefinedCn = cn["undefined"]; + + std::size_t count = 0; + for (const_iterator it = undefinedCn.begin(); it != undefinedCn.end(); ++it) { + count++; + } + EXPECT_EQ(0, count); +} + +TEST(NodeTest, IteratorOnConstUndefinedNode) { + Node node; + const Node& cn = node; + const Node& undefinedCn = cn["undefined"]; + + Node& nonConstUndefinedNode = const_cast(undefinedCn); + + std::size_t count = 0; + for (iterator it = nonConstUndefinedNode.begin(); it != nonConstUndefinedNode.end(); ++it) { + count++; + } + EXPECT_EQ(0, count); +} + TEST(NodeTest, SimpleSubkeys) { Node node; node["device"]["udid"] = "12345"; -- 2.30.2