Expose flags for collapse resource name to 'convert' command.

To achieve this ParseResourceConfig is extracted to Utils.cpp and tests
are moved from Optimize_test.cpp to Util_test.cpp.

Bug: b/249793372
Test: Util_test, Convert_test
Change-Id: I5a0458e3834d5ea62c96013abc14527285e895e0
diff --git a/tools/aapt2/cmd/Util_test.cpp b/tools/aapt2/cmd/Util_test.cpp
index 91accfe..28a6de8 100644
--- a/tools/aapt2/cmd/Util_test.cpp
+++ b/tools/aapt2/cmd/Util_test.cpp
@@ -25,6 +25,7 @@
 #include "util/Files.h"
 
 using ::android::ConfigDescription;
+using testing::UnorderedElementsAre;
 
 namespace aapt {
 
@@ -411,4 +412,61 @@
   EXPECT_FALSE(std::regex_search("file.koncowka", expression));
 }
 
+TEST(UtilTest, ParseConfigWithDirectives) {
+  const std::string& content = R"(
+bool/remove_me#remove
+bool/keep_name#no_collapse
+string/foo#no_obfuscate
+dimen/bar#no_obfuscate
+)";
+  aapt::test::Context context;
+  std::unordered_set<ResourceName> resource_exclusion;
+  std::set<ResourceName> name_collapse_exemptions;
+
+  EXPECT_TRUE(ParseResourceConfig(content, &context, resource_exclusion, name_collapse_exemptions));
+
+  EXPECT_THAT(name_collapse_exemptions,
+              UnorderedElementsAre(ResourceName({}, ResourceType::kString, "foo"),
+                                   ResourceName({}, ResourceType::kDimen, "bar"),
+                                   ResourceName({}, ResourceType::kBool, "keep_name")));
+  EXPECT_THAT(resource_exclusion,
+              UnorderedElementsAre(ResourceName({}, ResourceType::kBool, "remove_me")));
+}
+
+TEST(UtilTest, ParseConfigResourceWithPackage) {
+  const std::string& content = R"(
+package:bool/remove_me#remove
+)";
+  aapt::test::Context context;
+  std::unordered_set<ResourceName> resource_exclusion;
+  std::set<ResourceName> name_collapse_exemptions;
+
+  EXPECT_FALSE(
+      ParseResourceConfig(content, &context, resource_exclusion, name_collapse_exemptions));
+}
+
+TEST(UtilTest, ParseConfigInvalidName) {
+  const std::string& content = R"(
+package:bool/1231#remove
+)";
+  aapt::test::Context context;
+  std::unordered_set<ResourceName> resource_exclusion;
+  std::set<ResourceName> name_collapse_exemptions;
+
+  EXPECT_FALSE(
+      ParseResourceConfig(content, &context, resource_exclusion, name_collapse_exemptions));
+}
+
+TEST(UtilTest, ParseConfigNoHash) {
+  const std::string& content = R"(
+package:bool/my_bool
+)";
+  aapt::test::Context context;
+  std::unordered_set<ResourceName> resource_exclusion;
+  std::set<ResourceName> name_collapse_exemptions;
+
+  EXPECT_FALSE(
+      ParseResourceConfig(content, &context, resource_exclusion, name_collapse_exemptions));
+}
+
 }  // namespace aapt