reapack

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

registry.cpp (5638B)


      1 #include "helper.hpp"
      2 
      3 #include <registry.hpp>
      4 
      5 #include <errors.hpp>
      6 #include <index.hpp>
      7 #include <package.hpp>
      8 #include <remote.hpp>
      9 
     10 static const char *M = "[registry]";
     11 
     12 #define MAKE_PACKAGE \
     13   Index ri("Remote Name"); \
     14   Category cat("Category Name", &ri); \
     15   Package pkg(Package::ScriptType, "Hello", &cat); \
     16   pkg.setDescription("Hello World"); \
     17   Version ver("1.0", &pkg); \
     18   ver.setAuthor("John Doe"); \
     19   Source *src = new Source("file", "url", &ver); \
     20   ver.addSource(src);
     21 
     22 TEST_CASE("query uninstalled package", M) {
     23   MAKE_PACKAGE
     24 
     25   Registry reg;
     26 
     27   const Registry::Entry &entry = reg.getEntry(&pkg);
     28   REQUIRE_FALSE(entry);
     29   REQUIRE(entry.id == 0);
     30   REQUIRE(entry.version == VersionName());
     31 }
     32 
     33 TEST_CASE("query installed package", M) {
     34   MAKE_PACKAGE
     35 
     36   Registry reg;
     37 
     38   const Registry::Entry &entry = reg.push(&ver, 2);
     39   REQUIRE(entry);
     40   REQUIRE(entry.id == 1);
     41   REQUIRE(entry.remote == "Remote Name");
     42   REQUIRE(entry.category == "Category Name");
     43   REQUIRE(entry.package == "Hello");
     44   REQUIRE(entry.type == Package::ScriptType);
     45   REQUIRE(entry.version.toString() == "1.0");
     46   REQUIRE(entry.author == "John Doe");
     47   REQUIRE(entry.flags == 2);
     48 
     49   const Registry::Entry &selectEntry = reg.getEntry(&pkg);
     50   REQUIRE(selectEntry.id == entry.id);
     51   REQUIRE(selectEntry.remote == entry.remote);
     52   REQUIRE(selectEntry.category == entry.category);
     53   REQUIRE(selectEntry.package == entry.package);
     54   REQUIRE(selectEntry.description == entry.description);
     55   REQUIRE(selectEntry.type == entry.type);
     56   REQUIRE(selectEntry.version == entry.version);
     57   REQUIRE(selectEntry.author == entry.author);
     58   REQUIRE(selectEntry.flags == entry.flags);
     59 }
     60 
     61 TEST_CASE("bump version", M) {
     62   MAKE_PACKAGE
     63 
     64   Version ver2("2.0", &pkg);
     65   ver2.addSource(new Source("file", "url", &ver2));
     66 
     67   Registry reg;
     68   reg.push(&ver, 1);
     69 
     70   const Registry::Entry &entry1 = reg.getEntry(&pkg);
     71   REQUIRE(entry1.version.toString() == "1.0");
     72   CHECK(entry1.author == "John Doe");
     73   CHECK(entry1.flags == 1);
     74 
     75   reg.push(&ver2, 2);
     76   const Registry::Entry &entry2 = reg.getEntry(&pkg);
     77   REQUIRE(entry2.version.toString() == "2.0");
     78   CHECK(entry2.author == "");
     79   REQUIRE(entry2.flags == 2);
     80   
     81   REQUIRE(entry2.id == entry1.id);
     82 }
     83 
     84 TEST_CASE("get file list", M) {
     85   MAKE_PACKAGE
     86 
     87   Registry reg;
     88   REQUIRE(reg.getFiles(reg.getEntry(&pkg)).empty());
     89 
     90   reg.push(&ver);
     91 
     92   const std::vector<Registry::File> &files = reg.getFiles(reg.getEntry(&pkg));
     93   REQUIRE(files.size() == 1);
     94   REQUIRE(files[0].path == src->targetPath());
     95   REQUIRE(files[0].sections == 0);
     96   REQUIRE(files[0].type == pkg.type());
     97 }
     98 
     99 TEST_CASE("query all packages", M) {
    100   MAKE_PACKAGE
    101 
    102   const std::string remote = "Remote Name";
    103 
    104   Registry reg;
    105   REQUIRE(reg.getEntries(remote).empty());
    106 
    107   reg.push(&ver);
    108 
    109   const std::vector<Registry::Entry> &entries = reg.getEntries(remote);
    110   REQUIRE(entries.size() == 1);
    111   REQUIRE(entries[0].id == 1);
    112   REQUIRE(entries[0].remote == "Remote Name");
    113   REQUIRE(entries[0].category == "Category Name");
    114   REQUIRE(entries[0].package == "Hello");
    115   REQUIRE(entries[0].type == Package::ScriptType);
    116   REQUIRE(entries[0].version.toString() == "1.0");
    117   REQUIRE(entries[0].author == "John Doe");
    118 }
    119 
    120 TEST_CASE("forget registry entry", M) {
    121   MAKE_PACKAGE
    122 
    123   Registry reg;
    124   reg.forget(reg.push(&ver));
    125 
    126   const Registry::Entry &afterForget = reg.getEntry(&pkg);
    127   REQUIRE(afterForget.id == 0); // uninstalled
    128 }
    129 
    130 TEST_CASE("file conflicts", M) {
    131   Registry reg;
    132 
    133   {
    134     MAKE_PACKAGE
    135     reg.push(&ver);
    136   }
    137 
    138   Index ri("Remote Name");
    139   Category cat("Category Name", &ri);
    140   Package pkg(Package::ScriptType, "Duplicate Package", &cat);
    141   Version ver("1.0", &pkg);
    142   Source *src1 = new Source("file", "url", &ver);
    143   ver.addSource(src1);
    144   Source *src2 = new Source("file2", "url", &ver);
    145   ver.addSource(src2);
    146 
    147   CHECK(reg.getEntry(&pkg).id == 0); // uninstalled
    148 
    149   try {
    150     reg.push(&ver);
    151     FAIL("duplicate is accepted");
    152   }
    153   catch(const reapack_error &) {}
    154 
    155   CHECK(reg.getEntry(&pkg).id == 0); // still uninstalled
    156 
    157   std::vector<Path> conflicts;
    158   const auto &pushResult = reg.push(&ver, 0, &conflicts);
    159   CHECK(pushResult.id == 0);
    160 
    161   REQUIRE(conflicts.size() == 1);
    162   REQUIRE(conflicts[0] == src1->targetPath());
    163 
    164   REQUIRE(reg.getEntry(&pkg).id == 0); // never installed
    165 }
    166 
    167 TEST_CASE("get main files", M) {
    168   MAKE_PACKAGE
    169 
    170   Registry reg;
    171   REQUIRE(reg.getMainFiles({}).empty());
    172 
    173   Source *main1 = new Source({}, "url", &ver);
    174   main1->setSections(Source::MIDIEditorSection);
    175   main1->setTypeOverride(Package::EffectType);
    176   ver.addSource(main1);
    177 
    178   Source *main2 = new Source({}, "url", &ver); // duplicate file ignored
    179   main2->setSections(Source::MainSection);
    180   main2->setTypeOverride(Package::EffectType);
    181   ver.addSource(main2);
    182 
    183   const Registry::Entry &entry = reg.push(&ver);
    184 
    185   const std::vector<Registry::File> &current = reg.getMainFiles(entry);
    186   REQUIRE(current.size() == 1);
    187   REQUIRE(current[0].path == main1->targetPath());
    188   REQUIRE(current[0].sections == Source::MIDIEditorSection);
    189   REQUIRE(current[0].type == Package::EffectType);
    190 }
    191 
    192 TEST_CASE("registry entry flags", M) {
    193   MAKE_PACKAGE
    194 
    195   Registry reg;
    196   reg.push(&ver);
    197 
    198   const Registry::Entry &entry = reg.getEntry(&pkg);
    199   REQUIRE(entry.flags == 0);
    200 
    201   reg.setFlags(entry, 2);
    202   REQUIRE(reg.getEntry(&pkg).flags == 2);
    203   REQUIRE(reg.getEntries(ri.name())[0].flags == 2);
    204 
    205   reg.setFlags(entry, 0);
    206   REQUIRE(reg.getEntry(&pkg).flags == 0);
    207 }
    208 
    209 TEST_CASE("get file owner", M) {
    210   MAKE_PACKAGE
    211 
    212   Registry reg;
    213   REQUIRE_FALSE(reg.getOwner({}));
    214 
    215   const Registry::Entry &entry = reg.push(&ver);
    216   REQUIRE(reg.getOwner(src->targetPath()) == entry);
    217 }