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