Skip to content
This repository was archived by the owner on Jun 10, 2026. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 46 additions & 1 deletion src/TimedDoor.cpp
Original file line number Diff line number Diff line change
@@ -1,2 +1,47 @@
// Copyright 2021 GHA Test Team
// Copyright 2026 NNTU-CS
#include "TimedDoor.h"
#include <stdexcept>
#include <thread>
#include <chrono>

DoorTimerAdapter::DoorTimerAdapter(TimedDoor& d) : door(d) {}

void DoorTimerAdapter::Timeout() {
door.throwState();
}

TimedDoor::TimedDoor(int timeout) : iTimeout(timeout), isOpened(false) {
adapter = new DoorTimerAdapter(*this);
}

bool TimedDoor::isDoorOpened() {
return isOpened;
}

void TimedDoor::unlock() {
isOpened = true;
}

void TimedDoor::lock() {
isOpened = false;
}

int TimedDoor::getTimeOut() const {
return iTimeout;
}

void TimedDoor::throwState() {
if (isOpened) {
throw std::runtime_error("Door is open too long!");
}
}

void Timer::sleep(int seconds) {
std::this_thread::sleep_for(std::chrono::seconds(seconds));
}

void Timer::tregister(int timeout, TimerClient* c) {
client = c;
sleep(timeout);
client->Timeout();
}
103 changes: 100 additions & 3 deletions test/tests.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,103 @@
// Copyright 2021 GHA Test Team

// Copyright 2026 NNTU-CS
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <cstdint>
#include <stdexcept>
#include "TimedDoor.h"

using ::testing::AtLeast;

class MockTimerClient : public TimerClient {
public:
MOCK_METHOD(void, Timeout, (), (override));
};

class MockDoor : public Door {
public:
MOCK_METHOD(void, lock, (), (override));
MOCK_METHOD(void, unlock, (), (override));
MOCK_METHOD(bool, isDoorOpened, (), (override));
};

struct TimedDoorTest : public testing::Test {
TimedDoor* door;
void SetUp() {
door = new TimedDoor(1);
}
void TearDown() {
delete door;
}
};

TEST_F(TimedDoorTest, DoorInitiallyLocked) {
EXPECT_FALSE(door->isDoorOpened());
}

TEST_F(TimedDoorTest, DoorOpensAfterUnlock) {
door->unlock();
EXPECT_TRUE(door->isDoorOpened());
}

TEST_F(TimedDoorTest, DoorClosesAfterLock) {
door->unlock();
door->lock();
EXPECT_FALSE(door->isDoorOpened());
}

TEST_F(TimedDoorTest, GetTimeoutReturnsCorrectValue) {
EXPECT_EQ(1, door->getTimeOut());
}

TEST_F(TimedDoorTest, ThrowStateThrowsWhenOpen) {
door->unlock();
EXPECT_THROW(door->throwState(), std::runtime_error);
}

TEST_F(TimedDoorTest, ThrowStateNoThrowWhenClosed) {
door->lock();
EXPECT_NO_THROW(door->throwState());
}

TEST_F(TimedDoorTest, ThrowStateNoThrowInitially) {
EXPECT_NO_THROW(door->throwState());
}

TEST_F(TimedDoorTest, UnlockThenLockNoThrow) {
door->unlock();
door->lock();
EXPECT_NO_THROW(door->throwState());
}

TEST_F(TimedDoorTest, MultipleOpenClose) {
for (int i = 0; i < 5; ++i) {
door->unlock();
EXPECT_TRUE(door->isDoorOpened());
door->lock();
EXPECT_FALSE(door->isDoorOpened());
}
}

TEST_F(TimedDoorTest, TimeoutOnOpenDoorThrows) {
door->unlock();
DoorTimerAdapter adapter(*door);
EXPECT_THROW(adapter.Timeout(), std::runtime_error);
}

TEST_F(TimedDoorTest, TimeoutOnClosedDoorNoThrow) {
door->lock();
DoorTimerAdapter adapter(*door);
EXPECT_NO_THROW(adapter.Timeout());
}

TEST(MockTimerClientTest, TimeoutIsCalled) {
MockTimerClient mockClient;
EXPECT_CALL(mockClient, Timeout()).Times(AtLeast(1));
mockClient.Timeout();
}

TEST(MockDoorTest, LockAndUnlockAreCalled) {
MockDoor mockDoor;
EXPECT_CALL(mockDoor, lock()).Times(1);
EXPECT_CALL(mockDoor, unlock()).Times(1);
mockDoor.unlock();
mockDoor.lock();
}
Loading