summaryrefslogtreecommitdiff
path: root/test/tasks_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/tasks_test.cc')
-rw-r--r--test/tasks_test.cc176
1 files changed, 126 insertions, 50 deletions
diff --git a/test/tasks_test.cc b/test/tasks_test.cc
index 8a15fcd..b444bd5 100644
--- a/test/tasks_test.cc
+++ b/test/tasks_test.cc
@@ -1,16 +1,16 @@
#include <uunit.h>
-#include <libctor.h>
+#include <ctor.h>
#include <tasks.h>
-#include <settings.h>
namespace
{
-BuildConfigurations ctorTestConfigs1()
+ctor::build_configurations ctorTestConfigs1(const ctor::settings&)
{
return
{
{
+ .name = "Target1",
.target = "target1",
.sources = {"foo.cc", "bar.c"},
},
@@ -20,7 +20,7 @@ BuildConfigurations ctorTestConfigs1()
};
}
-BuildConfigurations ctorTestConfigs2()
+ctor::build_configurations ctorTestConfigs2(const ctor::settings&)
{
return
{
@@ -34,27 +34,55 @@ BuildConfigurations ctorTestConfigs2()
}
}
+namespace test_global {
+ctor::toolchain toolchain{};
+ctor::arch arch{};
+}
+const ctor::configuration& ctor::get_configuration()
+{
+ static ctor::configuration cfg{};
+ cfg.build_toolchain = test_global::toolchain;
+ cfg.build_arch = test_global::arch;
+ return cfg;
+}
+
+
REG(ctorTestConfigs1);
REG(ctorTestConfigs2);
+std::size_t count(const std::vector<std::shared_ptr<Task>>& tasks,
+ const std::filesystem::path& name)
+{
+ auto cnt{0u};
+ for(const auto& task : tasks)
+ {
+ if(task->target() == name.string())
+ {
+ cnt++;
+ }
+ }
+ return cnt;
+}
class TestTask
: public Task
{
public:
- TestTask(const std::string& name, bool dirty,
+ TestTask(const ctor::build_configuration& config,
+ const ctor::settings& settings,
+ const std::string& name, bool dirty,
const std::vector<std::string>& deps = {})
- : Task({})
+ : Task(config, settings, {})
, task_name(name)
, task_dirty(dirty)
, task_deps(deps)
{
}
- std::string name() const override { return task_name; }
int clean() override { return 0; }
std::vector<std::string> depends() const override { return task_deps; }
std::string target() const override { return task_name; }
+ std::filesystem::path targetFile() const override { return {}; }
bool derived() const override { return false; }
bool dirtyInner() override { return task_dirty; }
@@ -68,17 +96,20 @@ class TasksTest
: public uUnit
{
public:
+ using fs = std::filesystem::path;
+
TasksTest()
{
uTEST(TasksTest::getTargets_test);
uTEST(TasksTest::getTasks_test);
uTEST(TasksTest::getNextTask_test);
+ uTEST(TasksTest::comparison_test);
}
void getTargets_test()
{
using namespace std::string_literals;
- Settings settings{};
+ ctor::settings settings{};
const auto& targets = getTargets(settings);
uASSERT_EQUAL(4u, targets.size());
@@ -95,35 +126,29 @@ public:
void getTasks_test()
{
+ test_global::toolchain = ctor::toolchain::gcc;
+ test_global::arch = ctor::arch::unix;
+
using namespace std::string_literals;
- Settings settings{ .builddir = "foo" };
+ ctor::settings settings{ .builddir = "foo" };
{
auto tasks = getTasks(settings);
uASSERT_EQUAL(6u, tasks.size());
- auto task = tasks.begin();
- uASSERT_EQUAL("foo/test/target1-foo_cc.o"s, (*task)->target());
- task++;
- uASSERT_EQUAL("foo/test/target1-bar_c.o"s, (*task)->target());
- task++;
- uASSERT_EQUAL("foo/test/target1"s, (*task)->target());
- task++;
- uASSERT_EQUAL("foo/test/target2"s, (*task)->target());
- task++;
- uASSERT_EQUAL("foo/test/target3"s, (*task)->target());
- task++;
- uASSERT_EQUAL("foo/test/target4"s, (*task)->target());
+ // Note: count() is used here because the order doesn't matter
+ uASSERT_EQUAL(1u, count(tasks, fs("target1")));
+ uASSERT_EQUAL(1u, count(tasks, fs("target2")));
+ uASSERT_EQUAL(1u, count(tasks, fs("target3")));
+ uASSERT_EQUAL(1u, count(tasks, fs("target4")));
+ uASSERT_EQUAL(1u, count(tasks, fs("test")/"target1-foo_cc.o"));
+ uASSERT_EQUAL(1u, count(tasks, fs("test")/"target1-bar_c.o"));
}
{
auto tasks = getTasks(settings, {"target1", "target3"});
uASSERT_EQUAL(4u, tasks.size());
- auto task = tasks.begin();
- uASSERT_EQUAL("foo/test/target1-foo_cc.o"s, (*task)->target());
- task++;
- uASSERT_EQUAL("foo/test/target1-bar_c.o"s, (*task)->target());
- task++;
- uASSERT_EQUAL("foo/test/target1"s, (*task)->target());
- task++;
- uASSERT_EQUAL("foo/test/target3"s, (*task)->target());
+ uASSERT_EQUAL(1u, count(tasks, fs("target1")));
+ uASSERT_EQUAL(1u, count(tasks, fs("target3")));
+ uASSERT_EQUAL(1u, count(tasks, fs("test")/"target1-foo_cc.o"));
+ uASSERT_EQUAL(1u, count(tasks, fs("test")/"target1-bar_c.o"));
}
{
auto tasks = getTasks(settings, {"no-such-target"});
@@ -134,11 +159,11 @@ public:
void getNextTask_test()
{
using namespace std::string_literals;
- Settings settings{};
+ ctor::settings settings{};
{ // Zero (Empty)
- std::list<std::shared_ptr<Task>> allTasks;
- std::list<std::shared_ptr<Task>> dirtyTasks;
+ std::vector<std::shared_ptr<Task>> allTasks;
+ std::vector<std::shared_ptr<Task>> dirtyTasks;
for(auto& task : dirtyTasks)
{
@@ -149,12 +174,13 @@ public:
}
{ // Zero (One task, no dirty)
- auto task1 = std::make_shared<TestTask>("task1", false);
+ ctor::build_configuration config;
+ auto task1 = std::make_shared<TestTask>(config, settings, "task1", false);
- std::list<std::shared_ptr<Task>> allTasks;
+ std::vector<std::shared_ptr<Task>> allTasks;
allTasks.push_back(task1);
- std::list<std::shared_ptr<Task>> dirtyTasks;
+ std::vector<std::shared_ptr<Task>> dirtyTasks;
for(auto& task : dirtyTasks)
{
@@ -165,12 +191,13 @@ public:
}
{ // One (One task, one dirty)
- auto task1 = std::make_shared<TestTask>("task1", true);
+ ctor::build_configuration config;
+ auto task1 = std::make_shared<TestTask>(config, settings, "task1", true);
- std::list<std::shared_ptr<Task>> allTasks;
+ std::vector<std::shared_ptr<Task>> allTasks;
allTasks.push_back(task1);
- std::list<std::shared_ptr<Task>> dirtyTasks;
+ std::vector<std::shared_ptr<Task>> dirtyTasks;
dirtyTasks.push_back(task1);
for(auto& task : dirtyTasks)
@@ -183,14 +210,15 @@ public:
}
{ // One (Two tasks, one dirty)
- auto task1 = std::make_shared<TestTask>("task1", false);
- auto task2 = std::make_shared<TestTask>("task2", true);
+ ctor::build_configuration config;
+ auto task1 = std::make_shared<TestTask>(config, settings, "task1", false);
+ auto task2 = std::make_shared<TestTask>(config, settings, "task2", true);
- std::list<std::shared_ptr<Task>> allTasks;
+ std::vector<std::shared_ptr<Task>> allTasks;
allTasks.push_back(task1);
allTasks.push_back(task2);
- std::list<std::shared_ptr<Task>> dirtyTasks;
+ std::vector<std::shared_ptr<Task>> dirtyTasks;
dirtyTasks.push_back(task2);
for(auto& task : dirtyTasks)
@@ -203,16 +231,18 @@ public:
}
{ // One (Two tasks, one dirty which depends on the other)
- auto task1 = std::make_shared<TestTask>("task1", false);
+ ctor::build_configuration config;
+ auto task1 = std::make_shared<TestTask>(config, settings, "task1", false);
std::vector<std::string> deps = {"task1"};
- auto task2 = std::make_shared<TestTask>("task2", true, deps);
+ auto task2 =
+ std::make_shared<TestTask>(config, settings, "task2", true, deps);
- std::list<std::shared_ptr<Task>> allTasks;
+ std::vector<std::shared_ptr<Task>> allTasks;
allTasks.push_back(task1);
allTasks.push_back(task2);
- std::list<std::shared_ptr<Task>> dirtyTasks;
+ std::vector<std::shared_ptr<Task>> dirtyTasks;
dirtyTasks.push_back(task2);
for(auto& task : dirtyTasks)
@@ -225,16 +255,18 @@ public:
}
{ // One (Two tasks, Both dirty, one depends on the other)
- auto task1 = std::make_shared<TestTask>("task1", true);
+ ctor::build_configuration config{};
+ auto task1 = std::make_shared<TestTask>(config, settings, "task1", true);
std::vector<std::string> deps = {"task1"};
- auto task2 = std::make_shared<TestTask>("task2", true, deps);
+ auto task2 =
+ std::make_shared<TestTask>(config, settings, "task2", true, deps);
- std::list<std::shared_ptr<Task>> allTasks;
+ std::vector<std::shared_ptr<Task>> allTasks;
allTasks.push_back(task2);
allTasks.push_back(task1);
- std::list<std::shared_ptr<Task>> dirtyTasks;
+ std::vector<std::shared_ptr<Task>> dirtyTasks;
dirtyTasks.push_back(task2);
dirtyTasks.push_back(task1);
@@ -246,7 +278,51 @@ public:
uASSERT_EQUAL(task1, getNextTask(allTasks, dirtyTasks));
uASSERT_EQUAL(1u, dirtyTasks.size());
}
+ }
+
+ void comparison_test()
+ {
+ test_global::toolchain = ctor::toolchain::gcc;
+ test_global::arch = ctor::arch::unix;
+ using namespace std::string_literals;
+ ctor::settings settings{ .builddir = "foo" };
+ { // Test Task::operator==
+ auto tasks = getTasks(settings, {"target1"});
+ uASSERT_EQUAL(3u, tasks.size());
+ uASSERT_EQUAL(1u, count(tasks, fs("target1")));
+ uASSERT_EQUAL(1u, count(tasks, fs("test")/"target1-foo_cc.o"));
+ uASSERT_EQUAL(1u, count(tasks, fs("test")/"target1-bar_c.o"));
+
+ int cnt1{};
+ int cnt2{};
+ int cnt3{};
+ for(const auto& task : tasks)
+ {
+ if(task->target() == fs("target1"))
+ {
+ ++cnt1;
+ uASSERT(*task == "target1");
+ uASSERT(*task == "Target1");
+ }
+ if(task->target() == fs("test")/"target1-foo_cc.o")
+ {
+ ++cnt2;
+ uASSERT(*task != "target1");
+ uASSERT(*task != "Target1");
+ }
+ if(task->target() == fs("test")/"target1-bar_c.o")
+ {
+ ++cnt3;
+ uASSERT(*task != "target1");
+ uASSERT(*task != "Target1");
+ }
+ }
+ // Assert that we did actually perform all three tests exactly once
+ uASSERT_EQUAL(1, cnt1);
+ uASSERT_EQUAL(1, cnt2);
+ uASSERT_EQUAL(1, cnt3);
+ }
}
};