summaryrefslogtreecommitdiffstats
path: root/tools/aapt2/ResourceParser_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/aapt2/ResourceParser_test.cpp')
-rw-r--r--tools/aapt2/ResourceParser_test.cpp151
1 files changed, 80 insertions, 71 deletions
diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp
index 63352de..00be3bd 100644
--- a/tools/aapt2/ResourceParser_test.cpp
+++ b/tools/aapt2/ResourceParser_test.cpp
@@ -125,11 +125,9 @@ struct ResourceParserTest : public ::testing::Test {
mTable->setPackage(u"android");
}
- ::testing::AssertionResult testParse(std::istream& in) {
+ ::testing::AssertionResult testParse(const StringPiece& str) {
std::stringstream input(kXmlPreamble);
- input << "<resources>" << std::endl
- << in.rdbuf() << std::endl
- << "</resources>" << std::endl;
+ input << "<resources>\n" << str << "\n</resources>" << std::endl;
ResourceParser parser(mTable, Source{ "test" }, {},
std::make_shared<SourceXmlPullParser>(input));
if (parser.parse()) {
@@ -174,7 +172,7 @@ TEST_F(ResourceParserTest, FailToParseWithNoRootResourcesElement) {
}
TEST_F(ResourceParserTest, ParseQuotedString) {
- std::stringstream input("<string name=\"foo\"> \" hey there \" </string>");
+ std::string input = "<string name=\"foo\"> \" hey there \" </string>";
ASSERT_TRUE(testParse(input));
const String* str = findResource<String>(ResourceName{
@@ -184,7 +182,7 @@ TEST_F(ResourceParserTest, ParseQuotedString) {
}
TEST_F(ResourceParserTest, ParseEscapedString) {
- std::stringstream input("<string name=\"foo\">\\?123</string>");
+ std::string input = "<string name=\"foo\">\\?123</string>";
ASSERT_TRUE(testParse(input));
const String* str = findResource<String>(ResourceName{
@@ -194,9 +192,8 @@ TEST_F(ResourceParserTest, ParseEscapedString) {
}
TEST_F(ResourceParserTest, ParseAttr) {
- std::stringstream input;
- input << "<attr name=\"foo\" format=\"string\"/>" << std::endl
- << "<attr name=\"bar\"/>" << std::endl;
+ std::string input = "<attr name=\"foo\" format=\"string\"/>\n"
+ "<attr name=\"bar\"/>";
ASSERT_TRUE(testParse(input));
const Attribute* attr = findResource<Attribute>(ResourceName{
@@ -211,11 +208,10 @@ TEST_F(ResourceParserTest, ParseAttr) {
}
TEST_F(ResourceParserTest, ParseUseAndDeclOfAttr) {
- std::stringstream input;
- input << "<declare-styleable name=\"Styleable\">" << std::endl
- << " <attr name=\"foo\" />" << std::endl
- << "</declare-styleable>" << std::endl
- << "<attr name=\"foo\" format=\"string\"/>" << std::endl;
+ std::string input = "<declare-styleable name=\"Styleable\">\n"
+ " <attr name=\"foo\" />\n"
+ "</declare-styleable>\n"
+ "<attr name=\"foo\" format=\"string\"/>";
ASSERT_TRUE(testParse(input));
const Attribute* attr = findResource<Attribute>(ResourceName{
@@ -225,14 +221,12 @@ TEST_F(ResourceParserTest, ParseUseAndDeclOfAttr) {
}
TEST_F(ResourceParserTest, ParseDoubleUseOfAttr) {
- std::stringstream input;
- input << "<declare-styleable name=\"Theme\">" << std::endl
- << " <attr name=\"foo\" />" << std::endl
- << "</declare-styleable>" << std::endl
- << "<declare-styleable name=\"Window\">" << std::endl
- << " <attr name=\"foo\" format=\"boolean\"/>" << std::endl
- << "</declare-styleable>" << std::endl;
-
+ std::string input = "<declare-styleable name=\"Theme\">"
+ " <attr name=\"foo\" />\n"
+ "</declare-styleable>\n"
+ "<declare-styleable name=\"Window\">\n"
+ " <attr name=\"foo\" format=\"boolean\"/>\n"
+ "</declare-styleable>";
ASSERT_TRUE(testParse(input));
const Attribute* attr = findResource<Attribute>(ResourceName{
@@ -242,12 +236,11 @@ TEST_F(ResourceParserTest, ParseDoubleUseOfAttr) {
}
TEST_F(ResourceParserTest, ParseEnumAttr) {
- std::stringstream input;
- input << "<attr name=\"foo\">" << std::endl
- << " <enum name=\"bar\" value=\"0\"/>" << std::endl
- << " <enum name=\"bat\" value=\"1\"/>" << std::endl
- << " <enum name=\"baz\" value=\"2\"/>" << std::endl
- << "</attr>" << std::endl;
+ std::string input = "<attr name=\"foo\">\n"
+ " <enum name=\"bar\" value=\"0\"/>\n"
+ " <enum name=\"bat\" value=\"1\"/>\n"
+ " <enum name=\"baz\" value=\"2\"/>\n"
+ "</attr>";
ASSERT_TRUE(testParse(input));
const Attribute* enumAttr = findResource<Attribute>(ResourceName{
@@ -267,12 +260,11 @@ TEST_F(ResourceParserTest, ParseEnumAttr) {
}
TEST_F(ResourceParserTest, ParseFlagAttr) {
- std::stringstream input;
- input << "<attr name=\"foo\">" << std::endl
- << " <flag name=\"bar\" value=\"0\"/>" << std::endl
- << " <flag name=\"bat\" value=\"1\"/>" << std::endl
- << " <flag name=\"baz\" value=\"2\"/>" << std::endl
- << "</attr>" << std::endl;
+ std::string input = "<attr name=\"foo\">\n"
+ " <flag name=\"bar\" value=\"0\"/>\n"
+ " <flag name=\"bat\" value=\"1\"/>\n"
+ " <flag name=\"baz\" value=\"2\"/>\n"
+ "</attr>";
ASSERT_TRUE(testParse(input));
const Attribute* flagAttr = findResource<Attribute>(ResourceName{
@@ -297,22 +289,20 @@ TEST_F(ResourceParserTest, ParseFlagAttr) {
}
TEST_F(ResourceParserTest, FailToParseEnumAttrWithNonUniqueKeys) {
- std::stringstream input;
- input << "<attr name=\"foo\">" << std::endl
- << " <enum name=\"bar\" value=\"0\"/>" << std::endl
- << " <enum name=\"bat\" value=\"1\"/>" << std::endl
- << " <enum name=\"bat\" value=\"2\"/>" << std::endl
- << "</attr>" << std::endl;
+ std::string input = "<attr name=\"foo\">\n"
+ " <enum name=\"bar\" value=\"0\"/>\n"
+ " <enum name=\"bat\" value=\"1\"/>\n"
+ " <enum name=\"bat\" value=\"2\"/>\n"
+ "</attr>";
ASSERT_FALSE(testParse(input));
}
TEST_F(ResourceParserTest, ParseStyle) {
- std::stringstream input;
- input << "<style name=\"foo\" parent=\"@style/fu\">" << std::endl
- << " <item name=\"bar\">#ffffffff</item>" << std::endl
- << " <item name=\"bat\">@string/hey</item>" << std::endl
- << " <item name=\"baz\"><b>hey</b></item>" << std::endl
- << "</style>" << std::endl;
+ std::string input = "<style name=\"foo\" parent=\"@style/fu\">\n"
+ " <item name=\"bar\">#ffffffff</item>\n"
+ " <item name=\"bat\">@string/hey</item>\n"
+ " <item name=\"baz\"><b>hey</b></item>\n"
+ "</style>";
ASSERT_TRUE(testParse(input));
const Style* style = findResource<Style>(ResourceName{
@@ -330,8 +320,7 @@ TEST_F(ResourceParserTest, ParseStyle) {
}
TEST_F(ResourceParserTest, ParseStyleWithShorthandParent) {
- std::stringstream input;
- input << "<style name=\"foo\" parent=\"com.app:Theme\"/>" << std::endl;
+ std::string input = "<style name=\"foo\" parent=\"com.app:Theme\"/>";
ASSERT_TRUE(testParse(input));
const Style* style = findResource<Style>(
@@ -340,9 +329,34 @@ TEST_F(ResourceParserTest, ParseStyleWithShorthandParent) {
EXPECT_EQ(ResourceNameRef(u"com.app", ResourceType::kStyle, u"Theme"), style->parent.name);
}
+TEST_F(ResourceParserTest, ParseStyleWithPackageAliasedParent) {
+ std::string input = "<style xmlns:app=\"http://schemas.android.com/apk/res/android\"\n"
+ " name=\"foo\" parent=\"app:Theme\"/>";
+ ASSERT_TRUE(testParse(input));
+
+ const Style* style = findResource<Style>(ResourceName{
+ u"android", ResourceType::kStyle, u"foo" });
+ ASSERT_NE(style, nullptr);
+ EXPECT_EQ(ResourceNameRef(u"android", ResourceType::kStyle, u"Theme"), style->parent.name);
+}
+
+TEST_F(ResourceParserTest, ParseStyleWithPackageAliasedItems) {
+ std::string input =
+ "<style xmlns:app=\"http://schemas.android.com/apk/res/android\" name=\"foo\">\n"
+ " <item name=\"app:bar\">0</item>\n"
+ "</style>";
+ ASSERT_TRUE(testParse(input));
+
+ const Style* style = findResource<Style>(ResourceName{
+ u"android", ResourceType::kStyle, u"foo" });
+ ASSERT_NE(style, nullptr);
+ ASSERT_EQ(1u, style->entries.size());
+ EXPECT_EQ(ResourceNameRef(u"android", ResourceType::kAttr, u"bar"),
+ style->entries[0].key.name);
+}
+
TEST_F(ResourceParserTest, ParseAutoGeneratedIdReference) {
- std::stringstream input;
- input << "<string name=\"foo\">@+id/bar</string>" << std::endl;
+ std::string input = "<string name=\"foo\">@+id/bar</string>";
ASSERT_TRUE(testParse(input));
const Id* id = findResource<Id>(ResourceName{ u"android", ResourceType::kId, u"bar"});
@@ -350,11 +364,10 @@ TEST_F(ResourceParserTest, ParseAutoGeneratedIdReference) {
}
TEST_F(ResourceParserTest, ParseAttributesDeclareStyleable) {
- std::stringstream input;
- input << "<declare-styleable name=\"foo\">" << std::endl
- << " <attr name=\"bar\" />" << std::endl
- << " <attr name=\"bat\" format=\"string|reference\"/>" << std::endl
- << "</declare-styleable>" << std::endl;
+ std::string input = "<declare-styleable name=\"foo\">\n"
+ " <attr name=\"bar\" />\n"
+ " <attr name=\"bat\" format=\"string|reference\"/>\n"
+ "</declare-styleable>";
ASSERT_TRUE(testParse(input));
const Attribute* attr = findResource<Attribute>(ResourceName{
@@ -376,12 +389,11 @@ TEST_F(ResourceParserTest, ParseAttributesDeclareStyleable) {
}
TEST_F(ResourceParserTest, ParseArray) {
- std::stringstream input;
- input << "<array name=\"foo\">" << std::endl
- << " <item>@string/ref</item>" << std::endl
- << " <item>hey</item>" << std::endl
- << " <item>23</item>" << std::endl
- << "</array>" << std::endl;
+ std::string input = "<array name=\"foo\">\n"
+ " <item>@string/ref</item>\n"
+ " <item>hey</item>\n"
+ " <item>23</item>\n"
+ "</array>";
ASSERT_TRUE(testParse(input));
const Array* array = findResource<Array>(ResourceName{
@@ -395,19 +407,16 @@ TEST_F(ResourceParserTest, ParseArray) {
}
TEST_F(ResourceParserTest, ParsePlural) {
- std::stringstream input;
- input << "<plurals name=\"foo\">" << std::endl
- << " <item quantity=\"other\">apples</item>" << std::endl
- << " <item quantity=\"one\">apple</item>" << std::endl
- << "</plurals>" << std::endl
- << std::endl;
+ std::string input = "<plurals name=\"foo\">\n"
+ " <item quantity=\"other\">apples</item>\n"
+ " <item quantity=\"one\">apple</item>\n"
+ "</plurals>";
ASSERT_TRUE(testParse(input));
}
TEST_F(ResourceParserTest, ParseCommentsWithResource) {
- std::stringstream input;
- input << "<!-- This is a comment -->" << std::endl
- << "<string name=\"foo\">Hi</string>" << std::endl;
+ std::string input = "<!-- This is a comment -->\n"
+ "<string name=\"foo\">Hi</string>";
ASSERT_TRUE(testParse(input));
const ResourceTableType* type;
@@ -425,7 +434,7 @@ TEST_F(ResourceParserTest, ParseCommentsWithResource) {
* (as an ID has no value).
*/
TEST_F(ResourceParserTest, ParsePublicIdAsDefinition) {
- std::stringstream input("<public type=\"id\" name=\"foo\"/>");
+ std::string input = "<public type=\"id\" name=\"foo\"/>";
ASSERT_TRUE(testParse(input));
const Id* id = findResource<Id>(ResourceName{ u"android", ResourceType::kId, u"foo" });