Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 1 | /* |
| 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 Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 18 | |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 19 | #include "test/Test.h" |
| 20 | |
| 21 | namespace aapt { |
| 22 | |
| 23 | TEST(InlineXmlFormatParserTest, PassThrough) { |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 24 | std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); |
| 25 | std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"EOF( |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 26 | <View xmlns:android="http://schemas.android.com/apk/res/android"> |
| 27 | <View android:text="hey"> |
| 28 | <View android:id="hi" /> |
| 29 | </View> |
| 30 | </View>)EOF"); |
| 31 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 32 | InlineXmlFormatParser parser; |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 33 | ASSERT_TRUE(parser.Consume(context.get(), doc.get())); |
| 34 | EXPECT_EQ(0u, parser.GetExtractedInlineXmlDocuments().size()); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 35 | } |
| 36 | |
| 37 | TEST(InlineXmlFormatParserTest, ExtractOneXmlResource) { |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 38 | std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); |
| 39 | std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"EOF( |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 40 | <View1 xmlns:android="http://schemas.android.com/apk/res/android" |
| 41 | xmlns:aapt="http://schemas.android.com/aapt"> |
| 42 | <aapt:attr name="android:text"> |
| 43 | <View2 android:text="hey"> |
| 44 | <View3 android:id="hi" /> |
| 45 | </View2> |
| 46 | </aapt:attr> |
| 47 | </View1>)EOF"); |
| 48 | |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 49 | doc->file.name = test::ParseNameOrDie("layout/main"); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 50 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 51 | InlineXmlFormatParser parser; |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 52 | ASSERT_TRUE(parser.Consume(context.get(), doc.get())); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 53 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 54 | // One XML resource should have been extracted. |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 55 | EXPECT_EQ(1u, parser.GetExtractedInlineXmlDocuments().size()); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 56 | |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 57 | xml::Element* el = xml::FindRootElement(doc.get()); |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 58 | ASSERT_NE(nullptr, el); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 59 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 60 | EXPECT_EQ("View1", el->name); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 61 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 62 | // The <aapt:attr> tag should be extracted. |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 63 | EXPECT_EQ(nullptr, el->FindChild(xml::kSchemaAapt, "attr")); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 64 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 65 | // The 'android:text' attribute should be set with a reference. |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 66 | xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "text"); |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 67 | ASSERT_NE(nullptr, attr); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 68 | |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 69 | ResourceNameRef name_ref; |
| 70 | ASSERT_TRUE(ResourceUtils::ParseReference(attr->value, &name_ref)); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 71 | |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 72 | xml::XmlResource* extracted_doc = |
| 73 | parser.GetExtractedInlineXmlDocuments()[0].get(); |
| 74 | ASSERT_NE(nullptr, extracted_doc); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 75 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 76 | // Make sure the generated reference is correct. |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 77 | EXPECT_EQ(name_ref.package, extracted_doc->file.name.package); |
| 78 | EXPECT_EQ(name_ref.type, extracted_doc->file.name.type); |
| 79 | EXPECT_EQ(name_ref.entry, extracted_doc->file.name.entry); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 80 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 81 | // Verify the structure of the extracted XML. |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 82 | el = xml::FindRootElement(extracted_doc); |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 83 | ASSERT_NE(nullptr, el); |
| 84 | EXPECT_EQ("View2", el->name); |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 85 | EXPECT_NE(nullptr, el->FindChild({}, "View3")); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 86 | } |
| 87 | |
| 88 | TEST(InlineXmlFormatParserTest, ExtractTwoXmlResources) { |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 89 | std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); |
| 90 | std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"EOF( |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 91 | <View1 xmlns:android="http://schemas.android.com/apk/res/android" |
| 92 | xmlns:aapt="http://schemas.android.com/aapt"> |
| 93 | <aapt:attr name="android:text"> |
| 94 | <View2 android:text="hey"> |
| 95 | <View3 android:id="hi" /> |
| 96 | </View2> |
| 97 | </aapt:attr> |
| 98 | |
| 99 | <aapt:attr name="android:drawable"> |
| 100 | <vector /> |
| 101 | </aapt:attr> |
| 102 | </View1>)EOF"); |
| 103 | |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 104 | doc->file.name = test::ParseNameOrDie("layout/main"); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 105 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 106 | InlineXmlFormatParser parser; |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 107 | ASSERT_TRUE(parser.Consume(context.get(), doc.get())); |
| 108 | ASSERT_EQ(2u, parser.GetExtractedInlineXmlDocuments().size()); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 109 | |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 110 | xml::Element* el = xml::FindRootElement(doc.get()); |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 111 | ASSERT_NE(nullptr, el); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 112 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 113 | EXPECT_EQ("View1", el->name); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 114 | |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 115 | xml::Attribute* attr_text = el->FindAttribute(xml::kSchemaAndroid, "text"); |
| 116 | ASSERT_NE(nullptr, attr_text); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 117 | |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 118 | xml::Attribute* attr_drawable = |
| 119 | el->FindAttribute(xml::kSchemaAndroid, "drawable"); |
| 120 | ASSERT_NE(nullptr, attr_drawable); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 121 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 122 | // The two extracted resources should have different names. |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 123 | EXPECT_NE(attr_text->value, attr_drawable->value); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 124 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 125 | // The child <aapt:attr> elements should be gone. |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 126 | EXPECT_EQ(nullptr, el->FindChild(xml::kSchemaAapt, "attr")); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 127 | |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 128 | xml::XmlResource* extracted_doc_text = |
| 129 | parser.GetExtractedInlineXmlDocuments()[0].get(); |
| 130 | ASSERT_NE(nullptr, extracted_doc_text); |
| 131 | el = xml::FindRootElement(extracted_doc_text); |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 132 | ASSERT_NE(nullptr, el); |
| 133 | EXPECT_EQ("View2", el->name); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 134 | |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 135 | xml::XmlResource* extracted_doc_drawable = |
| 136 | parser.GetExtractedInlineXmlDocuments()[1].get(); |
| 137 | ASSERT_NE(nullptr, extracted_doc_drawable); |
| 138 | el = xml::FindRootElement(extracted_doc_drawable); |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 139 | ASSERT_NE(nullptr, el); |
| 140 | EXPECT_EQ("vector", el->name); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 141 | } |
| 142 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 143 | } // namespace aapt |