Skip to content

Commit

Permalink
can generate task instance chains from a collection of tasks
Browse files Browse the repository at this point in the history
  • Loading branch information
vovatrykoz committed Nov 22, 2024
1 parent 2dcf1f8 commit 9a855d3
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 1 deletion.
3 changes: 3 additions & 0 deletions include/TaskScheduling.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ namespace scheduling {

int calculateLcmForEndToEndPath(const std::vector<Task>& endToEndPath);

std::vector<std::vector<TaskInstance>> generateTaskInstancesFromTasks(
const std::vector<Task>& endToEndPath);

} // namespace scheduling

#endif
27 changes: 26 additions & 1 deletion source/TaskScheduling.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,29 @@ int scheduling::calculateLcmForEndToEndPath(
}

return acc;
}
}

std::vector<std::vector<TaskInstance>>
scheduling::generateTaskInstancesFromTasks(
const std::vector<Task>& endToEndPath) {
if (endToEndPath.empty()) {
return std::vector<std::vector<TaskInstance>>();
}

std::vector<std::vector<TaskInstance>> result(endToEndPath.size());
int lcm = scheduling::calculateLcmForEndToEndPath(endToEndPath);

for (int i = 0; i < endToEndPath.size(); i++) {
int instanceCount = lcm / endToEndPath[i].period;

for (int j = 0; j < instanceCount; j++) {
TaskInstance taskInstance(
endToEndPath[i],
endToEndPath[i].offset + endToEndPath[i].period * j);

result[i].push_back(taskInstance);
}
}

return result;
}
60 changes: 60 additions & 0 deletions tests/TaskSchedulingTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,65 @@ TEST(TaskScheduling, CorrectLcmForSeveralTasks) {
int expected = 120;
int actual = scheduling::calculateLcmForEndToEndPath(tasks);

EXPECT_EQ(expected, actual);
}

TEST(TaskScheduling, EmptyTaskChainReturnsEmptyTaskInstanceChain) {
std::vector<std::vector<TaskInstance>> actual =
scheduling::generateTaskInstancesFromTasks({});

EXPECT_TRUE(actual.empty());
}

TEST(TaskScheduling,
TaskChainReturnsWithOneTaskReturnsSingleTaskInstanceInChain) {
Task t1(40, 4, 1);

std::vector<std::vector<TaskInstance>> expected = {{TaskInstance(t1, 0)}};
std::vector<std::vector<TaskInstance>> actual =
scheduling::generateTaskInstancesFromTasks({t1});

EXPECT_EQ(expected, actual);
}

TEST(TaskScheduling, CorrectInstanceChainsForSeveralTasks) {
Task t1(20, 4, 1);
Task t2(40, 3, 1);
Task t3(4, 2, 1);

std::vector<Task> tasks = {t1, t2, t3};

std::vector<std::vector<TaskInstance>> expected = {
{TaskInstance(t1, 0), TaskInstance(t1, 20)},
{TaskInstance(t2, 0)},
{TaskInstance(t3, 0), TaskInstance(t3, 4), TaskInstance(t3, 8),
TaskInstance(t3, 12), TaskInstance(t3, 16), TaskInstance(t3, 20),
TaskInstance(t3, 24), TaskInstance(t3, 28), TaskInstance(t3, 32),
TaskInstance(t3, 36)}};

std::vector<std::vector<TaskInstance>> actual =
scheduling::generateTaskInstancesFromTasks(tasks);

EXPECT_EQ(expected, actual);
}

TEST(TaskScheduling, CorrectInstanceChainsForSeveralTasksWithOffsets) {
Task t1(20, 4, 1, 2);
Task t2(40, 3, 1, 7);
Task t3(4, 2, 1, 5);

std::vector<Task> tasks = {t1, t2, t3};

std::vector<std::vector<TaskInstance>> expected = {
{TaskInstance(t1, 2), TaskInstance(t1, 22)},
{TaskInstance(t2, 7)},
{TaskInstance(t3, 5), TaskInstance(t3, 9), TaskInstance(t3, 13),
TaskInstance(t3, 17), TaskInstance(t3, 21), TaskInstance(t3, 25),
TaskInstance(t3, 29), TaskInstance(t3, 33), TaskInstance(t3, 37),
TaskInstance(t3, 41)}};

std::vector<std::vector<TaskInstance>> actual =
scheduling::generateTaskInstancesFromTasks(tasks);

EXPECT_EQ(expected, actual);
}

0 comments on commit 9a855d3

Please sign in to comment.