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 | |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 21 | using ::testing::Eq; |
| 22 | using ::testing::IsNull; |
| 23 | using ::testing::Not; |
| 24 | using ::testing::NotNull; |
| 25 | using ::testing::SizeIs; |
| 26 | using ::testing::StrEq; |
| 27 | |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 28 | namespace aapt { |
| 29 | |
| 30 | TEST(InlineXmlFormatParserTest, PassThrough) { |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 31 | std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 32 | std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"( |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 33 | <View xmlns:android="http://schemas.android.com/apk/res/android"> |
| 34 | <View android:text="hey"> |
| 35 | <View android:id="hi" /> |
| 36 | </View> |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 37 | </View>)"); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 38 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 39 | InlineXmlFormatParser parser; |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 40 | ASSERT_TRUE(parser.Consume(context.get(), doc.get())); |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 41 | EXPECT_THAT(parser.GetExtractedInlineXmlDocuments(), SizeIs(0u)); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 42 | } |
| 43 | |
| 44 | TEST(InlineXmlFormatParserTest, ExtractOneXmlResource) { |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 45 | std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 46 | std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"( |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 47 | <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 Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 54 | </View1>)"); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 55 | |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 56 | doc->file.name = test::ParseNameOrDie("layout/main"); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 57 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 58 | InlineXmlFormatParser parser; |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 59 | ASSERT_TRUE(parser.Consume(context.get(), doc.get())); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 60 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 61 | // One XML resource should have been extracted. |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 62 | EXPECT_THAT(parser.GetExtractedInlineXmlDocuments(), SizeIs(1u)); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 63 | |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 64 | xml::Element* el = doc->root.get(); |
| 65 | ASSERT_THAT(el, NotNull()); |
| 66 | EXPECT_THAT(el->name, StrEq("View1")); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 67 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 68 | // The <aapt:attr> tag should be extracted. |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 69 | EXPECT_THAT(el->FindChild(xml::kSchemaAapt, "attr"), IsNull()); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 70 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 71 | // The 'android:text' attribute should be set with a reference. |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 72 | xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "text"); |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 73 | ASSERT_THAT(attr, NotNull()); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 74 | |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 75 | ResourceNameRef name_ref; |
| 76 | ASSERT_TRUE(ResourceUtils::ParseReference(attr->value, &name_ref)); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 77 | |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 78 | xml::XmlResource* extracted_doc = parser.GetExtractedInlineXmlDocuments()[0].get(); |
| 79 | ASSERT_THAT(extracted_doc, NotNull()); |
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 | // Make sure the generated reference is correct. |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 82 | EXPECT_THAT(extracted_doc->file.name, Eq(name_ref)); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 83 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 84 | // Verify the structure of the extracted XML. |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 85 | 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 Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 89 | } |
| 90 | |
| 91 | TEST(InlineXmlFormatParserTest, ExtractTwoXmlResources) { |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 92 | std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 93 | std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"( |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 94 | <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 Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 105 | </View1>)"); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 106 | |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 107 | doc->file.name = test::ParseNameOrDie("layout/main"); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 108 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 109 | InlineXmlFormatParser parser; |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 110 | ASSERT_TRUE(parser.Consume(context.get(), doc.get())); |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 111 | ASSERT_THAT(parser.GetExtractedInlineXmlDocuments(), SizeIs(2u)); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 112 | |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 113 | xml::Element* el = doc->root.get(); |
| 114 | ASSERT_THAT(el, NotNull()); |
| 115 | EXPECT_THAT(el->name, StrEq("View1")); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 116 | |
Adam Lesinski | ce5e56e | 2016-10-21 17:56:45 -0700 | [diff] [blame] | 117 | xml::Attribute* attr_text = el->FindAttribute(xml::kSchemaAndroid, "text"); |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 118 | ASSERT_THAT(attr_text, NotNull()); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 119 | |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 120 | xml::Attribute* attr_drawable = el->FindAttribute(xml::kSchemaAndroid, "drawable"); |
| 121 | ASSERT_THAT(attr_drawable, NotNull()); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 122 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 123 | // The two extracted resources should have different names. |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 124 | EXPECT_THAT(attr_text->value, Not(Eq(attr_drawable->value))); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 125 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 126 | // The child <aapt:attr> elements should be gone. |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 127 | EXPECT_THAT(el->FindChild(xml::kSchemaAapt, "attr"), IsNull()); |
Adam Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 128 | |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 129 | 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 Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 133 | |
Adam Lesinski | 6b37299 | 2017-08-09 10:54:23 -0700 | [diff] [blame] | 134 | 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 Lesinski | 5eeaadd | 2016-08-25 12:26:56 -0700 | [diff] [blame] | 138 | } |
| 139 | |
Adam Lesinski | cacb28f | 2016-10-19 12:18:14 -0700 | [diff] [blame] | 140 | } // namespace aapt |