// Copyright 2018 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "core/fxcrt/xml/cfx_xmlinstruction.h" #include #include "core/fxcrt/cfx_readonlymemorystream.h" #include "core/fxcrt/xml/cfx_xmldocument.h" #include "core/fxcrt/xml/cfx_xmlelement.h" #include "core/fxcrt/xml/cfx_xmlparser.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/string_write_stream.h" TEST(CFX_XMLInstructionTest, GetType) { CFX_XMLInstruction node(L"acrobat"); EXPECT_EQ(CFX_XMLNode::Type::kInstruction, node.GetType()); } TEST(CFX_XMLInstructionTest, AcrobatInstruction) { CFX_XMLInstruction node(L"acrobat"); EXPECT_TRUE(node.IsAcrobat()); EXPECT_FALSE(node.IsOriginalXFAVersion()); } TEST(CFX_XMLInstructionTest, OriginalXFAInstruction) { CFX_XMLInstruction node(L"originalXFAVersion"); EXPECT_TRUE(node.IsOriginalXFAVersion()); EXPECT_FALSE(node.IsAcrobat()); } TEST(CFX_XMLInstructionTest, TargetData) { CFX_XMLInstruction node(L"acrobat"); EXPECT_EQ(0U, node.GetTargetData().size()); node.AppendData(L"firstString"); node.AppendData(L"secondString"); auto& data = node.GetTargetData(); ASSERT_EQ(2U, data.size()); EXPECT_EQ(L"firstString", data[0]); EXPECT_EQ(L"secondString", data[1]); } TEST(CFX_XMLInstructionTest, Clone) { CFX_XMLDocument doc; CFX_XMLInstruction node(L"acrobat"); node.AppendData(L"firstString"); node.AppendData(L"secondString"); CFX_XMLNode* clone = node.Clone(&doc); EXPECT_TRUE(clone != nullptr); ASSERT_EQ(CFX_XMLNode::Type::kInstruction, clone->GetType()); CFX_XMLInstruction* inst = ToXMLInstruction(clone); EXPECT_TRUE(inst->IsAcrobat()); auto& data = inst->GetTargetData(); ASSERT_EQ(2U, data.size()); EXPECT_EQ(L"firstString", data[0]); EXPECT_EQ(L"secondString", data[1]); } TEST(CFX_XMLInstructionTest, SaveXML) { auto stream = pdfium::MakeRetain(); CFX_XMLInstruction node(L"xml"); node.Save(stream); EXPECT_EQ("\n", stream->ToString()); } TEST(CFX_XMLInstructionTest, SaveAcrobat) { auto stream = pdfium::MakeRetain(); CFX_XMLInstruction node(L"acrobat"); node.AppendData(L"http://www.xfa.org/schema/xfa-template/3.3/"); node.AppendData(L"Display:1"); node.Save(stream); EXPECT_EQ( "\n", stream->ToString()); } TEST(CFX_XMLInstructionTest, ParseAndReSave) { static const char input[] = "\n" ""; auto in_stream = pdfium::MakeRetain( pdfium::as_bytes(pdfium::make_span(input))); CFX_XMLParser parser(in_stream); std::unique_ptr doc = parser.Parse(); ASSERT_TRUE(doc != nullptr); CFX_XMLElement* root = doc->GetRoot(); ASSERT_TRUE(root->GetFirstChild() != nullptr); ASSERT_EQ(CFX_XMLNode::Type::kInstruction, root->GetFirstChild()->GetType()); CFX_XMLInstruction* node = ToXMLInstruction(root->GetFirstChild()); ASSERT_TRUE(node != nullptr); EXPECT_TRUE(node->IsAcrobat()); auto& data = node->GetTargetData(); ASSERT_EQ(2U, data.size()); EXPECT_EQ(L"http://www.xfa.org/schema/xfa-template/3.3/", data[0]); EXPECT_EQ(L"Display:1", data[1]); auto out_stream = pdfium::MakeRetain(); node->Save(out_stream); EXPECT_EQ( "\n", out_stream->ToString()); } TEST(CFX_XMLInstructionTest, ParseAndReSaveInnerInstruction) { static const char input[] = "\n" "\n" ""; auto in_stream = pdfium::MakeRetain( pdfium::as_bytes(pdfium::make_span(input))); CFX_XMLParser parser(in_stream); std::unique_ptr doc = parser.Parse(); ASSERT_TRUE(doc != nullptr); CFX_XMLElement* root = doc->GetRoot(); ASSERT_TRUE(root->GetFirstChild() != nullptr); ASSERT_TRUE(root->GetFirstChild()->GetType() == CFX_XMLNode::Type::kElement); CFX_XMLElement* node = ToXMLElement(root->GetFirstChild()); EXPECT_EQ(L"node", node->GetName()); CFX_XMLInstruction* instruction = nullptr; for (auto* elem = node->GetFirstChild(); elem && !instruction; elem = elem->GetNextSibling()) { instruction = ToXMLInstruction(elem); } ASSERT_TRUE(instruction != nullptr); EXPECT_TRUE(instruction->IsAcrobat()); auto& data = instruction->GetTargetData(); ASSERT_EQ(2U, data.size()); EXPECT_EQ(L"http://www.xfa.org/schema/xfa-template/3.3/", data[0]); EXPECT_EQ(L"Display:1", data[1]); auto out_stream = pdfium::MakeRetain(); node->Save(out_stream); EXPECT_EQ( "\n\n" "\n\n" "\n", out_stream->ToString()); }