diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2018-05-02 18:08:46 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-05-02 18:08:46 +0000 |
commit | 303f9a3afc4a86147213d4ac57894480485090a2 (patch) | |
tree | d19d2167cf305ee52d72f5dd5c74820889c481e4 /core/fxcrt/xml/cfx_xmlparser_unittest.cpp | |
parent | 8f893b69012d4f5029cfedf91c5ef653717257a8 (diff) | |
download | pdfium-303f9a3afc4a86147213d4ac57894480485090a2.tar.xz |
[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 <hnakashima@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
Diffstat (limited to 'core/fxcrt/xml/cfx_xmlparser_unittest.cpp')
-rw-r--r-- | core/fxcrt/xml/cfx_xmlparser_unittest.cpp | 566 |
1 files changed, 160 insertions, 406 deletions
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<IFX_SeekableStream>& pStream) - : CFX_XMLParser(pStream) {} - - ~CFX_XMLTestParser() override = default; - - FX_XmlSyntaxResult DoSyntaxParse() { return CFX_XMLParser::DoSyntaxParse(); } - WideString GetTextData() { return CFX_XMLParser::GetTextData(); } + std::unique_ptr<CFX_XMLDocument> Parse(const char* input) { + auto stream = pdfium::MakeRetain<CFX_MemoryStream>( + reinterpret_cast<uint8_t*>(const_cast<char*>(input)), strlen(input), + false); + + CFX_XMLParser parser(stream); + return parser.Parse(); + } }; -RetainPtr<CFX_MemoryStream> MakeProxy(const char* input) { - auto stream = pdfium::MakeRetain<CFX_MemoryStream>( - reinterpret_cast<uint8_t*>(const_cast<char*>(input)), strlen(input), - false); - return stream; +TEST_F(CFX_XMLParserTest, AttributesMustBeQuoted) { + const char* input = + "<script display=1>\n" + "</script>"; + ASSERT_TRUE(Parse(input) == nullptr); } -} // namespace +TEST_F(CFX_XMLParserTest, Attributes) { + const char* input = + "<script contentType=\"application/x-javascript\" display=\"1\">\n" + "</script>"; + + std::unique_ptr<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">\n" + "<script>\n" " <![CDATA[\n" " if (a[1] < 3)\n" " app.alert(\"Tclams\");\n" @@ -47,41 +59,22 @@ TEST(CFX_XMLParserTest, CData) { "</script>"; 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<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">\n" + "<script>\n" " <![CDATA[\n" " if (a[1] < 3)\n" " app.alert(\"Tclams\");\n" @@ -90,322 +83,162 @@ TEST(CFX_XMLParserTest, CDataWithInnerScript) { "</script>"; const wchar_t* cdata = - L"\n" + L"\n \n" L" if (a[1] < 3)\n" L" app.alert(\"Tclams\");\n" L" </script>\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<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">\n" + "<script>\n" " <!>\n" "</script>"; - 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<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">\n" + "<script>\n" " <![>\n" "</script>"; - 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<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">\n" + "<script>\n" " <![CDATA>\n" "</script>"; - 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<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">\n" + "<script>\n" " <![CDATA[\n" "</script>"; - 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<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">\n" + "<script>\n" " <![CDATA[]]>\n" "</script>"; - 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<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">\n" + "<script>\n" " <!-- A Comment -->\n" "</script>"; - 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<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">\n" + "<script>\n" " <!- A Comment -->\n" "</script>"; - 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<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">\n" + "<script>\n" " <!---->\n" "</script>"; - 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<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">\n" + "<script>\n" " <!--->\n" "</script>"; - 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<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">\n" + "<script>\n" " <!-->\n" "</script>"; - 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<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">" + "<script>" "B" // B "T" // T "j" // j @@ -420,133 +253,76 @@ TEST(CFX_XMLParserTest, Entities) { "&something_else;" "</script>"; - 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<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">" + "<script>" "�" "�" "</script>"; - 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<CFX_XMLDocument> 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 = - "<script contentType=\"application/x-javascript\">" + "<script>" "�" "�" "</script>"; - 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<CFX_XMLDocument> 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 = "</endtag>"; - - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - ASSERT_EQ(FX_XmlSyntaxResult::Error, parser.DoSyntaxParse()); +TEST_F(CFX_XMLParserTest, BadElementClose) { + ASSERT_TRUE(Parse("</endtag>") == nullptr); } -TEST(CFX_XMLParserTest, DoubleElementClose) { - const char* input = "<p></p></p>"; - - 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("<p></p></p>") == nullptr); } -TEST(CFX_XMLParserTest, ParseInstruction) { +TEST_F(CFX_XMLParserTest, ParseInstruction) { const char* input = "<?originalXFAVersion http://www.xfa.org/schema/xfa-template/3.3/ ?>" "<form></form>"; - auto stream = MakeProxy(input); - CFX_XMLTestParser parser(stream); - - auto doc = parser.Parse(); - ASSERT_TRUE(doc.get() != nullptr); + std::unique_ptr<CFX_XMLDocument> 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 = "<script>" "Test &<p>; thing" "</script>"; - - 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); } |