[GN] Add a few more unit tests for Xcode objects.

This CL adds unit test files for Xcode objects in
tools/gn/xcode_object.h, and specifically tests the mapping between
a object and its class enum type and the mapping between a classe type 
and its name as a string.

Bug: 742258
Change-Id: Iab70bc2f3c0eedccd427e618d74f8077dcaee5c7
Reviewed-on: https://chromium-review.googlesource.com/630699
Reviewed-by: Sylvain Defresne <sdefresne@chromium.org>
Commit-Queue: Yuke Liao <liaoyuke@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#497064}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: da4fc47d51d4aa4da88816fb33b255be01d95885
diff --git a/tools/gn/xcode_object_unittest.cc b/tools/gn/xcode_object_unittest.cc
index 512f552..4e04946 100644
--- a/tools/gn/xcode_object_unittest.cc
+++ b/tools/gn/xcode_object_unittest.cc
@@ -7,88 +7,319 @@
 #include "base/memory/ptr_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+namespace {
+
+// Instantiate a PBXSourcesBuildPhase object.
+std::unique_ptr<PBXSourcesBuildPhase> GetPBXSourcesBuildPhaseObject() {
+  std::unique_ptr<PBXSourcesBuildPhase> pbx_sources_build_phase(
+      new PBXSourcesBuildPhase());
+  return pbx_sources_build_phase;
+}
+
+// Instantiate a PBXFrameworksBuildPhase object.
+std::unique_ptr<PBXFrameworksBuildPhase> GetPBXFrameworksBuildPhaseObject() {
+  std::unique_ptr<PBXFrameworksBuildPhase> pbx_frameworks_build_phase(
+      new PBXFrameworksBuildPhase());
+  return pbx_frameworks_build_phase;
+}
+
+// Instantiate a PBXShellScriptBuildPhase object with arbitrary names.
+std::unique_ptr<PBXShellScriptBuildPhase> GetPBXShellScriptBuildPhaseObject() {
+  std::unique_ptr<PBXShellScriptBuildPhase> pbx_shell_script_build_phase(
+      new PBXShellScriptBuildPhase("name", "shell_script"));
+  return pbx_shell_script_build_phase;
+}
+
+// Instantiate a PBXGroup object with arbitrary names.
+std::unique_ptr<PBXGroup> GetPBXGroupObject() {
+  std::unique_ptr<PBXGroup> pbx_group(new PBXGroup("/dir1/dir2", "group"));
+  return pbx_group;
+}
+
+// Instantiate a PBXProject object with arbitrary names.
+std::unique_ptr<PBXProject> GetPBXProjectObject() {
+  std::unique_ptr<PBXProject> pbx_project(
+      new PBXProject("project", "config", "out/build", PBXAttributes()));
+  return pbx_project;
+}
+
+// Instantiate a PBXFileReference object with arbitrary names.
+std::unique_ptr<PBXFileReference> GetPBXFileReferenceObject() {
+  std::unique_ptr<PBXFileReference> pbx_file_reference(new PBXFileReference(
+      "product.app", "product.app", "wrapper.application"));
+  return pbx_file_reference;
+}
+
+// Instantiate a PBXBuildFile object.
+std::unique_ptr<PBXBuildFile> GetPBXBuildFileObject(
+    const PBXFileReference* file_reference,
+    const PBXSourcesBuildPhase* build_phase) {
+  std::unique_ptr<PBXBuildFile> pbx_build_file(
+      new PBXBuildFile(file_reference, build_phase, CompilerFlags::NONE));
+  return pbx_build_file;
+}
+
+// Instantiate a PBXAggregateTarget object with arbitrary names.
+std::unique_ptr<PBXAggregateTarget> GetPBXAggregateTargetObject() {
+  std::unique_ptr<PBXAggregateTarget> pbx_aggregate_target(
+      new PBXAggregateTarget("target_name", "shell_script", "config_name",
+                             PBXAttributes()));
+  return pbx_aggregate_target;
+}
+
+// Instantiate a PBXNativeTarget object with arbitrary names.
+std::unique_ptr<PBXNativeTarget> GetPBXNativeTargetObject(
+    const PBXFileReference* product_reference) {
+  std::unique_ptr<PBXNativeTarget> pbx_native_target(new PBXNativeTarget(
+      "target_name", "ninja gn_unittests", "config_name", PBXAttributes(),
+      "com.apple.product-type.application", "product_name", product_reference));
+  return pbx_native_target;
+}
+
+// Instantiate a PBXContainerItemProxy object.
+std::unique_ptr<PBXContainerItemProxy> GetPBXContainerItemProxyObject(
+    const PBXProject* project,
+    const PBXTarget* target) {
+  std::unique_ptr<PBXContainerItemProxy> pbx_container_item_proxy(
+      new PBXContainerItemProxy(project, target));
+  return pbx_container_item_proxy;
+}
+
+// Instantiate a PBXTargetDependency object.
+std::unique_ptr<PBXTargetDependency> GetPBXTargetDependencyObject(
+    const PBXTarget* target,
+    std::unique_ptr<PBXContainerItemProxy> container_item_proxy) {
+  std::unique_ptr<PBXTargetDependency> pbx_target_dependency(
+      new PBXTargetDependency(target, std::move(container_item_proxy)));
+  return pbx_target_dependency;
+}
+
+// Instantiate a XCBuildConfiguration object with arbitrary names.
+std::unique_ptr<XCBuildConfiguration> GetXCBuildConfigurationObject() {
+  std::unique_ptr<XCBuildConfiguration> xc_build_configuration(
+      new XCBuildConfiguration("config_name", PBXAttributes()));
+  return xc_build_configuration;
+}
+
+// Instantiate a XCConfigurationList object with arbitrary names.
+std::unique_ptr<XCConfigurationList> GetXCConfigurationListObject(
+    const PBXObject* owner_reference) {
+  std::unique_ptr<XCConfigurationList> xc_configuration_list(
+      new XCConfigurationList("config_list_name", PBXAttributes(),
+                              owner_reference));
+  return xc_configuration_list;
+}
+
+}  // namespace
+
 // Tests that instantiating Xcode objects doesn't crash.
 TEST(XcodeObject, InstantiatePBXSourcesBuildPhase) {
-  PBXSourcesBuildPhase pbx_sources_build_phase;
+  std::unique_ptr<PBXSourcesBuildPhase> pbx_sources_build_phase =
+      GetPBXSourcesBuildPhaseObject();
 }
 
 TEST(XcodeObject, InstantiatePBXFrameworksBuildPhase) {
-  PBXFrameworksBuildPhase pbx_frameworks_build_phase;
+  std::unique_ptr<PBXFrameworksBuildPhase> pbx_frameworks_build_phase =
+      GetPBXFrameworksBuildPhaseObject();
 }
 
 TEST(XcodeObject, InstantiatePBXShellScriptBuildPhase) {
-  PBXShellScriptBuildPhase pbx_shell_script_build_phase("name", "shell_script");
+  std::unique_ptr<PBXShellScriptBuildPhase> pbx_shell_script_build_phase =
+      GetPBXShellScriptBuildPhaseObject();
 }
 
 TEST(XcodeObject, InstantiatePBXGroup) {
-  PBXGroup pbx_group("/dir1/dir2", "group");
+  std::unique_ptr<PBXGroup> pbx_group = GetPBXGroupObject();
 }
 
 TEST(XcodeObject, InstantiatePBXProject) {
-  PBXProject pbx_project("project", "config", "out/build", PBXAttributes());
+  std::unique_ptr<PBXProject> pbx_project = GetPBXProjectObject();
 }
 
 TEST(XcodeObject, InstantiatePBXFileReference) {
-  PBXFileReference pbx_file_reference("test.cc", "sources/tools/test.cc",
-                                      "sourcecode.cpp.cpp");
+  std::unique_ptr<PBXFileReference> pbx_file_reference =
+      GetPBXFileReferenceObject();
 }
 
 TEST(XcodeObject, InstantiatePBXBuildFile) {
-  PBXFileReference pbx_file_reference("test.cc", "sources/tools/test.cc",
-                                      "sourcecode.cpp.cpp");
-  PBXSourcesBuildPhase pbx_sources_build_phase;
-  PBXBuildFile pbx_build_file(&pbx_file_reference, &pbx_sources_build_phase,
-                              CompilerFlags::NONE);
+  std::unique_ptr<PBXFileReference> pbx_file_reference =
+      GetPBXFileReferenceObject();
+  std::unique_ptr<PBXSourcesBuildPhase> pbx_sources_build_phase =
+      GetPBXSourcesBuildPhaseObject();
+  std::unique_ptr<PBXBuildFile> pbx_build_file = GetPBXBuildFileObject(
+      pbx_file_reference.get(), pbx_sources_build_phase.get());
 }
 
 TEST(XcodeObject, InstantiatePBXAggregateTarget) {
-  PBXAggregateTarget pbx_aggregate_target("target_name", "shell_script",
-                                          "config_name", PBXAttributes());
+  std::unique_ptr<PBXAggregateTarget> pbx_aggregate_target =
+      GetPBXAggregateTargetObject();
 }
 
 TEST(XcodeObject, InstantiatePBXNativeTarget) {
-  PBXFileReference product_reference("product.app", "product.app",
-                                     "wrapper.application");
-  PBXNativeTarget pbx_native_target(
-      "target_name", "ninja gn_unittests", "config_name", PBXAttributes(),
-      "com.apple.product-type.application", "product_name", &product_reference);
+  std::unique_ptr<PBXFileReference> product_reference =
+      GetPBXFileReferenceObject();
+  std::unique_ptr<PBXNativeTarget> pbx_native_target =
+      GetPBXNativeTargetObject(product_reference.get());
 }
 
 TEST(XcodeObject, InstantiatePBXContainerItemProxy) {
-  PBXProject pbx_project("project_name", "config_name", "out/build",
-                         PBXAttributes());
-  PBXFileReference product_reference("product.app", "product.app",
-                                     "wrapper.application");
-  PBXNativeTarget pbx_native_target(
-      "target_name", "ninja gn_unittests", "config_name", PBXAttributes(),
-      "com.apple.product-type.application", "product_name", &product_reference);
-  PBXContainerItemProxy pbx_container_item_proxy(&pbx_project,
-                                                 &pbx_native_target);
+  std::unique_ptr<PBXFileReference> product_reference =
+      GetPBXFileReferenceObject();
+  std::unique_ptr<PBXNativeTarget> pbx_native_target =
+      GetPBXNativeTargetObject(product_reference.get());
+  std::unique_ptr<PBXProject> pbx_project = GetPBXProjectObject();
+  std::unique_ptr<PBXContainerItemProxy> pbx_container_item_proxy =
+      GetPBXContainerItemProxyObject(pbx_project.get(),
+                                     pbx_native_target.get());
 }
 
 TEST(XcodeObject, InstantiatePBXTargetDependency) {
-  PBXProject pbx_project("project_name", "config_name", "out/build",
-                         PBXAttributes());
-  PBXFileReference product_reference("product.app", "product.app",
-                                     "wrapper.application");
-  PBXNativeTarget pbx_native_target(
-      "target_name", "ninja gn_unittests", "config_name", PBXAttributes(),
-      "com.apple.product-type.application", "product_name", &product_reference);
-  PBXTargetDependency pbx_target_dependency(
-      &pbx_native_target, base::MakeUnique<PBXContainerItemProxy>(
-                              &pbx_project, &pbx_native_target));
+  std::unique_ptr<PBXFileReference> product_reference =
+      GetPBXFileReferenceObject();
+  std::unique_ptr<PBXProject> pbx_project = GetPBXProjectObject();
+  std::unique_ptr<PBXNativeTarget> pbx_native_target =
+      GetPBXNativeTargetObject(product_reference.get());
+  std::unique_ptr<PBXContainerItemProxy> pbx_container_item_proxy =
+      GetPBXContainerItemProxyObject(pbx_project.get(),
+                                     pbx_native_target.get());
+  std::unique_ptr<PBXTargetDependency> pbx_target_dependency =
+      GetPBXTargetDependencyObject(pbx_native_target.get(),
+                                   std::move(pbx_container_item_proxy));
 }
 
 TEST(XcodeObject, InstantiateXCBuildConfiguration) {
-  XCBuildConfiguration xc_build_configuration("config_name", PBXAttributes());
+  std::unique_ptr<XCBuildConfiguration> xc_build_configuration =
+      GetXCBuildConfigurationObject();
 }
 
 TEST(XcodeObject, InstantiateXCConfigurationList) {
-  PBXFileReference product_reference("product.app", "product.app",
-                                     "wrapper.application");
-  PBXNativeTarget pbx_native_target(
-      "target_name", "ninja gn_unittests", "config_name", PBXAttributes(),
-      "com.apple.product-type.application", "product_name", &product_reference);
-  XCConfigurationList xc_xcconfiguration_list(
-      "config_list_name", PBXAttributes(), &pbx_native_target);
+  std::unique_ptr<PBXFileReference> product_reference =
+      GetPBXFileReferenceObject();
+  std::unique_ptr<PBXNativeTarget> pbx_native_target =
+      GetPBXNativeTargetObject(product_reference.get());
+  std::unique_ptr<XCConfigurationList> xc_configuration_list =
+      GetXCConfigurationListObject(pbx_native_target.get());
+}
+
+// Tests that the mapping between PBXObject and PBXObjectClass.
+TEST(XcodeObject, PBXSourcesBuildPhaseObjectToClass) {
+  std::unique_ptr<PBXSourcesBuildPhase> pbx_sources_build_phase =
+      GetPBXSourcesBuildPhaseObject();
+  EXPECT_EQ(PBXSourcesBuildPhaseClass, pbx_sources_build_phase->Class());
+}
+
+TEST(XcodeObject, PBXFrameworksBuildPhaseObjectToClass) {
+  std::unique_ptr<PBXFrameworksBuildPhase> pbx_frameworks_build_phase =
+      GetPBXFrameworksBuildPhaseObject();
+  EXPECT_EQ(PBXFrameworksBuildPhaseClass, pbx_frameworks_build_phase->Class());
+}
+
+TEST(XcodeObject, PBXShellScriptBuildPhaseObjectToClass) {
+  std::unique_ptr<PBXShellScriptBuildPhase> pbx_shell_script_build_phase =
+      GetPBXShellScriptBuildPhaseObject();
+  EXPECT_EQ(PBXShellScriptBuildPhaseClass,
+            pbx_shell_script_build_phase->Class());
+}
+
+TEST(XcodeObject, PBXGroupObjectToClass) {
+  std::unique_ptr<PBXGroup> pbx_group = GetPBXGroupObject();
+  EXPECT_EQ(PBXGroupClass, pbx_group->Class());
+}
+
+TEST(XcodeObject, PBXProjectObjectToClass) {
+  std::unique_ptr<PBXProject> pbx_project = GetPBXProjectObject();
+  EXPECT_EQ(PBXProjectClass, pbx_project->Class());
+}
+
+TEST(XcodeObject, PBXFileReferenceObjectToClass) {
+  std::unique_ptr<PBXFileReference> pbx_file_reference =
+      GetPBXFileReferenceObject();
+  EXPECT_EQ(PBXFileReferenceClass, pbx_file_reference->Class());
+}
+
+TEST(XcodeObject, PBXBuildFileObjectToClass) {
+  std::unique_ptr<PBXFileReference> pbx_file_reference =
+      GetPBXFileReferenceObject();
+  std::unique_ptr<PBXSourcesBuildPhase> pbx_sources_build_phase =
+      GetPBXSourcesBuildPhaseObject();
+  std::unique_ptr<PBXBuildFile> pbx_build_file = GetPBXBuildFileObject(
+      pbx_file_reference.get(), pbx_sources_build_phase.get());
+  EXPECT_EQ(PBXBuildFileClass, pbx_build_file->Class());
+}
+
+TEST(XcodeObject, PBXAggregateTargetObjectToClass) {
+  std::unique_ptr<PBXAggregateTarget> pbx_aggregate_target =
+      GetPBXAggregateTargetObject();
+  EXPECT_EQ(PBXAggregateTargetClass, pbx_aggregate_target->Class());
+}
+
+TEST(XcodeObject, PBXNativeTargetObjectToClass) {
+  std::unique_ptr<PBXFileReference> product_reference =
+      GetPBXFileReferenceObject();
+  std::unique_ptr<PBXNativeTarget> pbx_native_target =
+      GetPBXNativeTargetObject(product_reference.get());
+  EXPECT_EQ(PBXNativeTargetClass, pbx_native_target->Class());
+}
+
+TEST(XcodeObject, PBXContainerItemProxyObjectToClass) {
+  std::unique_ptr<PBXFileReference> product_reference =
+      GetPBXFileReferenceObject();
+  std::unique_ptr<PBXNativeTarget> pbx_native_target =
+      GetPBXNativeTargetObject(product_reference.get());
+  std::unique_ptr<PBXProject> pbx_project = GetPBXProjectObject();
+  std::unique_ptr<PBXContainerItemProxy> pbx_container_item_proxy =
+      GetPBXContainerItemProxyObject(pbx_project.get(),
+                                     pbx_native_target.get());
+  EXPECT_EQ(PBXContainerItemProxyClass, pbx_container_item_proxy->Class());
+}
+
+TEST(XcodeObject, PBXTargetDependencyObjectToClass) {
+  std::unique_ptr<PBXFileReference> product_reference =
+      GetPBXFileReferenceObject();
+  std::unique_ptr<PBXProject> pbx_project = GetPBXProjectObject();
+  std::unique_ptr<PBXNativeTarget> pbx_native_target =
+      GetPBXNativeTargetObject(product_reference.get());
+  std::unique_ptr<PBXContainerItemProxy> pbx_container_item_proxy =
+      GetPBXContainerItemProxyObject(pbx_project.get(),
+                                     pbx_native_target.get());
+  std::unique_ptr<PBXTargetDependency> pbx_target_dependency =
+      GetPBXTargetDependencyObject(pbx_native_target.get(),
+                                   std::move(pbx_container_item_proxy));
+  EXPECT_EQ(PBXTargetDependencyClass, pbx_target_dependency->Class());
+}
+
+TEST(XcodeObject, XCBuildConfigurationObjectToClass) {
+  std::unique_ptr<XCBuildConfiguration> xc_build_configuration =
+      GetXCBuildConfigurationObject();
+  EXPECT_EQ(XCBuildConfigurationClass, xc_build_configuration->Class());
+}
+
+TEST(XcodeObject, XCConfigurationListObjectToClass) {
+  std::unique_ptr<PBXFileReference> product_reference =
+      GetPBXFileReferenceObject();
+  std::unique_ptr<PBXNativeTarget> pbx_native_target =
+      GetPBXNativeTargetObject(product_reference.get());
+  std::unique_ptr<XCConfigurationList> xc_configuration_list =
+      GetXCConfigurationListObject(pbx_native_target.get());
+  EXPECT_EQ(XCConfigurationListClass, xc_configuration_list->Class());
+}
+
+// Tests the mapping between PBXObjectClass and it's name as a string.
+TEST(XcodeObject, ClassToString) {
+  EXPECT_EQ("PBXAggregateTarget", ToString(PBXAggregateTargetClass));
+  EXPECT_EQ("PBXBuildFile", ToString(PBXBuildFileClass));
+  EXPECT_EQ("PBXAggregateTarget", ToString(PBXAggregateTargetClass));
+  EXPECT_EQ("PBXBuildFile", ToString(PBXBuildFileClass));
+  EXPECT_EQ("PBXContainerItemProxy", ToString(PBXContainerItemProxyClass));
+  EXPECT_EQ("PBXFileReference", ToString(PBXFileReferenceClass));
+  EXPECT_EQ("PBXFrameworksBuildPhase", ToString(PBXFrameworksBuildPhaseClass));
+  EXPECT_EQ("PBXGroup", ToString(PBXGroupClass));
+  EXPECT_EQ("PBXNativeTarget", ToString(PBXNativeTargetClass));
+  EXPECT_EQ("PBXProject", ToString(PBXProjectClass));
+  EXPECT_EQ("PBXSourcesBuildPhase", ToString(PBXSourcesBuildPhaseClass));
+  EXPECT_EQ("PBXTargetDependency", ToString(PBXTargetDependencyClass));
+  EXPECT_EQ("XCBuildConfiguration", ToString(XCBuildConfigurationClass));
+  EXPECT_EQ("XCConfigurationList", ToString(XCConfigurationListClass));
+  EXPECT_EQ("PBXShellScriptBuildPhase",
+            ToString(PBXShellScriptBuildPhaseClass));
 }