diff --git a/Task 3/unittest_3.cpp b/Task 3/unittest_3.cpp new file mode 100644 index 0000000000000000000000000000000000000000..29c70f700aa76b37b5599cb816da3b5669131227 --- /dev/null +++ b/Task 3/unittest_3.cpp @@ -0,0 +1,60 @@ +#include "simpletest.h" +#include "your_fiber_scheduler_header.h" + +// Test Fiber Initialization +DEFINE_TEST(TestFiberInitialization) { + int sharedData = 42; + Fiber testFiber([](Context*, Context*){}, &sharedData); + + TEST_NEQ(testFiber.get_context(), nullptr); + TEST_EQ(testFiber.getSharedData(), &sharedData); +} + +// Test Fiber Stack Alignment +DEFINE_TEST(TestFiberStackAlignment) { + Fiber testFiber([](Context*, Context*){}, nullptr); + uintptr_t stackPtr = reinterpret_cast<uintptr_t>(testFiber.get_context()->rsp); + + TEST_EQ(stackPtr % 16, 0); +} + +// Test Fiber Finished State +DEFINE_TEST(TestFiberFinishedState) { + Fiber testFiber([](Context*, Context*){}, nullptr); + + TEST_EQ(testFiber.isFinished(), false); + testFiber.setFinished(true); + TEST_EQ(testFiber.isFinished(), true); +} + +void fiberFunc1(Context* mainContext, Context* selfContext) { + // Simulate some operation +} + +void fiberFunc2(Context* mainContext, Context* selfContext) { + // Simulate some operation +} + +// Test for Scheduler Yield Function +DEFINE_TEST(TestSchedulerYield) { + Scheduler scheduler; + Fiber fiber1(fiberFunc1, nullptr); + Fiber fiber2(fiberFunc2, nullptr); + + scheduler.spawn(&fiber1); + scheduler.spawn(&fiber2); + + // Set current fiber to fiber1 + scheduler.setCurrentFiber(&fiber1); + + // Call yield + scheduler.yield(); + + // Check if current fiber is now fiber2 + TEST_EQ(scheduler.getCurrentFiber(), &fiber2); +} + +int main() { + TestFixture::ExecuteAllTests(); + return 0; +}