From 40d254a53bd56a5104205cae2316a5f024f12c55 Mon Sep 17 00:00:00 2001 From: anton Date: Mon, 18 Mar 2024 17:40:02 +0300 Subject: [PATCH 1/2] TimedDoor.h edited --- README.md | 4 ++-- include/TimedDoor.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f19f864..19caea0 100644 --- a/README.md +++ b/README.md @@ -44,13 +44,13 @@ class TimedDoor : public Door { private: DoorTimerAdapter * adapter; int iTimeout; - bool opened; + bool isOpened; public: explicit TimedDoor(int); bool isDoorOpened(); void unlock(); void lock(); - void DoorTimeOut(); + int getTimeOut(); void throwState(); }; diff --git a/include/TimedDoor.h b/include/TimedDoor.h index e1eade2..04429ad 100644 --- a/include/TimedDoor.h +++ b/include/TimedDoor.h @@ -32,13 +32,13 @@ class TimedDoor : public Door { private: DoorTimerAdapter * adapter; int iTimeout; - bool opened; + bool isOpened; public: explicit TimedDoor(int); bool isDoorOpened(); void unlock(); void lock(); - void DoorTimeOut(); + int getTimeOut() const; void throwState(); }; From c38e170131aab66d3b80f6ecb342ecef182a7893 Mon Sep 17 00:00:00 2001 From: vadimbelan <92176898+vadimbelan@users.noreply.github.com> Date: Wed, 29 May 2024 22:32:45 +0300 Subject: [PATCH 2/2] Add files via upload --- CMakeLists.txt | 10 ++++- include/TimedDoor.h | 26 ++++++------- src/CMakeLists.txt | 2 +- src/TimedDoor.cpp | 55 ++++++++++++++++++++++++++ src/main.cpp | 13 ++++--- test/CMakeLists.txt | 2 +- test/tests.cpp | 95 ++++++++++++++++++++++++++++++++++++++++++++- 7 files changed, 179 insertions(+), 24 deletions(-) create mode 100644 src/TimedDoor.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 36758e8..2739074 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,5 +9,13 @@ set(tool_dest "bin") set(lib_dest "lib") set(include_dest "include/") +include(FetchContent) +FetchContent_Declare( + googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG release-1.10.0 +) +FetchContent_MakeAvailable(googletest) + add_subdirectory(src) -add_subdirectory(test) +add_subdirectory(test) \ No newline at end of file diff --git a/include/TimedDoor.h b/include/TimedDoor.h index 04429ad..338de32 100644 --- a/include/TimedDoor.h +++ b/include/TimedDoor.h @@ -1,13 +1,8 @@ -// Copyright 2021 GHA Test Team +// Copyright 2024 Vadim Belan #ifndef INCLUDE_TIMEDDOOR_H_ #define INCLUDE_TIMEDDOOR_H_ -class DoorTimerAdapter; -class Timer; -class Door; -class TimedDoor; - class TimerClient { public: virtual void Timeout() = 0; @@ -20,30 +15,35 @@ class Door { virtual bool isDoorOpened() = 0; }; +class TimedDoor; + class DoorTimerAdapter : public TimerClient { private: TimedDoor& door; public: explicit DoorTimerAdapter(TimedDoor&); - void Timeout(); + void Timeout() override; + TimedDoor& getDoor() const; }; class TimedDoor : public Door { private: - DoorTimerAdapter * adapter; + DoorTimerAdapter* adapter; int iTimeout; bool isOpened; public: explicit TimedDoor(int); - bool isDoorOpened(); - void unlock(); - void lock(); - int getTimeOut() const; + bool isDoorOpened() override; + void unlock() override; + void lock() override; + int getTimeOut() const; void throwState(); + DoorTimerAdapter* getAdapter(); }; class Timer { - TimerClient *client; + private: + TimerClient* client; void sleep(int); public: void tregister(int, TimerClient*); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 91c9bfa..3c1a186 100755 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,4 +27,4 @@ install(TARGETS ${PROJECT_NAME} install(TARGETS ${PROJECT_NAME}.info RUNTIME DESTINATION "${tool_dest}" COMPONENT library) -install(FILES ${header} DESTINATION "${include_dest}") +install(FILES ${header} DESTINATION "${include_dest}") \ No newline at end of file diff --git a/src/TimedDoor.cpp b/src/TimedDoor.cpp new file mode 100644 index 0000000..ec01936 --- /dev/null +++ b/src/TimedDoor.cpp @@ -0,0 +1,55 @@ +// Copyright 2024 Vadim Belan + +#include +#include // NOLINT [build/c++11] +#include // NOLINT [build/c++11] +#include "TimedDoor.h" + +DoorTimerAdapter::DoorTimerAdapter(TimedDoor& door) : door(door) {} + +void DoorTimerAdapter::Timeout() { + if (door.isDoorOpened()) { + door.throwState(); + } +} + +TimedDoor& DoorTimerAdapter::getDoor() const { + return door; +} + +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() { + throw std::runtime_error("Door left open!"); +} + +DoorTimerAdapter* TimedDoor::getAdapter() { + return adapter; +} + +void Timer::tregister(int timeout, TimerClient* client) { + this->client = client; + sleep(timeout); + client->Timeout(); +} + +void Timer::sleep(int seconds) { + std::this_thread::sleep_for(std::chrono::seconds(seconds)); +} diff --git a/src/main.cpp b/src/main.cpp index 9b83162..6e43286 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,11 +1,12 @@ -// Copyright 2021 GHA Test Team -#include "TimedDoor.h" +// Copyright 2024 Vadim Belan + #include +#include "TimedDoor.h" int main() { - TimedDoor tDoor(5); - tDoor.lock(); - tDoor.unlock(); + TimedDoor tDoor(5); + tDoor.lock(); + tDoor.unlock(); - return 0; + return 0; } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9723d50..f1450fa 100755 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -7,4 +7,4 @@ target_compile_definitions(${PROJECT_NAME}.test PRIVATE TEST_DIR="${CMAKE_CURRENT_LIST_DIR}/test") install(TARGETS ${PROJECT_NAME}.test - DESTINATION "${tool_dest}") + DESTINATION "${tool_dest}") \ No newline at end of file diff --git a/test/tests.cpp b/test/tests.cpp index 605e570..97a6a1e 100644 --- a/test/tests.cpp +++ b/test/tests.cpp @@ -1,6 +1,97 @@ -// Copyright 2021 GHA Test Team +// Copyright 2024 Vadim Belan #include #include -#include +#include // NOLINT [build/c++11] #include "TimedDoor.h" + +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)); + MOCK_METHOD(void, throwState, (), ()); +}; + +class TimedDoorTest : public testing::Test { + protected: + TimedDoor* timedDoor; + Timer* timer; + + void SetUp() override { + timedDoor = new TimedDoor(2); + timer = new Timer(); + } + + void TearDown() override { + delete timedDoor; + delete timer; + } +}; + +TEST_F(TimedDoorTest, DoorInitiallyClosed) { + EXPECT_FALSE(timedDoor->isDoorOpened()); +} + +TEST_F(TimedDoorTest, UnlockDoor) { + timedDoor->unlock(); + EXPECT_TRUE(timedDoor->isDoorOpened()); +} + +TEST_F(TimedDoorTest, LockDoor) { + timedDoor->unlock(); + timedDoor->lock(); + EXPECT_FALSE(timedDoor->isDoorOpened()); +} + +TEST_F(TimedDoorTest, TimeoutThrowsExceptionIfDoorOpened) { + timedDoor->unlock(); + EXPECT_THROW({ + timer->tregister(timedDoor->getTimeOut(), timedDoor->getAdapter()); + }, std::runtime_error); +} + +TEST_F(TimedDoorTest, TimeoutDoesNotThrowIfDoorClosed) { + EXPECT_NO_THROW({ + timer->tregister(timedDoor->getTimeOut(), timedDoor->getAdapter()); + }); +} + +TEST(MockedDoorTest, TimerCallsTimeout) { + MockTimerClient mockClient; + EXPECT_CALL(mockClient, Timeout()).Times(1); + + Timer timer; + timer.tregister(1, &mockClient); +} + +TEST_F(TimedDoorTest, AdapterLinksToTimedDoor) { + DoorTimerAdapter adapter(*timedDoor); + EXPECT_EQ(&adapter.getDoor(), timedDoor); +} + +TEST_F(TimedDoorTest, DoorInitiallyLocked) { + EXPECT_FALSE(timedDoor->isDoorOpened()); +} + +TEST_F(TimedDoorTest, UnlockingAndLockingDoorTwice) { + timedDoor->unlock(); + timedDoor->lock(); + timedDoor->unlock(); + timedDoor->lock(); + EXPECT_FALSE(timedDoor->isDoorOpened()); +} + +TEST_F(TimedDoorTest, UnlockingDoorAndThenTimingOut) { + timedDoor->unlock(); + std::this_thread::sleep_for + (std::chrono::seconds(timedDoor->getTimeOut() + 1)); + EXPECT_THROW({ + timer->tregister(timedDoor->getTimeOut(), timedDoor->getAdapter()); + }, std::runtime_error); +}