Skip to content

Commit

Permalink
feat: finish
Browse files Browse the repository at this point in the history
  • Loading branch information
AleshaCoder committed May 24, 2024
1 parent 40d254a commit b7b8001
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 8 deletions.
13 changes: 11 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,20 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Install gtest manually
run: sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && ls -l lib && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a
run: |
sudo apt-get install libgtest-dev libgmock-dev
cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make && ls -l lib
sudo cp lib/*.a /usr/lib
sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a
sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a
- uses: actions/checkout@v1
- name: configure
run: mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-Werror" ..
- name: make
run: cd build && make
- name: Run Test
run: /home/runner/work/ST-3/ST-3/build/test/ST-3.test
run: |
export REPO_NAME=${GITHUB_REPOSITORY#$GITHUB_REPOSITORY_OWNER/}
/home/runner/work/${REPO_NAME}/${REPO_NAME}/build/test/ST-3.test
12 changes: 7 additions & 5 deletions include/TimedDoor.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2021 GHA Test Team
// Copyright 2024 Aleksey Afanasyev

#ifndef INCLUDE_TIMEDDOOR_H_
#define INCLUDE_TIMEDDOOR_H_
Expand All @@ -11,6 +11,7 @@ class TimedDoor;
class TimerClient {
public:
virtual void Timeout() = 0;
virtual ~Timeout() = default;
};

class Door {
Expand All @@ -25,7 +26,7 @@ class DoorTimerAdapter : public TimerClient {
TimedDoor& door;
public:
explicit DoorTimerAdapter(TimedDoor&);
void Timeout();
void Timeout() override;
};

class TimedDoor : public Door {
Expand All @@ -35,11 +36,12 @@ class TimedDoor : public Door {
bool isOpened;
public:
explicit TimedDoor(int);
bool isDoorOpened();
void unlock();
void lock();
bool isDoorOpened() override;
void unlock() override;
void lock() override;
int getTimeOut() const;
void throwState();
virtual ~TimedDoor();
};

class Timer {
Expand Down
58 changes: 58 additions & 0 deletions src/TimedDoor.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// Copyright 2024 Aleksey Afanasyev
#include <thread> // NOLINT [build/c++11]
#include <stdexcept>
#include "TimedDoor.h"

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

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

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

bool TimedDoor::isDoorOpened() {
return this->isOpened;
}

void TimedDoor::unlock() {
if (this->isOpened) {
throw std::logic_error("door already unlocked");
}
this->isOpened = true;
}

void TimedDoor::lock() {
if (!this->isOpened) {
throw std::logic_error("door already locked");
}
this->isOpened = false;
}

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

void TimedDoor::throwState() {
if (this->isOpened) {
throw std::runtime_error("door was open for too long");
}
}

TimedDoor::~TimedDoor() {
delete this->adapter;
}


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

void Timer::tregister(int time, TimerClient *timerClient) {
this->client = timerClient;
this->sleep(time);
this->client->Timeout();
this->client = nullptr;
}
63 changes: 62 additions & 1 deletion test/tests.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,67 @@
// Copyright 2021 GHA Test Team
// Copyright 2024 Aleksey Afanasyev

#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <cstdint>
#include "TimedDoor.h"

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

class TimedDoorTest : public ::testing::Test {
protected:
TimedDoor door;
Timer timer;
MockTimerClient *timerClient;
public:
TimedDoorTest() : door(500), timer() {}
protected:
void SetUp() override {
timerClient = new MockTimerClient();
}
void TearDown() override {
delete timerClient;
}
};

TEST_F(TimedDoorTest, TimedDoorLockedByDefault) {
EXPECT_FALSE(door.isDoorOpened());
}
TEST_F(TimedDoorTest, TimedDoorLocked) {
door.unlock();
door.lock();
EXPECT_FALSE(door.isDoorOpened());
}
TEST_F(TimedDoorTest, TimedDoorUnlocked) {
door.unlock();
EXPECT_TRUE(door.isDoorOpened());
}
TEST_F(TimedDoorTest, TimedDoorThrowStateThrowsWhenOpen) {
door.unlock();
EXPECT_THROW(door.throwState(), std::runtime_error);
}
TEST_F(TimedDoorTest, TimedDoorThrowStateNoThrowWhenLocked) {
EXPECT_NO_THROW(door.throwState());
}
TEST_F(TimedDoorTest, TimedDoorUnlockTwice) {
door.unlock();
EXPECT_THROW(door.unlock(), std::logic_error);
}
TEST_F(TimedDoorTest, TimedDoorLockTwice) {
EXPECT_THROW(door.lock(), std::logic_error);
}
TEST_F(TimedDoorTest, TimerCallsTimeout) {
EXPECT_CALL(*timerClient, Timeout()).Times(1);
timer.tregister(100, timerClient);
}
TEST_F(TimedDoorTest, DoorTimerAdapterTimeoutThrowsOnUnlocked) {
DoorTimerAdapter adapter(door);
door.unlock();
EXPECT_THROW(adapter.Timeout(), std::runtime_error);
}
TEST_F(TimedDoorTest, DoorTimerAdapterTimeoutNoThrowsOnLocked) {
DoorTimerAdapter adapter(door);
EXPECT_NO_THROW(adapter.Timeout());
}

0 comments on commit b7b8001

Please sign in to comment.