1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "ScopedXmlPullParser.h" 18#include "SourceXmlPullParser.h" 19 20#include <gtest/gtest.h> 21#include <sstream> 22#include <string> 23 24namespace aapt { 25 26TEST(ScopedXmlPullParserTest, StopIteratingAtNoNZeroDepth) { 27 std::stringstream input; 28 input << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl 29 << "<resources><string></string></resources>" << std::endl; 30 31 SourceXmlPullParser sourceParser(input); 32 EXPECT_EQ(XmlPullParser::Event::kStartElement, sourceParser.next()); 33 EXPECT_EQ(std::u16string(u"resources"), sourceParser.getElementName()); 34 35 EXPECT_EQ(XmlPullParser::Event::kStartElement, sourceParser.next()); 36 EXPECT_EQ(std::u16string(u"string"), sourceParser.getElementName()); 37 38 { 39 ScopedXmlPullParser scopedParser(&sourceParser); 40 EXPECT_EQ(XmlPullParser::Event::kEndElement, scopedParser.next()); 41 EXPECT_EQ(std::u16string(u"string"), sourceParser.getElementName()); 42 43 EXPECT_EQ(XmlPullParser::Event::kEndDocument, scopedParser.next()); 44 } 45 46 EXPECT_EQ(XmlPullParser::Event::kEndElement, sourceParser.next()); 47 EXPECT_EQ(std::u16string(u"resources"), sourceParser.getElementName()); 48 49 EXPECT_EQ(XmlPullParser::Event::kEndDocument, sourceParser.next()); 50} 51 52TEST(ScopedXmlPullParserTest, FinishCurrentElementOnDestruction) { 53 std::stringstream input; 54 input << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl 55 << "<resources><string></string></resources>" << std::endl; 56 57 SourceXmlPullParser sourceParser(input); 58 EXPECT_EQ(XmlPullParser::Event::kStartElement, sourceParser.next()); 59 EXPECT_EQ(std::u16string(u"resources"), sourceParser.getElementName()); 60 61 EXPECT_EQ(XmlPullParser::Event::kStartElement, sourceParser.next()); 62 EXPECT_EQ(std::u16string(u"string"), sourceParser.getElementName()); 63 64 { 65 ScopedXmlPullParser scopedParser(&sourceParser); 66 EXPECT_EQ(std::u16string(u"string"), sourceParser.getElementName()); 67 } 68 69 EXPECT_EQ(XmlPullParser::Event::kEndElement, sourceParser.next()); 70 EXPECT_EQ(std::u16string(u"resources"), sourceParser.getElementName()); 71 72 EXPECT_EQ(XmlPullParser::Event::kEndDocument, sourceParser.next()); 73} 74 75TEST(ScopedXmlPullParserTest, NestedParsersOperateCorrectly) { 76 std::stringstream input; 77 input << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl 78 << "<resources><string><foo></foo></string></resources>" << std::endl; 79 80 SourceXmlPullParser sourceParser(input); 81 EXPECT_EQ(XmlPullParser::Event::kStartElement, sourceParser.next()); 82 EXPECT_EQ(std::u16string(u"resources"), sourceParser.getElementName()); 83 84 EXPECT_EQ(XmlPullParser::Event::kStartElement, sourceParser.next()); 85 EXPECT_EQ(std::u16string(u"string"), sourceParser.getElementName()); 86 87 { 88 ScopedXmlPullParser scopedParser(&sourceParser); 89 EXPECT_EQ(std::u16string(u"string"), scopedParser.getElementName()); 90 while (XmlPullParser::isGoodEvent(scopedParser.next())) { 91 if (scopedParser.getEvent() != XmlPullParser::Event::kStartElement) { 92 continue; 93 } 94 95 ScopedXmlPullParser subScopedParser(&scopedParser); 96 EXPECT_EQ(std::u16string(u"foo"), subScopedParser.getElementName()); 97 } 98 } 99 100 EXPECT_EQ(XmlPullParser::Event::kEndElement, sourceParser.next()); 101 EXPECT_EQ(std::u16string(u"resources"), sourceParser.getElementName()); 102 103 EXPECT_EQ(XmlPullParser::Event::kEndDocument, sourceParser.next()); 104} 105 106} // namespace aapt 107