Index: tools/gn/inherited_libraries_unittest.cc |
diff --git a/tools/gn/inherited_libraries_unittest.cc b/tools/gn/inherited_libraries_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..51152095352bc4adeb882f9a7853adb7fb9f5cdd |
--- /dev/null |
+++ b/tools/gn/inherited_libraries_unittest.cc |
@@ -0,0 +1,135 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "tools/gn/inherited_libraries.h" |
+#include "tools/gn/target.h" |
+#include "tools/gn/test_with_scope.h" |
+ |
+namespace { |
+ |
+// In these tests, Pair can't be used conveniently because the |
+// "const" won't be inferred and the types won't match. This helper makes the |
+// right type of pair with the const Target. |
+std::pair<const Target*, bool> Pair(const Target* t, bool b) { |
+ return std::pair<const Target*, bool>(t, b); |
+} |
+ |
+} // namespace |
+ |
+TEST(InheritedLibraries, Unique) { |
+ TestWithScope setup; |
+ |
+ Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); |
+ Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); |
+ |
+ // Setup, add the two targets as private. |
+ InheritedLibraries libs; |
+ libs.Append(&a, false); |
+ libs.Append(&b, false); |
+ auto result = libs.GetOrderedAndPublicFlag(); |
+ ASSERT_EQ(2u, result.size()); |
+ EXPECT_EQ(Pair(&a, false), result[0]); |
+ EXPECT_EQ(Pair(&b, false), result[1]); |
+ |
+ // Add again as private, this should be a NOP. |
+ libs.Append(&a, false); |
+ libs.Append(&b, false); |
+ result = libs.GetOrderedAndPublicFlag(); |
+ ASSERT_EQ(2u, result.size()); |
+ EXPECT_EQ(Pair(&a, false), result[0]); |
+ EXPECT_EQ(Pair(&b, false), result[1]); |
+ |
+ // Add as public, this should make both public. |
+ libs.Append(&a, true); |
+ libs.Append(&b, true); |
+ result = libs.GetOrderedAndPublicFlag(); |
+ ASSERT_EQ(2u, result.size()); |
+ EXPECT_EQ(Pair(&a, true), result[0]); |
+ EXPECT_EQ(Pair(&b, true), result[1]); |
+ |
+ // Add again private, they should stay public. |
+ libs.Append(&a, false); |
+ libs.Append(&b, false); |
+ result = libs.GetOrderedAndPublicFlag(); |
+ ASSERT_EQ(2u, result.size()); |
+ EXPECT_EQ(Pair(&a, true), result[0]); |
+ EXPECT_EQ(Pair(&b, true), result[1]); |
+} |
+ |
+TEST(InheritedLibraries, AppendInherited) { |
+ TestWithScope setup; |
+ |
+ Target a(setup.settings(), Label(SourceDir("//foo/"), "a")); |
+ Target b(setup.settings(), Label(SourceDir("//foo/"), "b")); |
+ Target w(setup.settings(), Label(SourceDir("//foo/"), "w")); |
+ Target x(setup.settings(), Label(SourceDir("//foo/"), "x")); |
+ Target y(setup.settings(), Label(SourceDir("//foo/"), "y")); |
+ Target z(setup.settings(), Label(SourceDir("//foo/"), "z")); |
+ |
+ InheritedLibraries libs; |
+ libs.Append(&a, false); |
+ libs.Append(&b, false); |
+ |
+ // Appending these things with private inheritance should make them private, |
+ // no matter how they're listed in the appended class. |
+ InheritedLibraries append_private; |
+ append_private.Append(&a, true); |
+ append_private.Append(&b, false); |
+ append_private.Append(&w, true); |
+ append_private.Append(&x, false); |
+ libs.AppendInherited(append_private, false); |
+ |
+ auto result = libs.GetOrderedAndPublicFlag(); |
+ ASSERT_EQ(4u, result.size()); |
+ EXPECT_EQ(Pair(&a, false), result[0]); |
+ EXPECT_EQ(Pair(&b, false), result[1]); |
+ EXPECT_EQ(Pair(&w, false), result[2]); |
+ EXPECT_EQ(Pair(&x, false), result[3]); |
+ |
+ // Appending these things with public inheritance should convert them. |
+ InheritedLibraries append_public; |
+ append_public.Append(&a, true); |
+ append_public.Append(&b, false); |
+ append_public.Append(&y, true); |
+ append_public.Append(&z, false); |
+ libs.AppendInherited(append_public, true); |
+ |
+ result = libs.GetOrderedAndPublicFlag(); |
+ ASSERT_EQ(6u, result.size()); |
+ EXPECT_EQ(Pair(&a, true), result[0]); // Converted to public. |
+ EXPECT_EQ(Pair(&b, false), result[1]); |
+ EXPECT_EQ(Pair(&w, false), result[2]); |
+ EXPECT_EQ(Pair(&x, false), result[3]); |
+ EXPECT_EQ(Pair(&y, true), result[4]); // Appended as public. |
+ EXPECT_EQ(Pair(&z, false), result[5]); |
+} |
+ |
+TEST(InheritedLibraries, AppendPublicSharedLibraries) { |
+ TestWithScope setup; |
+ InheritedLibraries append; |
+ |
+ // Two source sets. |
+ Target set_pub(setup.settings(), Label(SourceDir("//foo/"), "set_pub")); |
+ set_pub.set_output_type(Target::SOURCE_SET); |
+ append.Append(&set_pub, true); |
+ Target set_priv(setup.settings(), Label(SourceDir("//foo/"), "set_priv")); |
+ set_priv.set_output_type(Target::SOURCE_SET); |
+ append.Append(&set_priv, false); |
+ |
+ // Two shared libraries. |
+ Target sh_pub(setup.settings(), Label(SourceDir("//foo/"), "sh_pub")); |
+ sh_pub.set_output_type(Target::SHARED_LIBRARY); |
+ append.Append(&sh_pub, true); |
+ Target sh_priv(setup.settings(), Label(SourceDir("//foo/"), "sh_priv")); |
+ sh_priv.set_output_type(Target::SHARED_LIBRARY); |
+ append.Append(&sh_priv, false); |
+ |
+ InheritedLibraries libs; |
+ libs.AppendPublicSharedLibraries(append, true); |
+ |
+ auto result = libs.GetOrderedAndPublicFlag(); |
+ ASSERT_EQ(1u, result.size()); |
+ EXPECT_EQ(Pair(&sh_pub, true), result[0]); |
+} |