16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2015 The Android Open Source Project 36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License. 66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at 76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software 116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and 146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License. 156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include "ScopedXmlPullParser.h" 186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include "SourceXmlPullParser.h" 196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <gtest/gtest.h> 216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <sstream> 226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <string> 236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt { 256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ScopedXmlPullParserTest, StopIteratingAtNoNZeroDepth) { 276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::stringstream input; 286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski input << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl 296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski << "<resources><string></string></resources>" << std::endl; 306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski SourceXmlPullParser sourceParser(input); 326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(XmlPullParser::Event::kStartElement, sourceParser.next()); 336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(std::u16string(u"resources"), sourceParser.getElementName()); 346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(XmlPullParser::Event::kStartElement, sourceParser.next()); 366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(std::u16string(u"string"), sourceParser.getElementName()); 376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski { 396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ScopedXmlPullParser scopedParser(&sourceParser); 406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(XmlPullParser::Event::kEndElement, scopedParser.next()); 416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(std::u16string(u"string"), sourceParser.getElementName()); 426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(XmlPullParser::Event::kEndDocument, scopedParser.next()); 446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski } 456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(XmlPullParser::Event::kEndElement, sourceParser.next()); 476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(std::u16string(u"resources"), sourceParser.getElementName()); 486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(XmlPullParser::Event::kEndDocument, sourceParser.next()); 506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 516f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ScopedXmlPullParserTest, FinishCurrentElementOnDestruction) { 536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::stringstream input; 546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski input << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl 556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski << "<resources><string></string></resources>" << std::endl; 566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski SourceXmlPullParser sourceParser(input); 586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(XmlPullParser::Event::kStartElement, sourceParser.next()); 596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(std::u16string(u"resources"), sourceParser.getElementName()); 606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(XmlPullParser::Event::kStartElement, sourceParser.next()); 626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(std::u16string(u"string"), sourceParser.getElementName()); 636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski { 656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ScopedXmlPullParser scopedParser(&sourceParser); 666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(std::u16string(u"string"), sourceParser.getElementName()); 676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski } 686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(XmlPullParser::Event::kEndElement, sourceParser.next()); 706f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(std::u16string(u"resources"), sourceParser.getElementName()); 716f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 726f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(XmlPullParser::Event::kEndDocument, sourceParser.next()); 736f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ScopedXmlPullParserTest, NestedParsersOperateCorrectly) { 766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::stringstream input; 776f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski input << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl 786f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski << "<resources><string><foo></foo></string></resources>" << std::endl; 796f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 806f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski SourceXmlPullParser sourceParser(input); 816f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(XmlPullParser::Event::kStartElement, sourceParser.next()); 826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(std::u16string(u"resources"), sourceParser.getElementName()); 836f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 846f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(XmlPullParser::Event::kStartElement, sourceParser.next()); 856f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(std::u16string(u"string"), sourceParser.getElementName()); 866f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 876f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski { 886f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ScopedXmlPullParser scopedParser(&sourceParser); 896f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(std::u16string(u"string"), scopedParser.getElementName()); 906f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski while (XmlPullParser::isGoodEvent(scopedParser.next())) { 916f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski if (scopedParser.getEvent() != XmlPullParser::Event::kStartElement) { 926f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski continue; 936f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski } 946f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 956f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ScopedXmlPullParser subScopedParser(&scopedParser); 966f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(std::u16string(u"foo"), subScopedParser.getElementName()); 976f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski } 986f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski } 996f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1006f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(XmlPullParser::Event::kEndElement, sourceParser.next()); 1016f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(std::u16string(u"resources"), sourceParser.getElementName()); 1026f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1036f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(XmlPullParser::Event::kEndDocument, sourceParser.next()); 1046f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1056f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1066f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt 107