From 303f9a3afc4a86147213d4ac57894480485090a2 Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Wed, 2 May 2018 18:08:46 +0000 Subject: [xml] Simplify the CFX_XMLParser parse methods This CL moves the switch from CFX_XMLParse::Parse into CFX_XMLParser::DoSyntaxParse. This means all the work to build the tree is now done in one place instead of spread between the two methods. Change-Id: Ie9c6cd67795c3fcbd3e305187a06cd727d386a7c Reviewed-on: https://pdfium-review.googlesource.com/31950 Reviewed-by: Henrique Nakashima Commit-Queue: dsinclair --- core/fxcrt/xml/cfx_xmlparser.cpp | 250 +++++-------- core/fxcrt/xml/cfx_xmlparser.h | 27 +- core/fxcrt/xml/cfx_xmlparser_unittest.cpp | 566 +++++++++--------------------- 3 files changed, 255 insertions(+), 588 deletions(-) diff --git a/core/fxcrt/xml/cfx_xmlparser.cpp b/core/fxcrt/xml/cfx_xmlparser.cpp index b484660f1f..7a571e38b0 100644 --- a/core/fxcrt/xml/cfx_xmlparser.cpp +++ b/core/fxcrt/xml/cfx_xmlparser.cpp @@ -74,14 +74,6 @@ CFX_XMLParser::CFX_XMLParser(const RetainPtr& pStream) { std::min(m_iXMLPlaneSize, pdfium::base::checked_cast(m_pStream->GetSize())); - FX_SAFE_SIZE_T alloc_size_safe = m_iXMLPlaneSize; - alloc_size_safe += 1; // For NUL. - if (!alloc_size_safe.IsValid() || alloc_size_safe.ValueOrDie() <= 0) { - m_syntaxParserResult = FX_XmlSyntaxResult::Error; - return; - } - - m_Buffer.resize(pdfium::base::ValueOrDieForType(alloc_size_safe)); current_text_.reserve(kCurrentTextReserve); } @@ -91,110 +83,28 @@ std::unique_ptr CFX_XMLParser::Parse() { auto doc = pdfium::MakeUnique(); current_node_ = doc->GetRoot(); - int32_t iCount = 0; - while (true) { - FX_XmlSyntaxResult result = DoSyntaxParse(); - if (result == FX_XmlSyntaxResult::Error) - return nullptr; - if (result == FX_XmlSyntaxResult::EndOfString) - break; - - switch (result) { - case FX_XmlSyntaxResult::InstructionClose: - if (current_node_ && current_node_->GetType() == FX_XMLNODE_Instruction) - current_node_ = current_node_->GetParent(); - break; - case FX_XmlSyntaxResult::ElementClose: { - if (current_node_->GetType() != FX_XMLNODE_Element) - return nullptr; - - WideString element_name = GetTextData(); - if (element_name.GetLength() > 0 && - element_name != - static_cast(current_node_)->GetName()) { - return nullptr; - } + FX_SAFE_SIZE_T alloc_size_safe = m_iXMLPlaneSize; + alloc_size_safe += 1; // For NUL. + if (!alloc_size_safe.IsValid() || alloc_size_safe.ValueOrDie() <= 0) + return nullptr; - current_node_ = current_node_->GetParent(); - iCount++; - break; - } - case FX_XmlSyntaxResult::TargetName: { - WideString target_name = GetTextData(); - if (target_name == L"originalXFAVersion" || target_name == L"acrobat") { - auto* node = doc->CreateNode(target_name); - current_node_->AppendChild(node); - current_node_ = node; - } - break; - } - case FX_XmlSyntaxResult::TagName: { - auto* child = doc->CreateNode(GetTextData()); - current_node_->AppendChild(child); - current_node_ = child; - break; - } - case FX_XmlSyntaxResult::AttriName: { - current_attribute_name_ = GetTextData(); - break; - } - case FX_XmlSyntaxResult::AttriValue: - if (current_node_ && current_node_->GetType() == FX_XMLNODE_Element) { - static_cast(current_node_) - ->SetAttribute(current_attribute_name_, GetTextData()); - } - current_attribute_name_.clear(); - break; - case FX_XmlSyntaxResult::Text: { - current_node_->AppendChild(doc->CreateNode(GetTextData())); - break; - } - case FX_XmlSyntaxResult::CData: { - current_node_->AppendChild( - doc->CreateNode(GetTextData())); - break; - } - case FX_XmlSyntaxResult::TargetData: { - WideString target_data = GetTextData(); - if (current_node_ && - current_node_->GetType() == FX_XMLNODE_Instruction) { - if (target_data.IsEmpty()) - break; - static_cast(current_node_) - ->AppendData(target_data); - } - break; - } - case FX_XmlSyntaxResult::ElementOpen: - case FX_XmlSyntaxResult::ElementBreak: - case FX_XmlSyntaxResult::InstructionOpen: - default: - break; - } - } - return doc; -} + m_Buffer.resize(pdfium::base::ValueOrDieForType(alloc_size_safe)); -FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { - if (m_syntaxParserResult == FX_XmlSyntaxResult::Error || - m_syntaxParserResult == FX_XmlSyntaxResult::EndOfString) { - return m_syntaxParserResult; - } + return DoSyntaxParse(doc.get()) ? std::move(doc) : nullptr; +} - FX_XmlSyntaxResult syntaxParserResult = FX_XmlSyntaxResult::None; +bool CFX_XMLParser::DoSyntaxParse(CFX_XMLDocument* doc) { + int32_t iCount = 0; while (true) { if (m_Start >= m_End) { - if (m_pStream->IsEOF()) { - m_syntaxParserResult = FX_XmlSyntaxResult::EndOfString; - return m_syntaxParserResult; - } + if (m_pStream->IsEOF()) + return true; size_t buffer_chars = m_pStream->ReadBlock(m_Buffer.data(), m_iXMLPlaneSize); - if (buffer_chars == 0) { - m_syntaxParserResult = FX_XmlSyntaxResult::EndOfString; - return m_syntaxParserResult; - } + if (buffer_chars == 0) + return true; + m_Start = 0; m_End = buffer_chars; } @@ -205,7 +115,8 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { case FDE_XmlSyntaxState::Text: if (ch == L'<') { if (!current_text_.empty()) { - syntaxParserResult = FX_XmlSyntaxResult::Text; + current_node_->AppendChild( + doc->CreateNode(GetTextData())); } else { m_Start++; m_syntaxParserState = FDE_XmlSyntaxState::Node; @@ -225,22 +136,25 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { m_XMLNodeTypeStack.push(FX_XMLNODE_Instruction); m_Start++; m_syntaxParserState = FDE_XmlSyntaxState::Target; - syntaxParserResult = FX_XmlSyntaxResult::InstructionOpen; } else { m_XMLNodeTypeStack.push(FX_XMLNODE_Element); m_syntaxParserState = FDE_XmlSyntaxState::Tag; - syntaxParserResult = FX_XmlSyntaxResult::ElementOpen; } break; case FDE_XmlSyntaxState::Target: if (!IsXMLNameChar(ch, current_text_.empty())) { - if (current_text_.empty()) { - m_syntaxParserResult = FX_XmlSyntaxResult::Error; - return m_syntaxParserResult; - } + if (current_text_.empty()) + return false; - syntaxParserResult = FX_XmlSyntaxResult::TargetName; m_syntaxParserState = FDE_XmlSyntaxState::TargetData; + + WideString target_name = GetTextData(); + if (target_name == L"originalXFAVersion" || + target_name == L"acrobat") { + auto* node = doc->CreateNode(target_name); + current_node_->AppendChild(node); + current_node_ = node; + } } else { current_text_.push_back(ch); m_Start++; @@ -248,13 +162,14 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { break; case FDE_XmlSyntaxState::Tag: if (!IsXMLNameChar(ch, current_text_.empty())) { - if (current_text_.empty()) { - m_syntaxParserResult = FX_XmlSyntaxResult::Error; - return m_syntaxParserResult; - } + if (current_text_.empty()) + return false; - syntaxParserResult = FX_XmlSyntaxResult::TagName; m_syntaxParserState = FDE_XmlSyntaxState::AttriName; + + auto* child = doc->CreateNode(GetTextData()); + current_node_->AppendChild(child); + current_node_ = child; } else { current_text_.push_back(ch); m_Start++; @@ -281,8 +196,7 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { } break; } - m_syntaxParserResult = FX_XmlSyntaxResult::Error; - return m_syntaxParserResult; + return false; } else { if (m_XMLNodeTypeStack.top() == FX_XMLNODE_Instruction) { if (ch != '=' && !IsXMLWhiteSpace(ch)) { @@ -291,7 +205,7 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { } } m_syntaxParserState = FDE_XmlSyntaxState::AttriEqualSign; - syntaxParserResult = FX_XmlSyntaxResult::AttriName; + current_attribute_name_ = GetTextData(); } } else { current_text_.push_back(ch); @@ -308,8 +222,7 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { m_syntaxParserState = FDE_XmlSyntaxState::TargetData; break; } - m_syntaxParserResult = FX_XmlSyntaxResult::Error; - return m_syntaxParserResult; + return false; } else { m_syntaxParserState = FDE_XmlSyntaxState::AttriQuotation; m_Start++; @@ -321,8 +234,7 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { break; } if (ch != L'\"' && ch != L'\'') { - m_syntaxParserResult = FX_XmlSyntaxResult::Error; - return m_syntaxParserResult; + return false; } m_wQuotationMark = ch; @@ -331,14 +243,19 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { break; case FDE_XmlSyntaxState::AttriValue: if (ch == m_wQuotationMark) { - if (m_iEntityStart > -1) { - m_syntaxParserResult = FX_XmlSyntaxResult::Error; - return m_syntaxParserResult; - } + if (m_iEntityStart > -1) + return false; + m_wQuotationMark = 0; m_Start++; m_syntaxParserState = FDE_XmlSyntaxState::AttriName; - syntaxParserResult = FX_XmlSyntaxResult::AttriValue; + + if (current_node_ && + current_node_->GetType() == FX_XMLNODE_Element) { + static_cast(current_node_) + ->SetAttribute(current_attribute_name_, GetTextData()); + } + current_attribute_name_.clear(); } else { ProcessTextChar(ch); } @@ -348,45 +265,53 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { current_text_.push_back(ch); m_syntaxParserState = FDE_XmlSyntaxState::TargetData; } else if (!current_text_.empty()) { - syntaxParserResult = FX_XmlSyntaxResult::TargetData; + ProcessTargetData(); } else { m_Start++; - if (m_XMLNodeTypeStack.empty()) { - m_syntaxParserResult = FX_XmlSyntaxResult::Error; - return m_syntaxParserResult; - } - m_XMLNodeTypeStack.pop(); + if (m_XMLNodeTypeStack.empty()) + return false; + m_XMLNodeTypeStack.pop(); m_syntaxParserState = FDE_XmlSyntaxState::Text; - syntaxParserResult = FX_XmlSyntaxResult::InstructionClose; + + if (current_node_ && + current_node_->GetType() == FX_XMLNODE_Instruction) + current_node_ = current_node_->GetParent(); } break; case FDE_XmlSyntaxState::BreakElement: if (ch == L'>') { m_syntaxParserState = FDE_XmlSyntaxState::Text; - syntaxParserResult = FX_XmlSyntaxResult::ElementBreak; } else if (ch == L'/') { m_syntaxParserState = FDE_XmlSyntaxState::CloseElement; } else { - m_syntaxParserResult = FX_XmlSyntaxResult::Error; - return m_syntaxParserResult; + return false; } m_Start++; break; case FDE_XmlSyntaxState::CloseElement: if (!IsXMLNameChar(ch, current_text_.empty())) { if (ch == L'>') { - if (m_XMLNodeTypeStack.empty()) { - m_syntaxParserResult = FX_XmlSyntaxResult::Error; - return m_syntaxParserResult; - } - m_XMLNodeTypeStack.pop(); + if (m_XMLNodeTypeStack.empty()) + return false; + m_XMLNodeTypeStack.pop(); m_syntaxParserState = FDE_XmlSyntaxState::Text; - syntaxParserResult = FX_XmlSyntaxResult::ElementClose; + + if (current_node_->GetType() != FX_XMLNODE_Element) + return false; + + WideString element_name = GetTextData(); + if (element_name.GetLength() > 0 && + element_name != + static_cast(current_node_)->GetName()) { + return false; + } + + current_node_ = current_node_->GetParent(); + iCount++; } else if (!IsXMLWhiteSpace(ch)) { - m_syntaxParserResult = FX_XmlSyntaxResult::Error; - return m_syntaxParserResult; + return false; } } else { current_text_.push_back(ch); @@ -410,8 +335,10 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { case FDE_XmlSyntaxState::SkipCData: { if (FXSYS_wcsnicmp(m_Buffer.data() + m_Start, L"]]>", 3) == 0) { m_Start += 3; - syntaxParserResult = FX_XmlSyntaxResult::CData; m_syntaxParserState = FDE_XmlSyntaxState::Text; + + current_node_->AppendChild( + doc->CreateNode(GetTextData())); } else { current_text_.push_back(ch); m_Start++; @@ -481,7 +408,7 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { } if (m_wQuotationMark == 0) { m_Start++; - syntaxParserResult = FX_XmlSyntaxResult::TargetData; + ProcessTargetData(); break; } } @@ -495,10 +422,9 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { } else if (ch == m_wQuotationMark) { m_wQuotationMark = 0; m_Start++; - syntaxParserResult = FX_XmlSyntaxResult::TargetData; + ProcessTargetData(); } else { - m_syntaxParserResult = FX_XmlSyntaxResult::Error; - return m_syntaxParserResult; + return false; } } else { current_text_.push_back(ch); @@ -508,15 +434,11 @@ FX_XmlSyntaxResult CFX_XMLParser::DoSyntaxParse() { default: break; } - if (syntaxParserResult != FX_XmlSyntaxResult::None) - return syntaxParserResult; } } - return FX_XmlSyntaxResult::Text; -} -bool CFX_XMLParser::GetStatus() const { - return m_pStream && m_syntaxParserResult != FX_XmlSyntaxResult::Error; + current_node_->AppendChild(doc->CreateNode(GetTextData())); + return true; } void CFX_XMLParser::ProcessTextChar(wchar_t character) { @@ -576,6 +498,18 @@ void CFX_XMLParser::ProcessTextChar(wchar_t character) { m_Start++; } +void CFX_XMLParser::ProcessTargetData() { + WideString target_data = GetTextData(); + if (target_data.IsEmpty()) + return; + if (!current_node_) + return; + if (current_node_->GetType() != FX_XMLNODE_Instruction) + return; + + static_cast(current_node_)->AppendData(target_data); +} + WideString CFX_XMLParser::GetTextData() { WideString ret(current_text_.data(), current_text_.size()); m_iEntityStart = -1; diff --git a/core/fxcrt/xml/cfx_xmlparser.h b/core/fxcrt/xml/cfx_xmlparser.h index db8239bd98..aa5ad5761c 100644 --- a/core/fxcrt/xml/cfx_xmlparser.h +++ b/core/fxcrt/xml/cfx_xmlparser.h @@ -20,24 +20,6 @@ class CFX_XMLElement; class CFX_XMLNode; class IFX_SeekableReadStream; -enum class FX_XmlSyntaxResult { - None, - InstructionOpen, - InstructionClose, - ElementOpen, - ElementBreak, - ElementClose, - TargetName, - TagName, - AttriName, - AttriValue, - Text, - CData, - TargetData, - Error, - EndOfString -}; - class CFX_XMLParser { public: static bool IsXMLNameChar(wchar_t ch, bool bFirstChar); @@ -47,10 +29,6 @@ class CFX_XMLParser { std::unique_ptr Parse(); - protected: - FX_XmlSyntaxResult DoSyntaxParse(); - WideString GetTextData(); - private: enum class FDE_XmlSyntaxState { Text, @@ -71,15 +49,16 @@ class CFX_XMLParser { TargetData }; + bool DoSyntaxParse(CFX_XMLDocument* doc); + WideString GetTextData(); void ProcessTextChar(wchar_t ch); - bool GetStatus() const; + void ProcessTargetData(); CFX_XMLNode* current_node_ = nullptr; WideString current_attribute_name_; RetainPtr m_pStream; FX_FILESIZE m_Start = 0; // Start position in m_Buffer FX_FILESIZE m_End = 0; // End position in m_Buffer - FX_XmlSyntaxResult m_syntaxParserResult = FX_XmlSyntaxResult::None; FDE_XmlSyntaxState m_syntaxParserState = FDE_XmlSyntaxState::Text; std::stack m_XMLNodeTypeStack; std::stack m_SkipStack; diff --git a/core/fxcrt/xml/cfx_xmlparser_unittest.cpp b/core/fxcrt/xml/cfx_xmlparser_unittest.cpp index 7ca242211d..072c18ce3f 100644 --- a/core/fxcrt/xml/cfx_xmlparser_unittest.cpp +++ b/core/fxcrt/xml/cfx_xmlparser_unittest.cpp @@ -15,31 +15,43 @@ #include "testing/test_support.h" #include "third_party/base/ptr_util.h" -namespace { - -class CFX_XMLTestParser : public CFX_XMLParser { +class CFX_XMLParserTest : public testing::Test { public: - explicit CFX_XMLTestParser(const RetainPtr& pStream) - : CFX_XMLParser(pStream) {} - - ~CFX_XMLTestParser() override = default; - - FX_XmlSyntaxResult DoSyntaxParse() { return CFX_XMLParser::DoSyntaxParse(); } - WideString GetTextData() { return CFX_XMLParser::GetTextData(); } + std::unique_ptr Parse(const char* input) { + auto stream = pdfium::MakeRetain( + reinterpret_cast(const_cast(input)), strlen(input), + false); + + CFX_XMLParser parser(stream); + return parser.Parse(); + } }; -RetainPtr MakeProxy(const char* input) { - auto stream = pdfium::MakeRetain( - reinterpret_cast(const_cast(input)), strlen(input), - false); - return stream; +TEST_F(CFX_XMLParserTest, AttributesMustBeQuoted) { + const char* input = + ""; + ASSERT_TRUE(Parse(input) == nullptr); } -} // namespace +TEST_F(CFX_XMLParserTest, Attributes) { + const char* input = + ""; + + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); -TEST(CFX_XMLParserTest, CData) { + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + + EXPECT_EQ(L"application/x-javascript", script->GetAttribute(L"contentType")); + EXPECT_EQ(L"1", script->GetAttribute(L"display")); +} + +TEST_F(CFX_XMLParserTest, CData) { const char* input = - ""; const wchar_t* cdata = - L"\n" + L"\n \n" L" if (a[1] < 3)\n" L" app.alert(\"Tclams\");\n" - L" "; - - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n ", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::CData, parser.DoSyntaxParse()); - ASSERT_EQ(cdata, parser.GetTextData()); + L" \n"; - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n", parser.GetTextData()); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - ASSERT_EQ(FX_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + EXPECT_EQ(cdata, script->GetTextData()); } -TEST(CFX_XMLParserTest, CDataWithInnerScript) { +TEST_F(CFX_XMLParserTest, CDataWithInnerScript) { const char* input = - ""; const wchar_t* cdata = - L"\n" + L"\n \n" L" if (a[1] < 3)\n" L" app.alert(\"Tclams\");\n" L" \n" - L" "; - - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n ", parser.GetTextData()); + L" \n"; - ASSERT_EQ(FX_XmlSyntaxResult::CData, parser.DoSyntaxParse()); - ASSERT_EQ(cdata, parser.GetTextData()); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + EXPECT_EQ(cdata, script->GetTextData()); } -TEST(CFX_XMLParserTest, ArrowBangArrow) { +TEST_F(CFX_XMLParserTest, ArrowBangArrow) { const char* input = - ""; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n ", parser.GetTextData()); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + EXPECT_EQ(L"\n \n", script->GetTextData()); } -TEST(CFX_XMLParserTest, ArrowBangBracketArrow) { +TEST_F(CFX_XMLParserTest, ArrowBangBracketArrow) { const char* input = - ""; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n ", parser.GetTextData()); - - // Parser walks to end of input. + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + EXPECT_EQ(L"\n ", script->GetTextData()); } -TEST(CFX_XMLParserTest, IncompleteCData) { +TEST_F(CFX_XMLParserTest, IncompleteCData) { const char* input = - ""; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n ", parser.GetTextData()); - - // Parser walks to end of input. - - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + EXPECT_EQ(L"\n ", script->GetTextData()); } -TEST(CFX_XMLParserTest, UnClosedCData) { +TEST_F(CFX_XMLParserTest, UnClosedCData) { const char* input = - ""; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n ", parser.GetTextData()); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - // Parser walks to end of input. - - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + EXPECT_EQ(L"\n ", script->GetTextData()); } -TEST(CFX_XMLParserTest, EmptyCData) { +TEST_F(CFX_XMLParserTest, EmptyCData) { const char* input = - ""; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n ", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::CData, parser.DoSyntaxParse()); - ASSERT_EQ(L"", parser.GetTextData()); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + EXPECT_EQ(L"\n \n", script->GetTextData()); } -TEST(CFX_XMLParserTest, Comment) { +TEST_F(CFX_XMLParserTest, Comment) { const char* input = - ""; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n ", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n", parser.GetTextData()); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - ASSERT_EQ(FX_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + EXPECT_EQ(L"\n \n", script->GetTextData()); } -TEST(CFX_XMLParserTest, IncorrectCommentStart) { +TEST_F(CFX_XMLParserTest, IncorrectCommentStart) { const char* input = - ""; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n ", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + EXPECT_EQ(L"\n \n", script->GetTextData()); } -TEST(CFX_XMLParserTest, CommentEmpty) { +TEST_F(CFX_XMLParserTest, CommentEmpty) { const char* input = - ""; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n ", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + EXPECT_EQ(L"\n \n", script->GetTextData()); } -TEST(CFX_XMLParserTest, CommentThreeDash) { +TEST_F(CFX_XMLParserTest, CommentThreeDash) { const char* input = - ""; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n ", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + EXPECT_EQ(L"\n ", script->GetTextData()); } -TEST(CFX_XMLParserTest, CommentTwoDash) { +TEST_F(CFX_XMLParserTest, CommentTwoDash) { const char* input = - ""; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"\n ", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + EXPECT_EQ(L"\n ", script->GetTextData()); } -TEST(CFX_XMLParserTest, Entities) { +TEST_F(CFX_XMLParserTest, Entities) { const char* input = - ""; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"BTjH\xab48&<>'\"", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + EXPECT_EQ(L"BTjH\xab48&<>'\"", script->GetTextData()); } -TEST(CFX_XMLParserTest, EntityOverflowHex) { +TEST_F(CFX_XMLParserTest, EntityOverflowHex) { const char* input = - ""; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L" ", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + EXPECT_EQ(L" ", script->GetTextData()); } -TEST(CFX_XMLParserTest, EntityOverflowDecimal) { +TEST_F(CFX_XMLParserTest, EntityOverflowDecimal) { const char* input = - ""; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); - ASSERT_EQ(L"contentType", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); - ASSERT_EQ(L"application/x-javascript", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L" ", parser.GetTextData()); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); - ASSERT_EQ(FX_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + CFX_XMLElement* script = doc->GetRoot()->GetFirstChildNamed(L"script"); + ASSERT_TRUE(script != nullptr); + EXPECT_EQ(L" ", script->GetTextData()); } -TEST(CFX_XMLParserTest, IsXMLNameChar) { - EXPECT_FALSE(CFX_XMLTestParser::IsXMLNameChar(L'-', true)); - EXPECT_TRUE(CFX_XMLTestParser::IsXMLNameChar(L'-', false)); - - EXPECT_FALSE(CFX_XMLTestParser::IsXMLNameChar(0x2069, true)); - EXPECT_TRUE(CFX_XMLTestParser::IsXMLNameChar(0x2070, true)); - EXPECT_TRUE(CFX_XMLTestParser::IsXMLNameChar(0x2073, true)); - EXPECT_TRUE(CFX_XMLTestParser::IsXMLNameChar(0x218F, true)); - EXPECT_FALSE(CFX_XMLTestParser::IsXMLNameChar(0x2190, true)); - - EXPECT_FALSE(CFX_XMLTestParser::IsXMLNameChar(0xFDEF, true)); - EXPECT_TRUE(CFX_XMLTestParser::IsXMLNameChar(0xFDF0, true)); - EXPECT_TRUE(CFX_XMLTestParser::IsXMLNameChar(0xFDF1, true)); - EXPECT_TRUE(CFX_XMLTestParser::IsXMLNameChar(0xFFFD, true)); - EXPECT_FALSE(CFX_XMLTestParser::IsXMLNameChar(0xFFFE, true)); +TEST_F(CFX_XMLParserTest, IsXMLNameChar) { + EXPECT_FALSE(CFX_XMLParser::IsXMLNameChar(L'-', true)); + EXPECT_TRUE(CFX_XMLParser::IsXMLNameChar(L'-', false)); + + EXPECT_FALSE(CFX_XMLParser::IsXMLNameChar(0x2069, true)); + EXPECT_TRUE(CFX_XMLParser::IsXMLNameChar(0x2070, true)); + EXPECT_TRUE(CFX_XMLParser::IsXMLNameChar(0x2073, true)); + EXPECT_TRUE(CFX_XMLParser::IsXMLNameChar(0x218F, true)); + EXPECT_FALSE(CFX_XMLParser::IsXMLNameChar(0x2190, true)); + + EXPECT_FALSE(CFX_XMLParser::IsXMLNameChar(0xFDEF, true)); + EXPECT_TRUE(CFX_XMLParser::IsXMLNameChar(0xFDF0, true)); + EXPECT_TRUE(CFX_XMLParser::IsXMLNameChar(0xFDF1, true)); + EXPECT_TRUE(CFX_XMLParser::IsXMLNameChar(0xFFFD, true)); + EXPECT_FALSE(CFX_XMLParser::IsXMLNameChar(0xFFFE, true)); } -TEST(CFX_XMLParserTest, BadElementClose) { - const char* input = ""; - - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::Error, parser.DoSyntaxParse()); +TEST_F(CFX_XMLParserTest, BadElementClose) { + ASSERT_TRUE(Parse("") == nullptr); } -TEST(CFX_XMLParserTest, DoubleElementClose) { - const char* input = "

"; - - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"p", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(L"", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); - ASSERT_EQ(L"p", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::Error, parser.DoSyntaxParse()); +TEST_F(CFX_XMLParserTest, DoubleElementClose) { + ASSERT_TRUE(Parse("

") == nullptr); } -TEST(CFX_XMLParserTest, ParseInstruction) { +TEST_F(CFX_XMLParserTest, ParseInstruction) { const char* input = "" "
"; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - - auto doc = parser.Parse(); - ASSERT_TRUE(doc.get() != nullptr); + std::unique_ptr doc = Parse(input); + ASSERT_TRUE(doc != nullptr); CFX_XMLElement* root = doc->GetRoot(); ASSERT_TRUE(root->GetFirstChild() != nullptr); @@ -557,32 +333,10 @@ TEST(CFX_XMLParserTest, ParseInstruction) { EXPECT_TRUE(instruction->IsOriginalXFAVersion()); } -TEST(CFX_XMLParserTest, BadEntity) { +TEST_F(CFX_XMLParserTest, BadEntity) { const char* input = ""; - - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"Test &", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); - ASSERT_EQ(FX_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); - ASSERT_EQ(L"p", parser.GetTextData()); - ASSERT_EQ(FX_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); - - ASSERT_EQ(FX_XmlSyntaxResult::Text, parser.DoSyntaxParse()); - ASSERT_EQ(L"; thing", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); - ASSERT_EQ(L"script", parser.GetTextData()); - - ASSERT_EQ(FX_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); + ASSERT_TRUE(Parse(input) == nullptr); } -- cgit v1.2.3