commit ec321a25f2f718b3b79a9b6e0d8e8adf1cde9d62
parent 85b3a3babb9df08f31d79c5539321e331b96fed4
Author: cfillion <cfillion@users.noreply.github.com>
Date: Wed, 2 Dec 2015 00:21:11 -0500
fix a memory leak preventing the database from being unloaded
Diffstat:
15 files changed, 223 insertions(+), 153 deletions(-)
diff --git a/src/database.cpp b/src/database.cpp
@@ -4,7 +4,7 @@
#include <WDL/tinyxml/tinyxml.h>
-DatabasePtr Database::load(const char *file)
+Database *Database::load(const char *file)
{
TiXmlDocument doc(file);
@@ -31,11 +31,18 @@ DatabasePtr Database::load(const char *file)
}
}
-void Database::addCategory(CategoryPtr cat)
+Database::~Database()
+{
+ for(Category *cat : m_categories)
+ delete cat;
+}
+
+void Database::addCategory(Category *cat)
{
if(cat->packages().empty())
return;
+ cat->setDatabase(this);
m_categories.push_back(cat);
m_packages.insert(m_packages.end(),
@@ -49,13 +56,19 @@ Category::Category(const std::string &name)
throw reapack_error("empty category name");
}
-void Category::addPackage(PackagePtr pack)
+Category::~Category()
+{
+ for(Package *pack : m_packages)
+ delete pack;
+}
+
+void Category::addPackage(Package *pack)
{
if(pack->type() == Package::UnknownType)
return; // silently discard unknown package types
else if(pack->versions().empty())
return;
- pack->setCategory(shared_from_this());
+ pack->setCategory(this);
m_packages.push_back(pack);
}
diff --git a/src/database.hpp b/src/database.hpp
@@ -9,42 +9,46 @@
class TiXmlElement;
-class Database;
-typedef std::shared_ptr<Database> DatabasePtr;
-
class Category;
-typedef std::shared_ptr<Category> CategoryPtr;
class Database {
public:
- static DatabasePtr load(const char *);
+ static Database *load(const char *);
+
+ ~Database();
- void addCategory(CategoryPtr cat);
- const std::vector<CategoryPtr> &categories() const { return m_categories; }
- CategoryPtr category(const int i) const { return m_categories[i]; }
+ void addCategory(Category *cat);
+ const std::vector<Category *> &categories() const { return m_categories; }
+ Category *category(const int i) const { return m_categories[i]; }
- const std::vector<PackagePtr> &packages() const { return m_packages; }
+ const std::vector<Package *> &packages() const { return m_packages; }
private:
- static DatabasePtr loadV1(TiXmlElement *);
+ static Database *loadV1(TiXmlElement *);
- std::vector<CategoryPtr> m_categories;
- std::vector<PackagePtr> m_packages;
+ std::vector<Category *> m_categories;
+ std::vector<Package *> m_packages;
};
-class Category : public std::enable_shared_from_this<Category> {
+class Category {
public:
Category(const std::string &name);
+ ~Category();
const std::string &name() const { return m_name; }
- void addPackage(PackagePtr pack);
- const std::vector<PackagePtr> &packages() const { return m_packages; }
- PackagePtr package(const int i) const { return m_packages[i]; }
+ void setDatabase(Database *db) { m_database = db; }
+ Database *database() const { return m_database; }
+
+ void addPackage(Package *pack);
+ const std::vector<Package *> &packages() const { return m_packages; }
+ Package *package(const int i) const { return m_packages[i]; }
private:
+ Database *m_database;
+
std::string m_name;
- std::vector<PackagePtr> m_packages;
+ std::vector<Package *> m_packages;
};
#endif
diff --git a/src/database_v1.cpp b/src/database_v1.cpp
@@ -4,15 +4,21 @@
#include <WDL/tinyxml/tinyxml.h>
+#include <memory>
+
using namespace std;
-static CategoryPtr LoadCategoryV1(TiXmlElement *);
-static PackagePtr LoadPackageV1(TiXmlElement *);
-static VersionPtr LoadVersionV1(TiXmlElement *);
+static Category *LoadCategoryV1(TiXmlElement *);
+static Package *LoadPackageV1(TiXmlElement *);
+static Version *LoadVersionV1(TiXmlElement *);
-DatabasePtr Database::loadV1(TiXmlElement *root)
+Database *Database::loadV1(TiXmlElement *root)
{
- DatabasePtr db = make_shared<Database>();
+ Database *db = new Database;
+
+ // ensure the memory is released if an exception is
+ // thrown during the loading process
+ unique_ptr<Database> ptr(db);
TiXmlElement *catNode = root->FirstChildElement("category");
@@ -22,15 +28,17 @@ DatabasePtr Database::loadV1(TiXmlElement *root)
catNode = catNode->NextSiblingElement("category");
}
+ ptr.release();
return db;
}
-CategoryPtr LoadCategoryV1(TiXmlElement *catNode)
+Category *LoadCategoryV1(TiXmlElement *catNode)
{
const char *name = catNode->Attribute("name");
if(!name) name = "";
- CategoryPtr cat = make_shared<Category>(name);
+ Category *cat = new Category(name);
+ unique_ptr<Category> ptr(cat);
TiXmlElement *packNode = catNode->FirstChildElement("reapack");
@@ -40,10 +48,11 @@ CategoryPtr LoadCategoryV1(TiXmlElement *catNode)
packNode = packNode->NextSiblingElement("reapack");
}
+ ptr.release();
return cat;
}
-PackagePtr LoadPackageV1(TiXmlElement *packNode)
+Package *LoadPackageV1(TiXmlElement *packNode)
{
const char *type = packNode->Attribute("type");
if(!type) type = "";
@@ -51,7 +60,8 @@ PackagePtr LoadPackageV1(TiXmlElement *packNode)
const char *name = packNode->Attribute("name");
if(!name) name = "";
- PackagePtr pack = make_shared<Package>(Package::convertType(type), name);
+ Package *pack = new Package(Package::convertType(type), name);
+ unique_ptr<Package> ptr(pack);
TiXmlElement *verNode = packNode->FirstChildElement("version");
@@ -61,15 +71,17 @@ PackagePtr LoadPackageV1(TiXmlElement *packNode)
verNode = verNode->NextSiblingElement("version");
}
+ ptr.release();
return pack;
}
-VersionPtr LoadVersionV1(TiXmlElement *verNode)
+Version *LoadVersionV1(TiXmlElement *verNode)
{
const char *name = verNode->Attribute("name");
if(!name) name = "";
- VersionPtr ver = make_shared<Version>(name);
+ Version *ver = new Version(name);
+ unique_ptr<Version> ptr(ver);
TiXmlElement *node = verNode->FirstChildElement("source");
@@ -80,7 +92,7 @@ VersionPtr LoadVersionV1(TiXmlElement *verNode)
const char *url = node->GetText();
if(!url) url = "";
- ver->addSource(make_shared<Source>(Source::convertPlatform(platform), url));
+ ver->addSource(new Source(Source::convertPlatform(platform), url));
node = node->NextSiblingElement("source");
}
@@ -94,5 +106,6 @@ VersionPtr LoadVersionV1(TiXmlElement *verNode)
ver->setChangelog(changelog);
}
+ ptr.release();
return ver;
}
diff --git a/src/download.cpp b/src/download.cpp
@@ -10,8 +10,8 @@ vector<Download *> Download::s_active;
static const int DOWNLOAD_TIMEOUT = 5;
-Download::Download(const std::string &url)
- : m_threadHandle(0), m_url(url)
+Download::Download(const std::string &name, const std::string &url)
+ : m_threadHandle(0), m_name(name), m_url(url)
{
reset();
}
@@ -179,7 +179,7 @@ void Download::execCallbacks()
}
for(DownloadCallback callback : m_callback)
- callback(m_status, m_contents);
+ callback(this);
}
bool Download::isFinished()
@@ -214,14 +214,15 @@ DownloadQueue::~DownloadQueue()
}
}
-void DownloadQueue::push(const std::string &url, DownloadCallback cb)
+void DownloadQueue::push(const string &name,
+ const string &url, DownloadCallback cb)
{
- Download *download = new Download(url);
+ Download *download = new Download(name, url);
download->addCallback(cb);
- download->addCallback([=](const int, const string &) {
+ download->addCallback([=](Download *dl) {
m_queue.pop();
- delete download;
+ delete dl;
if(!m_queue.empty())
m_queue.front()->start();
diff --git a/src/download.hpp b/src/download.hpp
@@ -10,14 +10,18 @@
#include <reaper_plugin.h>
-typedef std::function<void(int, const std::string &)> DownloadCallback;
+class Download;
+typedef std::function<void(Download *)> DownloadCallback;
class Download {
public:
- Download(const std::string &url);
+ Download(const std::string &name, const std::string &url);
~Download();
+ const std::string &name() const { return m_name; }
const std::string &url() const { return m_url; }
+ int status() const { return m_status; }
+ const std::string &contents() const { return m_contents; }
bool isFinished();
bool isAborted();
@@ -45,6 +49,7 @@ private:
int m_status;
std::string m_contents;
+ std::string m_name;
std::string m_url;
std::vector<DownloadCallback> m_callback;
@@ -55,7 +60,8 @@ class DownloadQueue {
public:
~DownloadQueue();
- void push(const std::string &url, DownloadCallback);
+ void push(const std::string &name, const std::string &url, DownloadCallback);
+ int size() const { return m_queue.size(); }
private:
std::queue<Download *> m_queue;
diff --git a/src/package.cpp b/src/package.cpp
@@ -18,7 +18,13 @@ Package::Package(const Type type, const std::string &name)
throw reapack_error("empty package name");
}
-void Package::addVersion(VersionPtr ver)
+Package::~Package()
+{
+ for(Version *ver : m_versions)
+ delete ver;
+}
+
+void Package::addVersion(Version *ver)
{
if(ver->sources().empty())
return;
@@ -26,7 +32,7 @@ void Package::addVersion(VersionPtr ver)
m_versions.insert(ver);
}
-VersionPtr Package::version(const int index) const
+Version *Package::version(const int index) const
{
auto it = m_versions.begin();
@@ -36,7 +42,7 @@ VersionPtr Package::version(const int index) const
return *it;
}
-VersionPtr Package::lastVersion() const
+Version *Package::lastVersion() const
{
return *prev(m_versions.end());
}
@@ -58,10 +64,10 @@ Path Package::scriptLocation() const
path.append("Scripts");
path.append("ReaScripts");
- if(category())
- path.append(category()->name());
+ if(m_category)
+ path.append(m_category->name());
- path.append(name());
+ path.append(m_name);
return path;
}
diff --git a/src/package.hpp b/src/package.hpp
@@ -4,11 +4,8 @@
#include "path.hpp"
#include "version.hpp"
-class Package;
-typedef std::shared_ptr<Package> PackagePtr;
-
class Category;
-typedef std::shared_ptr<Category> CategoryPtr;
+class Database;
class Package {
public:
@@ -20,24 +17,26 @@ public:
static Type convertType(const char *);
Package(const Type, const std::string &name);
+ ~Package();
- void setCategory(CategoryPtr cat) { m_category = cat; }
- CategoryPtr category() const { return m_category; }
+ void setCategory(Category *cat) { m_category = cat; }
+ Category *category() const { return m_category; }
Type type() const { return m_type; }
const std::string &name() const { return m_name; }
- void addVersion(VersionPtr ver);
+ void addVersion(Version *ver);
const VersionSet &versions() const { return m_versions; }
- VersionPtr version(const int i) const;
- VersionPtr lastVersion() const;
+ Version *version(const int i) const;
+ Version *lastVersion() const;
Path targetLocation() const;
private:
Path scriptLocation() const;
- CategoryPtr m_category;
+ Category *m_category;
+
Type m_type;
std::string m_name;
VersionSet m_versions;
diff --git a/src/reapack.cpp b/src/reapack.cpp
@@ -68,9 +68,9 @@ void ReaPack::synchronizeAll()
void ReaPack::synchronize(const Repository &repo)
{
- m_downloadQueue.push(repo.url(), [=](const int code, const string &data) {
- if(code != 200) {
- ShowMessageBox(data.c_str(), repo.name().c_str(), 0);
+ m_downloadQueue.push(repo.name(), repo.url(), [=](Download *dl) {
+ if(dl->status() != 200) {
+ ShowMessageBox(dl->contents().c_str(), repo.name().c_str(), 0);
return;
}
@@ -82,14 +82,14 @@ void ReaPack::synchronize(const Repository &repo)
return;
}
- file << data;
+ file << dl->contents();
file.close();
synchronize(Database::load(path.cjoin()));
});
}
-void ReaPack::synchronize(DatabasePtr database)
+void ReaPack::synchronize(Database *database)
{
if(database->packages().empty()) {
ShowMessageBox("The package database is empty, nothing to do!",
@@ -98,7 +98,7 @@ void ReaPack::synchronize(DatabasePtr database)
return;
}
- for(PackagePtr pkg : database->packages()) {
+ for(Package *pkg : database->packages()) {
try {
installPackage(pkg);
}
@@ -108,13 +108,16 @@ void ReaPack::synchronize(DatabasePtr database)
}
}
-void ReaPack::installPackage(PackagePtr pkg)
+void ReaPack::installPackage(Package *pkg)
{
const std::string &url = pkg->lastVersion()->source(0)->url();
- m_downloadQueue.push(url, [=](const int code, const string &data) {
- if(code != 200) {
- ShowMessageBox(data.c_str(), pkg->name().c_str(), 0);
+ m_downloadQueue.push(pkg->name(), url, [=](Download *dl) {
+ if(m_downloadQueue.size() == 1)
+ delete pkg->category()->database();
+
+ if(dl->status() != 200) {
+ ShowMessageBox(dl->contents().c_str(), dl->name().c_str(), 0);
return;
}
@@ -123,11 +126,11 @@ void ReaPack::installPackage(PackagePtr pkg)
ofstream file(path.join());
if(file.bad()) {
- ShowMessageBox(strerror(errno), pkg->name().c_str(), 0);
+ ShowMessageBox(strerror(errno), dl->name().c_str(), 0);
return;
}
- file << data;
+ file << dl->contents();
file.close();
});
}
diff --git a/src/reapack.hpp b/src/reapack.hpp
@@ -25,8 +25,8 @@ public:
void synchronizeAll();
void synchronize(const Repository &);
- void synchronize(DatabasePtr);
- void installPackage(PackagePtr);
+ void synchronize(Database *);
+ void installPackage(Package *);
private:
std::map<int, ActionCallback> m_actions;
diff --git a/src/version.cpp b/src/version.cpp
@@ -31,7 +31,13 @@ Version::Version(const std::string &str)
}
}
-void Version::addSource(SourcePtr source)
+Version::~Version()
+{
+ for(Source *source : m_sources)
+ delete source;
+}
+
+void Version::addSource(Source *source)
{
const Source::Platform p = source->platform();
@@ -67,7 +73,7 @@ void Version::setChangelog(const std::string &changelog)
m_changelog = changelog;
}
-bool Version::operator<(const Version &o)
+bool Version::operator<(const Version &o) const
{
return m_code < o.code();
}
diff --git a/src/version.hpp b/src/version.hpp
@@ -5,15 +5,12 @@
#include <string>
#include <vector>
-class Version;
-typedef std::shared_ptr<Version> VersionPtr;
-
class Source;
-typedef std::shared_ptr<Source> SourcePtr;
class Version {
public:
Version(const std::string &);
+ ~Version();
const std::string &name() const { return m_name; }
unsigned long code() const { return m_code; }
@@ -21,29 +18,29 @@ public:
void setChangelog(const std::string &);
const std::string &changelog() const { return m_changelog; }
- void addSource(SourcePtr source);
- const std::vector<SourcePtr> &sources() const { return m_sources; }
- SourcePtr source(const int i) const { return m_sources[i]; }
+ void addSource(Source *source);
+ const std::vector<Source *> &sources() const { return m_sources; }
+ Source *source(const int i) const { return m_sources[i]; }
- bool operator<(const Version &);
+ bool operator<(const Version &) const;
private:
std::string m_name;
unsigned long m_code;
std::string m_changelog;
- std::vector<SourcePtr> m_sources;
+ std::vector<Source *> m_sources;
};
class VersionCompare {
public:
- constexpr bool operator() (const VersionPtr &l, const VersionPtr &r) const
+ constexpr bool operator()(const Version *l, const Version *r) const
{
- return *l.get() < *r.get();
+ return *l < *r;
}
};
-typedef std::set<VersionPtr, VersionCompare> VersionSet;
+typedef std::set<Version *, VersionCompare> VersionSet;
class Source {
public:
diff --git a/test/database.cpp b/test/database.cpp
@@ -6,6 +6,7 @@
#include <string>
#define DBPATH "test/db/"
+#define DBPTR(ptr) unique_ptr<Database> dbptr(ptr)
using namespace std;
@@ -13,7 +14,8 @@ static const char *M = "[database]";
TEST_CASE("file not found", M) {
try {
- Database::load(DBPATH "404.xml");
+ Database *db = Database::load(DBPATH "404.xml");
+ DBPTR(db);
FAIL();
}
catch(const reapack_error &e) {
@@ -23,7 +25,8 @@ TEST_CASE("file not found", M) {
TEST_CASE("broken xml", M) {
try {
- Database::load(DBPATH "broken.xml");
+ Database *db = Database::load(DBPATH "broken.xml");
+ DBPTR(db);
FAIL();
}
catch(const reapack_error &e) {
@@ -33,7 +36,8 @@ TEST_CASE("broken xml", M) {
TEST_CASE("wrong root tag name", M) {
try {
- Database::load(DBPATH "wrong_root.xml");
+ Database *db = Database::load(DBPATH "wrong_root.xml");
+ DBPTR(db);
FAIL();
}
catch(const reapack_error &e) {
@@ -43,7 +47,8 @@ TEST_CASE("wrong root tag name", M) {
TEST_CASE("invalid version", M) {
try {
- Database::load(DBPATH "invalid_version.xml");
+ Database *db = Database::load(DBPATH "invalid_version.xml");
+ DBPTR(db);
FAIL();
}
catch(const reapack_error &e) {
@@ -53,7 +58,8 @@ TEST_CASE("invalid version", M) {
TEST_CASE("future version", M) {
try {
- Database::load(DBPATH "future_version.xml");
+ Database *db = Database::load(DBPATH "future_version.xml");
+ DBPTR(db);
FAIL();
}
catch(const reapack_error &e) {
@@ -61,13 +67,13 @@ TEST_CASE("future version", M) {
}
}
TEST_CASE("add category", M) {
- VersionPtr ver = make_shared<Version>("1");
- ver->addSource(make_shared<Source>(Source::GenericPlatform, "google.com"));
+ Version *ver = new Version("1");
+ ver->addSource(new Source(Source::GenericPlatform, "google.com"));
- PackagePtr pack = make_shared<Package>(Package::ScriptType, "name");
+ Package *pack = new Package(Package::ScriptType, "name");
pack->addVersion(ver);
- CategoryPtr cat = make_shared<Category>("a");
+ Category *cat = new Category("a");
cat->addPackage(pack);
Database db;
@@ -81,38 +87,38 @@ TEST_CASE("add category", M) {
TEST_CASE("drop empty category", M) {
Database db;
- db.addCategory(make_shared<Category>("a"));
+ db.addCategory(new Category("a"));
REQUIRE(db.categories().empty());
}
TEST_CASE("add a package", M) {
- VersionPtr ver = make_shared<Version>("1");
- ver->addSource(make_shared<Source>(Source::GenericPlatform, "google.com"));
+ Version *ver = new Version("1");
+ ver->addSource(new Source(Source::GenericPlatform, "google.com"));
- PackagePtr pack = make_shared<Package>(Package::ScriptType, "name");
+ Package *pack = new Package(Package::ScriptType, "name");
pack->addVersion(ver);
- CategoryPtr cat = make_shared<Category>("a");
- CHECK(cat->packages().size() == 0);
+ Category cat("a");
+ CHECK(cat.packages().size() == 0);
CHECK_FALSE(pack->category());
- cat->addPackage(pack);
+ cat.addPackage(pack);
- REQUIRE(cat->packages().size() == 1);
- REQUIRE(pack->category().get() == cat.get());
+ REQUIRE(cat.packages().size() == 1);
+ REQUIRE(pack->category() == &cat);
}
TEST_CASE("drop empty package", M) {
Category cat("a");
- cat.addPackage(make_shared<Package>(Package::ScriptType, "name"));
+ cat.addPackage(new Package(Package::ScriptType, "name"));
REQUIRE(cat.packages().empty());
}
TEST_CASE("drop unknown package", M) {
Category cat("a");
- cat.addPackage(make_shared<Package>(Package::UnknownType, "name"));
+ cat.addPackage(new Package(Package::UnknownType, "name"));
REQUIRE(cat.packages().size() == 0);
}
diff --git a/test/database_v1.cpp b/test/database_v1.cpp
@@ -3,9 +3,11 @@
#include <database.hpp>
#include <errors.hpp>
+#include <memory>
#include <string>
#define DBPATH "test/db/v1/"
+#define DBPTR(ptr) unique_ptr<Database> dbptr(ptr)
using namespace std;
@@ -13,7 +15,8 @@ static const char *M = "[reapack_v1]";
TEST_CASE("unnamed category", M) {
try {
- Database::load(DBPATH "unnamed_category.xml");
+ Database *db = Database::load(DBPATH "unnamed_category.xml");
+ DBPTR(db);
FAIL();
}
catch(const reapack_error &e) {
@@ -22,19 +25,23 @@ TEST_CASE("unnamed category", M) {
}
TEST_CASE("invalid category tag", M) {
- DatabasePtr db = Database::load(DBPATH "wrong_category_tag.xml");
+ Database *db = Database::load(DBPATH "wrong_category_tag.xml");
+ DBPTR(db);
+
REQUIRE(db->categories().empty());
}
TEST_CASE("invalid package tag", M) {
- DatabasePtr db = Database::load(DBPATH "wrong_package_tag.xml");
+ Database *db = Database::load(DBPATH "wrong_package_tag.xml");
+ DBPTR(db);
REQUIRE(db->categories().empty());
}
TEST_CASE("null package name", M) {
try {
- Database::load(DBPATH "unnamed_package.xml");
+ Database *db = Database::load(DBPATH "unnamed_package.xml");
+ DBPTR(db);
FAIL();
}
catch(const reapack_error &e) {
@@ -44,7 +51,8 @@ TEST_CASE("null package name", M) {
TEST_CASE("null package type", M) {
try {
- Database::load(DBPATH "missing_type.xml");
+ Database *db = Database::load(DBPATH "missing_type.xml");
+ DBPTR(db);
}
catch(const reapack_error &e) {
// no segfault -> test passes!
@@ -52,14 +60,16 @@ TEST_CASE("null package type", M) {
}
TEST_CASE("invalid version tag", M) {
- DatabasePtr db = Database::load(DBPATH "wrong_version_tag.xml");
+ Database *db = Database::load(DBPATH "wrong_version_tag.xml");
+ DBPTR(db);
REQUIRE(db->categories().empty());
}
TEST_CASE("null package version", M) {
try {
- Database::load(DBPATH "missing_version.xml");
+ Database *db = Database::load(DBPATH "missing_version.xml");
+ DBPTR(db);
FAIL();
}
catch(const reapack_error &e) {
@@ -69,7 +79,8 @@ TEST_CASE("null package version", M) {
TEST_CASE("null source url", M) {
try {
- Database::load(DBPATH "missing_source_url.xml");
+ Database *db = Database::load(DBPATH "missing_source_url.xml");
+ DBPTR(db);
FAIL();
}
catch(const reapack_error &e) {
@@ -78,14 +89,16 @@ TEST_CASE("null source url", M) {
}
TEST_CASE("default platform", M) {
- DatabasePtr db = Database::load(DBPATH "missing_platform.xml");
+ Database *db = Database::load(DBPATH "missing_platform.xml");
+ DBPTR(db);
REQUIRE(db->category(0)->package(0)->version(0)->source(0)->platform()
== Source::GenericPlatform);
}
TEST_CASE("version changelog", M) {
- DatabasePtr db = Database::load(DBPATH "changelog.xml");
+ Database *db = Database::load(DBPATH "changelog.xml");
+ DBPTR(db);
CHECK_FALSE(db->categories().empty());
CHECK_FALSE(db->category(0)->packages().empty());
@@ -96,24 +109,26 @@ TEST_CASE("version changelog", M) {
}
TEST_CASE("full database", M) {
- DatabasePtr db = Database::load(DBPATH "full_database.xml");
+ Database *db = Database::load(DBPATH "full_database.xml");
+ DBPTR(db);
+
REQUIRE(db->categories().size() == 1);
- CategoryPtr cat = db->category(0);
+ Category *cat = db->category(0);
REQUIRE(cat->name() == "Category Name");
REQUIRE(cat->packages().size() == 1);
- PackagePtr pack = cat->package(0);
+ Package *pack = cat->package(0);
REQUIRE(pack->type() == Package::ScriptType);
REQUIRE(pack->name() == "Hello World.lua");
REQUIRE(pack->versions().size() == 1);
- VersionPtr ver = pack->version(0);
+ Version *ver = pack->version(0);
REQUIRE(ver->name() == "1.0");
REQUIRE(ver->sources().size() == 1);
REQUIRE(ver->changelog() == "Fixed a division by zero error.");
- SourcePtr source = ver->source(0);
+ Source *source = ver->source(0);
REQUIRE(source->platform() == Source::GenericPlatform);
REQUIRE(source->url() == "https://google.com/");
}
diff --git a/test/package.cpp b/test/package.cpp
@@ -26,13 +26,14 @@ TEST_CASE("package versions are sorted", M) {
Package pack(Package::ScriptType, "a");
CHECK(pack.versions().size() == 0);
- SourcePtr source = make_shared<Source>(Source::GenericPlatform, "google.com");
+ Source *sourceA = new Source(Source::GenericPlatform, "google.com");
+ Source *sourceB = new Source(Source::GenericPlatform, "google.com");
- VersionPtr final = make_shared<Version>("1");
- final->addSource(source);
+ Version *final = new Version("1");
+ final->addSource(sourceA);
- VersionPtr alpha = make_shared<Version>("0.1");
- alpha->addSource(source);
+ Version *alpha = new Version("0.1");
+ alpha->addSource(sourceB);
pack.addVersion(final);
CHECK(pack.versions().size() == 1);
@@ -47,7 +48,7 @@ TEST_CASE("package versions are sorted", M) {
TEST_CASE("drop empty version", M) {
Package pack(Package::ScriptType, "a");
- pack.addVersion(make_shared<Version>("1"));
+ pack.addVersion(new Version("1"));
REQUIRE(pack.versions().empty());
}
@@ -65,10 +66,10 @@ TEST_CASE("unknown target location", M) {
}
TEST_CASE("script target location", M) {
- CategoryPtr cat = make_shared<Category>("Category Name");
+ Category cat("Category Name");
Package pack(Package::ScriptType, "file.name");
- pack.setCategory(cat);
+ pack.setCategory(&cat);
const Path path = pack.targetLocation();
diff --git a/test/version.cpp b/test/version.cpp
@@ -106,7 +106,7 @@ TEST_CASE("empty source url", M) {
TEST_CASE("drow sources for unknown platforms") {
Version ver("1");
- ver.addSource(make_shared<Source>(Source::UnknownPlatform, "a"));
+ ver.addSource(new Source(Source::UnknownPlatform, "a"));
REQUIRE(ver.sources().size() == 0);
}
@@ -114,9 +114,9 @@ TEST_CASE("drow sources for unknown platforms") {
#ifdef __APPLE__
TEST_CASE("drop windows sources on os x", M) {
Version ver("1");
- ver.addSource(make_shared<Source>(Source::WindowsPlatform, "a"));
- ver.addSource(make_shared<Source>(Source::Win32Platform, "a"));
- ver.addSource(make_shared<Source>(Source::Win64Platform, "a"));
+ ver.addSource(new Source(Source::WindowsPlatform, "a"));
+ ver.addSource(new Source(Source::Win32Platform, "a"));
+ ver.addSource(new Source(Source::Win64Platform, "a"));
REQUIRE(ver.sources().size() == 0);
}
@@ -124,32 +124,32 @@ TEST_CASE("drop windows sources on os x", M) {
#ifdef __x86_64__
TEST_CASE("drop 32-bit sources on os x 64-bit", M) {
Version ver("1");
- ver.addSource(make_shared<Source>(Source::Darwin32Platform, "a"));
+ ver.addSource(new Source(Source::Darwin32Platform, "a"));
REQUIRE(ver.sources().size() == 0);
}
TEST_CASE("valid sources for os x 64-bit", M) {
Version ver("1");
- ver.addSource(make_shared<Source>(Source::GenericPlatform, "a"));
- ver.addSource(make_shared<Source>(Source::DarwinPlatform, "a"));
- ver.addSource(make_shared<Source>(Source::Darwin64Platform, "a"));
+ ver.addSource(new Source(Source::GenericPlatform, "a"));
+ ver.addSource(new Source(Source::DarwinPlatform, "a"));
+ ver.addSource(new Source(Source::Darwin64Platform, "a"));
REQUIRE(ver.sources().size() == 3);
}
#else
TEST_CASE("drop 64-bit sources on os x 32-bit", M) {
Version ver("1");
- ver.addSource(make_shared<Source>(Source::Darwin64Platform, "a"));
+ ver.addSource(new Source(Source::Darwin64Platform, "a"));
REQUIRE(ver.sources().size() == 0);
}
TEST_CASE("valid sources for os x 32-bit", M) {
Version ver("1");
- ver.addSource(make_shared<Source>(Source::GenericPlatform, "a"));
- ver.addSource(make_shared<Source>(Source::DarwinPlatform, "a"));
- ver.addSource(make_shared<Source>(Source::Darwin32Platform, "a"));
+ ver.addSource(new Source(Source::GenericPlatform, "a"));
+ ver.addSource(new Source(Source::DarwinPlatform, "a"));
+ ver.addSource(new Source(Source::Darwin32Platform, "a"));
REQUIRE(ver.sources().size() == 3);
}
@@ -158,9 +158,9 @@ TEST_CASE("valid sources for os x 32-bit", M) {
#elif _WIN32
TEST_CASE("drop os x sources on windows", M) {
Version ver("1");
- ver.addSource(make_shared<Source>(Source::DarwinPlatform, "a"));
- ver.addSource(make_shared<Source>(Source::Darwin32Platform, "a"));
- ver.addSource(make_shared<Source>(Source::Darwin64Platform, "a"));
+ ver.addSource(new Source(Source::DarwinPlatform, "a"));
+ ver.addSource(new Source(Source::Darwin32Platform, "a"));
+ ver.addSource(new Source(Source::Darwin64Platform, "a"));
REQUIRE(ver.sources().size() == 0);
}
@@ -168,32 +168,32 @@ TEST_CASE("drop os x sources on windows", M) {
#ifdef _WIN64
TEST_CASE("drop 32-bit sources on windows 64-bit", M) {
Version ver("1");
- ver.addSource(make_shared<Source>(Source::Win32Platform, "a"));
+ ver.addSource(new Source(Source::Win32Platform, "a"));
REQUIRE(ver.sources().size() == 0);
}
TEST_CASE("valid sources for windows 64-bit", M) {
Version ver("1");
- ver.addSource(make_shared<Source>(Source::GenericPlatform, "a"));
- ver.addSource(make_shared<Source>(Source::WindowsPlatform, "a"));
- ver.addSource(make_shared<Source>(Source::Win64Platform, "a"));
+ ver.addSource(new Source(Source::GenericPlatform, "a"));
+ ver.addSource(new Source(Source::WindowsPlatform, "a"));
+ ver.addSource(new Source(Source::Win64Platform, "a"));
REQUIRE(ver.sources().size() == 3);
}
#else
TEST_CASE("drop 64-bit sources on windows 32-bit", M) {
Version ver("1");
- ver.addSource(make_shared<Source>(Source::Win64Platform, "a"));
+ ver.addSource(new Source(Source::Win64Platform, "a"));
REQUIRE(ver.sources().size() == 0);
}
TEST_CASE("valid sources for windows 32-bit", M) {
Version ver("1");
- ver.addSource(make_shared<Source>(Source::GenericPlatform, "a"));
- ver.addSource(make_shared<Source>(Source::WindowsPlatform, "a"));
- ver.addSource(make_shared<Source>(Source::Win32Platform, "a"));
+ ver.addSource(new Source(Source::GenericPlatform, "a"));
+ ver.addSource(new Source(Source::WindowsPlatform, "a"));
+ ver.addSource(new Source(Source::Win32Platform, "a"));
REQUIRE(ver.sources().size() == 3);
}