/* vim: set sw=4 sts=4 et foldmethod=syntax : */ /* * Copyright (c) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Ciaran McCreesh * * This file is part of the Paludis package manager. Paludis is free software; * you can redistribute it and/or modify it under the terms of the GNU General * Public License version 2, as published by the Free Software Foundation. * * Paludis is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace paludis; TEST(EnvironmentImplementation, Repositories) { TestEnvironment e; const std::shared_ptr r1(std::make_shared(make_named_values( n::environment() = &e, n::name() = RepositoryName("repo1") ))); const std::shared_ptr r2(std::make_shared(make_named_values( n::environment() = &e, n::name() = RepositoryName("repo2") ))); EXPECT_THROW(e.fetch_repository(RepositoryName("repo1")), NoSuchRepositoryError); EXPECT_THROW(e.fetch_repository(RepositoryName("repo2")), NoSuchRepositoryError); e.add_repository(10, r1); ASSERT_TRUE(bool(e.fetch_repository(RepositoryName("repo1")))); EXPECT_EQ(RepositoryName("repo1"), e.fetch_repository(RepositoryName("repo1"))->name()); EXPECT_THROW(e.fetch_repository(RepositoryName("repo2")), NoSuchRepositoryError); EXPECT_THROW(e.add_repository(10, r1), DuplicateRepositoryError); e.add_repository(11, r2); ASSERT_TRUE(bool(e.fetch_repository(RepositoryName("repo1")))); EXPECT_EQ(RepositoryName("repo1"), e.fetch_repository(RepositoryName("repo1"))->name()); ASSERT_TRUE(bool(e.fetch_repository(RepositoryName("repo2")))); EXPECT_EQ(RepositoryName("repo2"), e.fetch_repository(RepositoryName("repo2"))->name()); EXPECT_THROW(e.add_repository(10, r1), DuplicateRepositoryError); EXPECT_THROW(e.add_repository(5, r2), DuplicateRepositoryError); ASSERT_TRUE(bool(e.fetch_repository(RepositoryName("repo1")))); EXPECT_EQ(RepositoryName("repo1"), e.fetch_repository(RepositoryName("repo1"))->name()); ASSERT_TRUE(bool(e.fetch_repository(RepositoryName("repo2")))); EXPECT_EQ(RepositoryName("repo2"), e.fetch_repository(RepositoryName("repo2"))->name()); EXPECT_TRUE(! e.more_important_than(RepositoryName("repo1"), RepositoryName("repo2"))); EXPECT_TRUE(e.more_important_than(RepositoryName("repo2"), RepositoryName("repo1"))); EXPECT_TRUE(! e.more_important_than(RepositoryName("repo2"), RepositoryName("repo2"))); EXPECT_TRUE(! e.more_important_than(RepositoryName("repo1"), RepositoryName("repo1"))); } namespace { struct CoolFakeRepository : FakeRepository { CoolFakeRepository(const Environment * const e, const RepositoryName & rn) : FakeRepository(make_named_values( n::environment() = e, n::name() = rn )) { } std::shared_ptr unimportant_category_names(const RepositoryContentMayExcludes &) const { std::shared_ptr result(std::make_shared()); result->insert(CategoryNamePart("bad-cat1")); result->insert(CategoryNamePart("bad-cat2")); return result; } }; } TEST(EnvironmentImplementation, Disambiguation) { TestEnvironment e; std::shared_ptr r1(std::make_shared(make_named_values( n::environment() = &e, n::name() = RepositoryName("repo1")))); r1->add_version(CategoryNamePart("cat-one") + PackageNamePart("pkg-one"), VersionSpec("0", { })); r1->add_version(CategoryNamePart("cat-one") + PackageNamePart("pkg-two"), VersionSpec("0", { })); r1->add_version(CategoryNamePart("cat-two") + PackageNamePart("pkg-two"), VersionSpec("0", { })); r1->add_version(CategoryNamePart("cat-two") + PackageNamePart("pkg-three"), VersionSpec("0", { })); e.add_repository(10, r1); std::shared_ptr r2(std::make_shared(make_named_values( n::environment() = &e, n::name() = RepositoryName("repo2")))); r2->add_version(CategoryNamePart("cat-three") + PackageNamePart("pkg-three"), VersionSpec("0", { })); r2->add_version(CategoryNamePart("cat-three") + PackageNamePart("pkg-four"), VersionSpec("0", { })); e.add_repository(10, r2); std::shared_ptr r3(std::make_shared(&e, RepositoryName("repo3"))); r3->add_version(CategoryNamePart("bad-cat1") + PackageNamePart("pkg-important"), VersionSpec("0", { })); r3->add_version(CategoryNamePart("good-cat1") + PackageNamePart("pkg-important"), VersionSpec("0", { })); r3->add_version(CategoryNamePart("good-cat1") + PackageNamePart("pkg-installed"), VersionSpec("0", { })); r3->add_version(CategoryNamePart("good-cat2") + PackageNamePart("pkg-installed"), VersionSpec("0", { })); r3->add_version(CategoryNamePart("bad-cat1") + PackageNamePart("pkg-fail1"), VersionSpec("0", { })); r3->add_version(CategoryNamePart("bad-cat2") + PackageNamePart("pkg-fail1"), VersionSpec("0", { })); r3->add_version(CategoryNamePart("bad-cat1") + PackageNamePart("pkg-fail2"), VersionSpec("0", { })); r3->add_version(CategoryNamePart("bad-cat2") + PackageNamePart("pkg-fail2"), VersionSpec("0", { })); r3->add_version(CategoryNamePart("good-cat1") + PackageNamePart("pkg-fail3"), VersionSpec("0", { })); r3->add_version(CategoryNamePart("good-cat2") + PackageNamePart("pkg-fail3"), VersionSpec("0", { })); r3->add_version(CategoryNamePart("good-cat1") + PackageNamePart("pkg-fail4"), VersionSpec("0", { })); r3->add_version(CategoryNamePart("good-cat2") + PackageNamePart("pkg-fail4"), VersionSpec("0", { })); r3->add_version(CategoryNamePart("avail-cat") + PackageNamePart("pkg-foo"), VersionSpec("0", { })); e.add_repository(10, r3); std::shared_ptr r4(std::make_shared( make_named_values( n::environment() = &e, n::name() = RepositoryName("repo4"), n::suitable_destination() = true, n::supports_uninstall() = true ))); r4->add_version(CategoryNamePart("good-cat1") + PackageNamePart("pkg-installed"), VersionSpec("0", { })); r4->add_version(CategoryNamePart("good-cat1") + PackageNamePart("pkg-fail4"), VersionSpec("0", { })); r4->add_version(CategoryNamePart("good-cat2") + PackageNamePart("pkg-fail4"), VersionSpec("0", { })); r4->add_version(CategoryNamePart("inst-cat") + PackageNamePart("pkg-foo"), VersionSpec("0", { })); e.add_repository(10, r4); EXPECT_EQ("cat-one/pkg-one", stringify(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-one")))); EXPECT_EQ("cat-three/pkg-four", stringify(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-four")))); EXPECT_EQ("good-cat1/pkg-important", stringify(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-important")))); EXPECT_EQ("good-cat1/pkg-installed", stringify(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-installed")))); EXPECT_THROW(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-two")), AmbiguousPackageNameError); EXPECT_THROW(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-three")), AmbiguousPackageNameError); EXPECT_THROW(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-fail1")), AmbiguousPackageNameError); EXPECT_THROW(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-fail2")), AmbiguousPackageNameError); EXPECT_THROW(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-fail3")), AmbiguousPackageNameError); EXPECT_THROW(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-fail4")), AmbiguousPackageNameError); EXPECT_THROW(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-five")), NoSuchPackageError); EXPECT_THROW(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-one"), filter::SupportsAction()), NoSuchPackageError); EXPECT_EQ("inst-cat/pkg-foo", stringify(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-foo")))); EXPECT_EQ("avail-cat/pkg-foo", stringify(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-foo"), filter::SupportsAction()))); EXPECT_THROW(e.fetch_unique_qualified_package_name(PackageNamePart("pkg-foo"), filter::All(), false), AmbiguousPackageNameError); }