From 9a855d3c26f25ef15b219f041120883b1945d0db Mon Sep 17 00:00:00 2001 From: vovatrykoz Date: Fri, 22 Nov 2024 13:58:09 +0100 Subject: [PATCH] can generate task instance chains from a collection of tasks --- include/TaskScheduling.h | 3 ++ source/TaskScheduling.cpp | 27 +++++++++++++++- tests/TaskSchedulingTests.cpp | 60 +++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) diff --git a/include/TaskScheduling.h b/include/TaskScheduling.h index 2c0961c..8834534 100644 --- a/include/TaskScheduling.h +++ b/include/TaskScheduling.h @@ -9,6 +9,9 @@ namespace scheduling { int calculateLcmForEndToEndPath(const std::vector& endToEndPath); +std::vector> generateTaskInstancesFromTasks( + const std::vector& endToEndPath); + } // namespace scheduling #endif \ No newline at end of file diff --git a/source/TaskScheduling.cpp b/source/TaskScheduling.cpp index 06e3f89..7124629 100644 --- a/source/TaskScheduling.cpp +++ b/source/TaskScheduling.cpp @@ -14,4 +14,29 @@ int scheduling::calculateLcmForEndToEndPath( } return acc; -} \ No newline at end of file +} + +std::vector> +scheduling::generateTaskInstancesFromTasks( + const std::vector& endToEndPath) { + if (endToEndPath.empty()) { + return std::vector>(); + } + + std::vector> 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; +} diff --git a/tests/TaskSchedulingTests.cpp b/tests/TaskSchedulingTests.cpp index f4bc25d..4eaeb61 100644 --- a/tests/TaskSchedulingTests.cpp +++ b/tests/TaskSchedulingTests.cpp @@ -28,5 +28,65 @@ TEST(TaskScheduling, CorrectLcmForSeveralTasks) { int expected = 120; int actual = scheduling::calculateLcmForEndToEndPath(tasks); + EXPECT_EQ(expected, actual); +} + +TEST(TaskScheduling, EmptyTaskChainReturnsEmptyTaskInstanceChain) { + std::vector> actual = + scheduling::generateTaskInstancesFromTasks({}); + + EXPECT_TRUE(actual.empty()); +} + +TEST(TaskScheduling, + TaskChainReturnsWithOneTaskReturnsSingleTaskInstanceInChain) { + Task t1(40, 4, 1); + + std::vector> expected = {{TaskInstance(t1, 0)}}; + std::vector> 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 tasks = {t1, t2, t3}; + + std::vector> 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> 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 tasks = {t1, t2, t3}; + + std::vector> 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> actual = + scheduling::generateTaskInstancesFromTasks(tasks); + EXPECT_EQ(expected, actual); } \ No newline at end of file