reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

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 }