version.cpp (8296B)
1 #include "helper.hpp" 2 3 #include <version.hpp> 4 5 #include <errors.hpp> 6 #include <index.hpp> 7 #include <package.hpp> 8 9 #include <sstream> 10 11 #define MAKE_PACKAGE \ 12 Index ri("Index Name"); \ 13 Category cat("Category Name", &ri); \ 14 Package pkg(Package::ScriptType, "Package Name", &cat); \ 15 16 static const char *M = "[version]"; 17 18 TEST_CASE("construct null version", M) { 19 const VersionName ver; 20 21 REQUIRE(ver.size() == 0); 22 REQUIRE(ver.isStable()); 23 } 24 25 TEST_CASE("compare null versions", M) { 26 REQUIRE(VersionName("0-beta") > VersionName()); 27 REQUIRE(VersionName("0") > VersionName()); 28 REQUIRE(VersionName("0") != VersionName()); 29 REQUIRE(VersionName() == VersionName()); 30 } 31 32 TEST_CASE("parse valid versions", M) { 33 VersionName ver; 34 35 SECTION("valid") { 36 ver.parse("1.0.1"); 37 REQUIRE(ver.toString() == "1.0.1"); 38 REQUIRE(ver.size() == 3); 39 } 40 41 SECTION("prerelease set/unset") { 42 ver.parse("1.0beta"); 43 REQUIRE_FALSE(ver.isStable()); 44 ver.parse("1.0"); 45 REQUIRE(ver.isStable()); 46 } 47 48 SECTION("equal to a null version") { 49 ver.parse("0"); 50 } 51 } 52 53 TEST_CASE("parse invalid versions", M) { 54 VersionName ver; 55 std::string name; 56 57 SECTION("only letters") 58 name = "hello"; 59 60 SECTION("leading letter") 61 name = "v1.0"; 62 63 SECTION("empty") 64 name = {}; 65 66 try { 67 ver.parse(name); 68 FAIL("'" + name + "' was accepted"); 69 } 70 catch(const reapack_error &e) { 71 REQUIRE(std::string{e.what()} == "invalid version name '" + name + "'"); 72 } 73 74 REQUIRE(ver.toString().empty()); 75 REQUIRE(ver.size() == 0); 76 } 77 78 TEST_CASE("parse version failsafe", M) { 79 VersionName ver; 80 81 SECTION("valid") { 82 REQUIRE(ver.tryParse("1.0")); 83 84 REQUIRE(ver.toString() == "1.0"); 85 REQUIRE(ver.size() == 2); 86 } 87 88 SECTION("invalid") { 89 REQUIRE_FALSE(ver.tryParse("hello")); 90 91 std::string error; 92 REQUIRE_FALSE(ver.tryParse("world", &error)); 93 94 REQUIRE(ver.toString().empty()); 95 REQUIRE(ver.size() == 0); 96 REQUIRE(error == "invalid version name 'world'"); 97 } 98 } 99 100 TEST_CASE("decimal version", M) { 101 VersionName ver("5.05"); 102 REQUIRE(ver == VersionName("5.5")); 103 REQUIRE(ver < VersionName("5.50")); 104 } 105 106 TEST_CASE("5 version segments", M) { 107 REQUIRE(VersionName("1.1.1.1.0") < VersionName("1.1.1.1.1")); 108 REQUIRE(VersionName("1.1.1.1.1") == VersionName("1.1.1.1.1")); 109 REQUIRE(VersionName("1.1.1.1.1") < VersionName("1.1.1.1.2")); 110 REQUIRE(VersionName("1.1.1.1.1") < VersionName("1.1.1.2.0")); 111 } 112 113 TEST_CASE("version segment overflow", M) { 114 try { 115 VersionName ver("9999999999999999999999"); 116 FAIL(); 117 } 118 catch(const reapack_error &e) { 119 REQUIRE(std::string{e.what()} == "version segment overflow in '9999999999999999999999'"); 120 } 121 } 122 123 TEST_CASE("compare versions", M) { 124 SECTION("equality") { 125 REQUIRE(VersionName("1.0").compare({"1.0"}) == 0); 126 127 REQUIRE(VersionName("1.0") == VersionName("1.0")); 128 REQUIRE_FALSE(VersionName("1.0") == VersionName("1.1")); 129 } 130 131 SECTION("inequality") { 132 REQUIRE_FALSE(VersionName("1.0") != VersionName("1.0")); 133 REQUIRE(VersionName("1.0") != VersionName("1.1")); 134 } 135 136 SECTION("less than") { 137 REQUIRE(VersionName("1.0").compare({"1.1"}) == -1); 138 139 REQUIRE(VersionName("1.0") < VersionName("1.1")); 140 REQUIRE_FALSE(VersionName("1.0") < VersionName("1.0")); 141 REQUIRE_FALSE(VersionName("1.1") < VersionName("1.0")); 142 } 143 144 SECTION("less than or equal") { 145 REQUIRE(VersionName("1.0") <= VersionName("1.1")); 146 REQUIRE(VersionName("1.0") <= VersionName("1.0")); 147 REQUIRE_FALSE(VersionName("1.1") <= VersionName("1.0")); 148 } 149 150 SECTION("greater than") { 151 REQUIRE(VersionName("1.1").compare({"1.0"}) == 1); 152 153 REQUIRE_FALSE(VersionName("1.0") > VersionName("1.1")); 154 REQUIRE_FALSE(VersionName("1.0") > VersionName("1.0")); 155 REQUIRE(VersionName("1.1") > VersionName("1.0")); 156 } 157 158 SECTION("greater than or equal") { 159 REQUIRE_FALSE(VersionName("1.0") >= VersionName("1.1")); 160 REQUIRE(VersionName("1.0") >= VersionName("1.0")); 161 REQUIRE(VersionName("1.1") >= VersionName("1.0")); 162 } 163 } 164 165 TEST_CASE("compare versions with more or less segments", M) { 166 REQUIRE(VersionName("1") == VersionName("1.0.0.0")); 167 REQUIRE(VersionName("1") != VersionName("1.0.0.1")); 168 169 REQUIRE(VersionName("1.0.0.0") == VersionName("1")); 170 REQUIRE(VersionName("1.0.0.1") != VersionName("1")); 171 } 172 173 TEST_CASE("prerelease versions", M) { 174 SECTION("detect") { 175 REQUIRE(VersionName("1.0").isStable()); 176 REQUIRE_FALSE(VersionName("1.0b").isStable()); 177 REQUIRE_FALSE(VersionName("1.0-beta").isStable()); 178 REQUIRE_FALSE(VersionName("1.0-beta1").isStable()); 179 } 180 181 SECTION("compare") { 182 REQUIRE(VersionName("0.9") < VersionName("1.0a")); 183 REQUIRE(VersionName("1.0a.2") < VersionName("1.0b.1")); 184 REQUIRE(VersionName("1.0-beta1") < VersionName("1.0")); 185 186 REQUIRE(VersionName("1.0b") < VersionName("1.0.1")); 187 REQUIRE(VersionName("1.0.1") > VersionName("1.0b")); 188 } 189 } 190 191 TEST_CASE("copy version constructor", M) { 192 const VersionName original("1.1test"); 193 const VersionName copy(original); 194 195 REQUIRE(copy.toString() == "1.1test"); 196 REQUIRE(copy.size() == original.size()); 197 REQUIRE(copy.isStable() == original.isStable()); 198 } 199 200 TEST_CASE("version full name", M) { 201 MAKE_PACKAGE; 202 203 Version ver("1.0", &pkg); 204 REQUIRE(ver.fullName() == "Index Name/Category Name/Package Name v1.0"); 205 } 206 207 TEST_CASE("add source", M) { 208 MAKE_PACKAGE; 209 210 Version ver("1.0", &pkg); 211 CHECK(ver.sources().size() == 0); 212 213 Source *src = new Source("a", "b", &ver); 214 REQUIRE(ver.addSource(src)); 215 216 CHECK(ver.sources().size() == 1); 217 REQUIRE(ver.source(0) == src); 218 } 219 220 TEST_CASE("add owned source", M) { 221 Version ver1("1", nullptr); 222 Version ver2("1", nullptr); 223 Source *src = new Source("a", "b", &ver2); 224 225 try { 226 ver1.addSource(src); 227 FAIL(); 228 } 229 catch(const reapack_error &e) { 230 delete src; 231 REQUIRE(std::string{e.what()} == "source belongs to another version"); 232 } 233 } 234 235 TEST_CASE("duplicate sources", M) { 236 MAKE_PACKAGE; 237 Version ver("1.0", &pkg); 238 239 Source *src = new Source({}, "b", &ver); 240 CHECK(ver.addSource(src) == true); 241 REQUIRE(ver.addSource(src) == false); 242 243 REQUIRE(ver.sources().size() == 1); 244 REQUIRE(ver.source(0) == src); 245 } 246 247 TEST_CASE("list files", M) { 248 MAKE_PACKAGE; 249 Version ver("1.0", &pkg); 250 251 Source *src1 = new Source("file", "url", &ver); 252 ver.addSource(src1); 253 254 Path path1; 255 path1.append("Scripts"); 256 path1.append("Index Name"); 257 path1.append("Category Name"); 258 path1.append("file"); 259 260 const std::set<Path> expected{path1}; 261 REQUIRE(ver.files() == expected); 262 } 263 264 TEST_CASE("drop sources for unknown platforms", M) { 265 MAKE_PACKAGE; 266 Version ver("1.0", &pkg); 267 Source src("a", "b", &ver); 268 src.setPlatform(Platform::Unknown); 269 REQUIRE_FALSE(ver.addSource(&src)); 270 REQUIRE(ver.sources().size() == 0); 271 } 272 273 TEST_CASE("version author", M) { 274 Version ver("1.0", nullptr); 275 CHECK(ver.author().empty()); 276 REQUIRE(ver.displayAuthor() == "Unknown"); 277 278 ver.setAuthor("cfillion"); 279 REQUIRE(ver.author() == "cfillion"); 280 REQUIRE(ver.displayAuthor() == ver.author()); 281 282 REQUIRE(Version::displayAuthor({}) == "Unknown"); 283 REQUIRE(Version::displayAuthor("cfillion") == "cfillion"); 284 } 285 286 TEST_CASE("version date", M) { 287 Version ver("1.0", nullptr); 288 289 ver.setTime("2016-02-12T01:16:40Z"); 290 REQUIRE(ver.time().year() == 2016); 291 292 ver.setTime("hello world"); 293 REQUIRE(ver.time().year() == 2016); 294 } 295 296 TEST_CASE("output version", M) { 297 std::ostringstream stream; 298 Version ver("1.2.3", nullptr); 299 300 SECTION("empty version") { 301 stream << ver; 302 REQUIRE(stream.str() == "v1.2.3\r\n No changelog"); 303 } 304 305 SECTION("with author") { 306 ver.setAuthor("Hello World"); 307 stream << ver; 308 REQUIRE(stream.str() == "v1.2.3 by Hello World\r\n No changelog"); 309 } 310 311 SECTION("with time") { 312 ver.setTime("2016-01-02T00:42:11Z"); 313 stream << ver; 314 REQUIRE(stream.str() == "v1.2.3 – January 02 2016\r\n No changelog"); 315 } 316 317 SECTION("with changelog") { 318 ver.setChangelog("+ added super cool feature\n+ fixed all the bugs!"); 319 stream << ver; 320 REQUIRE(stream.str() == "v1.2.3\r\n + added super cool feature\r\n + fixed all the bugs!"); 321 } 322 323 SECTION("changelog with empty lines") { 324 ver.setChangelog("line1\n\nline2"); 325 stream << ver; // no crash! 326 REQUIRE(stream.str() == "v1.2.3\r\n line1\r\n\r\n line2"); 327 } 328 }