blob: de7739ada407a34a498f3877b6bad937076e5434 [file] [log] [blame]
Adam Lesinski5eeaadd2016-08-25 12:26:56 -07001/*
2 * Copyright (C) 2016 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 "compile/InlineXmlFormatParser.h"
Adam Lesinskice5e56e2016-10-21 17:56:45 -070018
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070019#include "test/Test.h"
20
Adam Lesinski6b372992017-08-09 10:54:23 -070021using ::testing::Eq;
22using ::testing::IsNull;
23using ::testing::Not;
24using ::testing::NotNull;
25using ::testing::SizeIs;
26using ::testing::StrEq;
27
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070028namespace aapt {
29
30TEST(InlineXmlFormatParserTest, PassThrough) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070031 std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
Adam Lesinski6b372992017-08-09 10:54:23 -070032 std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"(
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070033 <View xmlns:android="http://schemas.android.com/apk/res/android">
34 <View android:text="hey">
35 <View android:id="hi" />
36 </View>
Adam Lesinski6b372992017-08-09 10:54:23 -070037 </View>)");
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070038
Adam Lesinskicacb28f2016-10-19 12:18:14 -070039 InlineXmlFormatParser parser;
Adam Lesinskice5e56e2016-10-21 17:56:45 -070040 ASSERT_TRUE(parser.Consume(context.get(), doc.get()));
Adam Lesinski6b372992017-08-09 10:54:23 -070041 EXPECT_THAT(parser.GetExtractedInlineXmlDocuments(), SizeIs(0u));
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070042}
43
44TEST(InlineXmlFormatParserTest, ExtractOneXmlResource) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070045 std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
Adam Lesinski6b372992017-08-09 10:54:23 -070046 std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"(
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070047 <View1 xmlns:android="http://schemas.android.com/apk/res/android"
48 xmlns:aapt="http://schemas.android.com/aapt">
49 <aapt:attr name="android:text">
50 <View2 android:text="hey">
51 <View3 android:id="hi" />
52 </View2>
53 </aapt:attr>
Adam Lesinski6b372992017-08-09 10:54:23 -070054 </View1>)");
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070055
Adam Lesinskice5e56e2016-10-21 17:56:45 -070056 doc->file.name = test::ParseNameOrDie("layout/main");
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070057
Adam Lesinskicacb28f2016-10-19 12:18:14 -070058 InlineXmlFormatParser parser;
Adam Lesinskice5e56e2016-10-21 17:56:45 -070059 ASSERT_TRUE(parser.Consume(context.get(), doc.get()));
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070060
Adam Lesinskicacb28f2016-10-19 12:18:14 -070061 // One XML resource should have been extracted.
Adam Lesinski6b372992017-08-09 10:54:23 -070062 EXPECT_THAT(parser.GetExtractedInlineXmlDocuments(), SizeIs(1u));
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070063
Adam Lesinski6b372992017-08-09 10:54:23 -070064 xml::Element* el = doc->root.get();
65 ASSERT_THAT(el, NotNull());
66 EXPECT_THAT(el->name, StrEq("View1"));
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070067
Adam Lesinskicacb28f2016-10-19 12:18:14 -070068 // The <aapt:attr> tag should be extracted.
Adam Lesinski6b372992017-08-09 10:54:23 -070069 EXPECT_THAT(el->FindChild(xml::kSchemaAapt, "attr"), IsNull());
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070070
Adam Lesinskicacb28f2016-10-19 12:18:14 -070071 // The 'android:text' attribute should be set with a reference.
Adam Lesinskice5e56e2016-10-21 17:56:45 -070072 xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "text");
Adam Lesinski6b372992017-08-09 10:54:23 -070073 ASSERT_THAT(attr, NotNull());
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070074
Adam Lesinskice5e56e2016-10-21 17:56:45 -070075 ResourceNameRef name_ref;
76 ASSERT_TRUE(ResourceUtils::ParseReference(attr->value, &name_ref));
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070077
Adam Lesinski6b372992017-08-09 10:54:23 -070078 xml::XmlResource* extracted_doc = parser.GetExtractedInlineXmlDocuments()[0].get();
79 ASSERT_THAT(extracted_doc, NotNull());
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070080
Adam Lesinskicacb28f2016-10-19 12:18:14 -070081 // Make sure the generated reference is correct.
Adam Lesinski6b372992017-08-09 10:54:23 -070082 EXPECT_THAT(extracted_doc->file.name, Eq(name_ref));
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070083
Adam Lesinskicacb28f2016-10-19 12:18:14 -070084 // Verify the structure of the extracted XML.
Adam Lesinski6b372992017-08-09 10:54:23 -070085 el = extracted_doc->root.get();
86 ASSERT_THAT(el, NotNull());
87 EXPECT_THAT(el->name, StrEq("View2"));
88 EXPECT_THAT(el->FindChild({}, "View3"), NotNull());
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070089}
90
91TEST(InlineXmlFormatParserTest, ExtractTwoXmlResources) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070092 std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
Adam Lesinski6b372992017-08-09 10:54:23 -070093 std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"(
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070094 <View1 xmlns:android="http://schemas.android.com/apk/res/android"
95 xmlns:aapt="http://schemas.android.com/aapt">
96 <aapt:attr name="android:text">
97 <View2 android:text="hey">
98 <View3 android:id="hi" />
99 </View2>
100 </aapt:attr>
101
102 <aapt:attr name="android:drawable">
103 <vector />
104 </aapt:attr>
Adam Lesinski6b372992017-08-09 10:54:23 -0700105 </View1>)");
Adam Lesinski5eeaadd2016-08-25 12:26:56 -0700106
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700107 doc->file.name = test::ParseNameOrDie("layout/main");
Adam Lesinski5eeaadd2016-08-25 12:26:56 -0700108
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700109 InlineXmlFormatParser parser;
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700110 ASSERT_TRUE(parser.Consume(context.get(), doc.get()));
Adam Lesinski6b372992017-08-09 10:54:23 -0700111 ASSERT_THAT(parser.GetExtractedInlineXmlDocuments(), SizeIs(2u));
Adam Lesinski5eeaadd2016-08-25 12:26:56 -0700112
Adam Lesinski6b372992017-08-09 10:54:23 -0700113 xml::Element* el = doc->root.get();
114 ASSERT_THAT(el, NotNull());
115 EXPECT_THAT(el->name, StrEq("View1"));
Adam Lesinski5eeaadd2016-08-25 12:26:56 -0700116
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700117 xml::Attribute* attr_text = el->FindAttribute(xml::kSchemaAndroid, "text");
Adam Lesinski6b372992017-08-09 10:54:23 -0700118 ASSERT_THAT(attr_text, NotNull());
Adam Lesinski5eeaadd2016-08-25 12:26:56 -0700119
Adam Lesinski6b372992017-08-09 10:54:23 -0700120 xml::Attribute* attr_drawable = el->FindAttribute(xml::kSchemaAndroid, "drawable");
121 ASSERT_THAT(attr_drawable, NotNull());
Adam Lesinski5eeaadd2016-08-25 12:26:56 -0700122
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700123 // The two extracted resources should have different names.
Adam Lesinski6b372992017-08-09 10:54:23 -0700124 EXPECT_THAT(attr_text->value, Not(Eq(attr_drawable->value)));
Adam Lesinski5eeaadd2016-08-25 12:26:56 -0700125
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700126 // The child <aapt:attr> elements should be gone.
Adam Lesinski6b372992017-08-09 10:54:23 -0700127 EXPECT_THAT(el->FindChild(xml::kSchemaAapt, "attr"), IsNull());
Adam Lesinski5eeaadd2016-08-25 12:26:56 -0700128
Adam Lesinski6b372992017-08-09 10:54:23 -0700129 xml::XmlResource* extracted_doc_text = parser.GetExtractedInlineXmlDocuments()[0].get();
130 ASSERT_THAT(extracted_doc_text, NotNull());
131 ASSERT_THAT(extracted_doc_text->root, NotNull());
132 EXPECT_THAT(extracted_doc_text->root->name, StrEq("View2"));
Adam Lesinski5eeaadd2016-08-25 12:26:56 -0700133
Adam Lesinski6b372992017-08-09 10:54:23 -0700134 xml::XmlResource* extracted_doc_drawable = parser.GetExtractedInlineXmlDocuments()[1].get();
135 ASSERT_THAT(extracted_doc_drawable, NotNull());
136 ASSERT_THAT(extracted_doc_drawable->root, NotNull());
137 EXPECT_THAT(extracted_doc_drawable->root->name, StrEq("vector"));
Adam Lesinski5eeaadd2016-08-25 12:26:56 -0700138}
139
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700140} // namespace aapt