// 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 "tools/gn/inherited_libraries.h" #include "tools/gn/target.h" #include "tools/gn/test_with_scope.h" #include "util/test/test.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 Pair(const Target* t, bool b) { return std::pair(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]); }