index.cpp (5213B)
1 #include "helper.hpp" 2 3 #include <errors.hpp> 4 #include <index.hpp> 5 6 static const char *M = "[index]"; 7 static const Path RIPATH("test/indexes"); 8 9 TEST_CASE("index file not found", M) { 10 UseRootPath root(RIPATH); 11 12 try { 13 IndexPtr ri = Index::load("404"); 14 FAIL(); 15 } 16 catch(const reapack_error &e) { 17 REQUIRE(std::string{e.what()} == "No such file or directory"); 18 } 19 } 20 21 TEST_CASE("load index from raw data", M) { 22 SECTION("valid") { 23 Index::load({}, "<index version=\"1\"/>\n"); 24 } 25 26 SECTION("broken") { 27 try { 28 Index::load({}, "<index>\n"); 29 FAIL(); 30 } 31 catch(const reapack_error &) {} 32 } 33 } 34 35 TEST_CASE("no root node", M) { 36 try { 37 Index::load({}, R"(<?xml verison="1.0 encoding="utf-8"?>)"); 38 FAIL(); 39 } 40 catch(const reapack_error &) {} 41 } 42 43 TEST_CASE("broken index", M) { 44 UseRootPath root(RIPATH); 45 46 try { 47 IndexPtr ri = Index::load("broken"); 48 FAIL(); 49 } 50 catch(const reapack_error &) {} 51 } 52 53 TEST_CASE("wrong root tag name", M) { 54 UseRootPath root(RIPATH); 55 56 try { 57 IndexPtr ri = Index::load("wrong_root"); 58 FAIL(); 59 } 60 catch(const reapack_error &e) { 61 REQUIRE(std::string{e.what()} == "invalid index"); 62 } 63 } 64 65 TEST_CASE("invalid version", M) { 66 UseRootPath root(RIPATH); 67 68 try { 69 IndexPtr ri = Index::load("invalid_version"); 70 FAIL(); 71 } 72 catch(const reapack_error &e) { 73 REQUIRE(std::string{e.what()} == "index version not found"); 74 } 75 } 76 77 TEST_CASE("future version", M) { 78 UseRootPath root(RIPATH); 79 80 try { 81 IndexPtr ri = Index::load("future_version"); 82 FAIL(); 83 } 84 catch(const reapack_error &e) { 85 REQUIRE(std::string{e.what()} == "index version is unsupported"); 86 } 87 } 88 89 TEST_CASE("add a category", M) { 90 Index ri("a"); 91 Category *cat = new Category("a", &ri); 92 Package *pack = new Package(Package::ScriptType, "name", cat); 93 Version *ver = new Version("1", pack); 94 Source *source = new Source({}, "google.com", ver); 95 96 ver->addSource(source); 97 pack->addVersion(ver); 98 cat->addPackage(pack); 99 100 CHECK(ri.categories().size() == 0); 101 CHECK(ri.category("a") == nullptr); 102 103 REQUIRE(ri.addCategory(cat)); 104 105 REQUIRE(ri.categories().size() == 1); 106 REQUIRE(ri.category("a") == cat); 107 REQUIRE(ri.packages() == cat->packages()); 108 } 109 110 TEST_CASE("add owned category", M) { 111 Index ri1("a"); 112 Index ri2("b"); 113 114 Category *cat = new Category("name", &ri1); 115 116 try { 117 ri2.addCategory(cat); 118 FAIL(); 119 } 120 catch(const reapack_error &e) { 121 delete cat; 122 REQUIRE(std::string{e.what()} == "category belongs to another index"); 123 } 124 } 125 126 TEST_CASE("drop empty category", M) { 127 Index ri("a"); 128 const Category cat("a", &ri); 129 REQUIRE_FALSE(ri.addCategory(&cat)); 130 131 REQUIRE(ri.categories().empty()); 132 } 133 134 TEST_CASE("add a package", M) { 135 Index ri("a"); 136 Category cat("a", &ri); 137 Package *pack = new Package(Package::ScriptType, "name", &cat); 138 Version *ver = new Version("1", pack); 139 ver->addSource(new Source({}, "google.com", ver)); 140 pack->addVersion(ver); 141 142 CHECK(cat.packages().size() == 0); 143 CHECK(cat.package("name") == nullptr); 144 145 REQUIRE(cat.addPackage(pack)); 146 147 REQUIRE(cat.packages().size() == 1); 148 REQUIRE(cat.package("name") == pack); 149 REQUIRE(pack->category() == &cat); 150 } 151 152 TEST_CASE("add owned package", M) { 153 Category cat1("a", nullptr); 154 Package *pack = new Package(Package::ScriptType, "name", &cat1); 155 156 try { 157 Category cat2("b", nullptr); 158 cat2.addPackage(pack); 159 FAIL(); 160 } 161 catch(const reapack_error &e) { 162 delete pack; 163 REQUIRE(std::string{e.what()} == "package belongs to another category"); 164 } 165 } 166 167 TEST_CASE("drop empty package", M) { 168 Category cat("a", nullptr); 169 const Package pkg(Package::ScriptType, "name", &cat); 170 REQUIRE_FALSE(cat.addPackage(&pkg)); 171 REQUIRE(cat.packages().empty()); 172 } 173 174 TEST_CASE("drop unknown package", M) { 175 Category cat("a", nullptr); 176 const Package pkg(Package::UnknownType, "name", &cat); 177 REQUIRE_FALSE(cat.addPackage(&pkg)); 178 REQUIRE(cat.packages().size() == 0); 179 } 180 181 TEST_CASE("empty category name", M) { 182 try { 183 Category cat{{}, nullptr}; 184 FAIL(); 185 } 186 catch(const reapack_error &e) { 187 REQUIRE(std::string{e.what()} == "empty category name"); 188 } 189 } 190 191 TEST_CASE("category full name", M) { 192 Index ri("Remote Name"); 193 Category cat2("Category Name", &ri); 194 REQUIRE(cat2.fullName() == "Remote Name/Category Name"); 195 } 196 197 TEST_CASE("set index name", M) { 198 SECTION("set") { 199 Index ri({}); 200 ri.setName("Hello/World!"); 201 REQUIRE(ri.name() == "Hello/World!"); 202 } 203 204 SECTION("override") { 205 Index ri("hello"); 206 try { 207 ri.setName("world"); 208 FAIL(); 209 } 210 catch(const reapack_error &e) { 211 REQUIRE(std::string{e.what()} == "index name is already set"); 212 } 213 REQUIRE(ri.name() == "hello"); 214 } 215 } 216 217 TEST_CASE("find package", M) { 218 Index ri("index name"); 219 Category *cat = new Category("cat", &ri); 220 Package *pack = new Package(Package::ScriptType, "pkg", cat); 221 Version *ver = new Version("1", pack); 222 Source *source = new Source({}, "google.com", ver); 223 224 ver->addSource(source); 225 pack->addVersion(ver); 226 cat->addPackage(pack); 227 ri.addCategory(cat); 228 229 REQUIRE(ri.find("a", "b") == nullptr); 230 REQUIRE(ri.find("cat", "b") == nullptr); 231 REQUIRE(ri.find("cat", "pkg") == pack); 232 }