diff --git a/tdd_intro/homework/08_timer/test.cpp b/tdd_intro/homework/08_timer/test.cpp index 24db0b7..8c17db9 100644 --- a/tdd_intro/homework/08_timer/test.cpp +++ b/tdd_intro/homework/08_timer/test.cpp @@ -22,3 +22,194 @@ Timer can be started again any time, no metter in what state it is */ #include +#include + +typedef std::chrono::high_resolution_clock Clock; +typedef Clock::duration Duration; +typedef std::chrono::time_point TimePoint; + +class ITimer { +public: + virtual ~ITimer() {} + + virtual void Start(int64_t nanos) = 0; + virtual bool IsExpired() const = 0; + virtual Duration TimeLeft() const = 0; +}; + +class ICurrentTime { +public: + virtual ~ICurrentTime() {} + + virtual void Reset() = 0; + virtual void AddTime(int64_t nanos) = 0; + virtual TimePoint GetTime() const = 0; +}; + +class CurrentTime : public ICurrentTime { +public: + void Reset() override; + void AddTime(int64_t nanos) override; + TimePoint GetTime() const override; +private: + TimePoint m_time; +}; + +class Timer : public ITimer +{ +public: + Timer(CurrentTime& currentTime) + : m_currentTime(currentTime) + { + } + + void Start(int64_t nanos) override; + bool IsExpired() const override; + Duration TimeLeft() const override; +private: + CurrentTime& m_currentTime; + TimePoint m_expirationTime; +}; + +void Timer::Start(int64_t nanos) +{ + m_currentTime.Reset(); + m_expirationTime = m_currentTime.GetTime() + Duration(nanos); +} + +bool Timer::IsExpired() const +{ + return m_currentTime.GetTime() > m_expirationTime; +} + +Duration Timer::TimeLeft() const +{ + if (IsExpired()) + { + return Duration(0); + } + + return m_expirationTime - m_currentTime.GetTime(); +} + +void CurrentTime::Reset() +{ + m_time = Clock::now(); +} + +void CurrentTime::AddTime(int64_t nanos) +{ + m_time += Duration(nanos); +} + +TimePoint CurrentTime::GetTime() const +{ + return m_time; +} + +TEST(Timer, IsExpired_TimeNotChanged) +{ + CurrentTime currentTime; + Timer timer(currentTime); + + const int64_t aLotOfTime = 5000; + + timer.Start(aLotOfTime); + EXPECT_FALSE(timer.IsExpired()); +} + +TEST(Timer, IsExpired_Expired) +{ + CurrentTime currentTime; + Timer timer(currentTime); + + const int64_t timeForTimer = 2000; + const int64_t timeToGo = 3000; + + timer.Start(timeForTimer); + currentTime.AddTime(timeToGo); + + EXPECT_TRUE(timer.IsExpired()); +} + +TEST(Timer, IsExpired_NotExpired) +{ + CurrentTime currentTime; + Timer timer(currentTime); + + const int64_t timeForTimer = 2000; + const int64_t timeToGo = 1000; + + timer.Start(timeForTimer); + currentTime.AddTime(timeToGo); + + EXPECT_FALSE(timer.IsExpired()); +} + +TEST(Timer, AtLimit_NotExpired) +{ + CurrentTime currentTime; + Timer timer(currentTime); + + const int64_t timeForTimer = 2000; + const int64_t timeToGo = 2000; + + timer.Start(timeForTimer); + currentTime.AddTime(timeToGo); + + EXPECT_FALSE(timer.IsExpired()); +} + +TEST(Timer, TimeLeft_WholeTimeLeft) +{ + CurrentTime currentTime; + Timer timer(currentTime); + + const int64_t timeForTimer = 2000; + + timer.Start(timeForTimer); + + EXPECT_EQ(Duration(timeForTimer), timer.TimeLeft()); +} + +TEST(Timer, TimeLeft_SomeTimeLeft) +{ + CurrentTime currentTime; + Timer timer(currentTime); + + const int64_t timeForTimer = 2000; + const int64_t timeToGo = 1000; + + timer.Start(timeForTimer); + currentTime.AddTime(timeToGo); + + EXPECT_EQ(Duration(timeForTimer - timeToGo), timer.TimeLeft()); +} + +TEST(Timer, TimeLeft_Expired) +{ + CurrentTime currentTime; + Timer timer(currentTime); + + const int64_t timeForTimer = 1000; + const int64_t timeToGo = 2000; + + timer.Start(timeForTimer); + currentTime.AddTime(timeToGo); + + EXPECT_EQ(Duration(0), timer.TimeLeft()); +} + +TEST(Timer, TimeLeft_NoTimeLeft) +{ + CurrentTime currentTime; + Timer timer(currentTime); + + const int64_t timeForTimer = 2000; + const int64_t timeToGo = 2000; + + timer.Start(timeForTimer); + currentTime.AddTime(timeToGo); + + EXPECT_EQ(Duration(0), timer.TimeLeft()); +} diff --git a/tdd_intro/tdd_intro.pro.user b/tdd_intro/tdd_intro.pro.user index a2f1674..13d7492 100644 --- a/tdd_intro/tdd_intro.pro.user +++ b/tdd_intro/tdd_intro.pro.user @@ -1,10 +1,10 @@ - + EnvironmentId - {a9e7f687-ac9f-466e-a5b0-c81b575a0a1d} + {950e75d0-15c4-4cbb-8e75-9217fe27f405} ProjectExplorer.Project.ActiveTarget @@ -59,14 +59,14 @@ ProjectExplorer.Project.Target.0 - Qt 5.7.0 (windows) - Qt 5.7.0 (windows) - {bb54e87c-a17e-4f34-bfa2-da2794ff8a10} + Desktop Qt 5.10.0 MSVC2015 32bit + Desktop Qt 5.10.0 MSVC2015 32bit + qt.qt5.5100.win32_msvc2015_kit 0 0 - 11 + 0 - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug + C:/Users/ertev/Desktop/TDD course/tdd-course-2/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug true @@ -120,7 +120,7 @@ true - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Release + C:/Users/ertev/Desktop/TDD course/tdd-course-2/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Release true @@ -174,7 +174,7 @@ true - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Profile + C:/Users/ertev/Desktop/TDD course/tdd-course-2/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Profile true @@ -286,13 +286,13 @@ chatclient - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/cleanroom/chatclient/chatclient.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/ertev/Desktop/TDD course/tdd-course-2/tdd_intro/cleanroom/chatclient/chatclient.pro true cleanroom/chatclient/chatclient.pro false - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug/cleanroom/chatclient + 3768 false true @@ -344,13 +344,13 @@ 01_bob - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/01_bob/01_bob.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/ertev/Desktop/TDD course/tdd-course-2/tdd_intro/homework/01_bob/01_bob.pro true homework/01_bob/01_bob.pro false - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug/homework/01_bob + 3768 false true @@ -402,13 +402,13 @@ 02_word_count - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/workshops/02_word_count/02_word_count.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/ertev/Desktop/TDD course/tdd-course-2/tdd_intro/workshops/02_word_count/02_word_count.pro true workshops/02_word_count/02_word_count.pro false - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug/workshops/02_word_count + 3768 false true @@ -460,13 +460,13 @@ 03_anagram 03_anagram2 - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/workshops/03_anagram/03_anagram.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/ertev/Desktop/TDD course/tdd-course-2/tdd_intro/workshops/03_anagram/03_anagram.pro true workshops/03_anagram/03_anagram.pro false - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug/workshops/03_anagram + 3768 false true @@ -518,13 +518,13 @@ 04_trinary_numbers 04_trinary_numbers2 - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/workshops/04_trinary_numbers/04_trinary_numbers.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/ertev/Desktop/TDD course/tdd-course-2/tdd_intro/workshops/04_trinary_numbers/04_trinary_numbers.pro true workshops/04_trinary_numbers/04_trinary_numbers.pro false - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug/workshops/04_trinary_numbers + 3768 false true @@ -576,13 +576,13 @@ 05_word_wrapp 05_word_wrapp2 - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/workshops/05_word_wrapp/05_word_wrapp.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/ertev/Desktop/TDD course/tdd-course-2/tdd_intro/workshops/05_word_wrapp/05_word_wrapp.pro true workshops/05_word_wrapp/05_word_wrapp.pro false - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug/workshops/05_word_wrapp + 3768 false true @@ -634,13 +634,13 @@ 02_leap_year - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/02_leap_year/02_leap_year.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/ertev/Desktop/TDD course/tdd-course-2/tdd_intro/homework/02_leap_year/02_leap_year.pro true homework/02_leap_year/02_leap_year.pro false - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug/homework/02_leap_year + 3768 false true @@ -692,13 +692,13 @@ 03_anagram - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/03_anagram/03_anagram.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/ertev/Desktop/TDD course/tdd-course-2/tdd_intro/homework/03_anagram/03_anagram.pro true homework/03_anagram/03_anagram.pro false - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug/homework/03_anagram + 3768 false true @@ -750,13 +750,13 @@ 04_trinary_numbers - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/04_trinary_numbers/04_trinary_numbers.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/ertev/Desktop/TDD course/tdd-course-2/tdd_intro/homework/04_trinary_numbers/04_trinary_numbers.pro true homework/04_trinary_numbers/04_trinary_numbers.pro false - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug/homework/04_trinary_numbers + 3768 false true @@ -808,13 +808,13 @@ 05_word_wrapp - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/05_word_wrapp/05_word_wrapp.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/ertev/Desktop/TDD course/tdd-course-2/tdd_intro/homework/05_word_wrapp/05_word_wrapp.pro true homework/05_word_wrapp/05_word_wrapp.pro false - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug/homework/05_word_wrapp + 3768 false true @@ -866,13 +866,13 @@ 06_bank_ocr - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/06_bank_ocr/06_bank_ocr.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/ertev/Desktop/TDD course/tdd-course-2/tdd_intro/homework/06_bank_ocr/06_bank_ocr.pro true homework/06_bank_ocr/06_bank_ocr.pro false - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug/homework/06_bank_ocr + 3768 false true @@ -924,13 +924,13 @@ 07_filecopier - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/07_filecopier/07_filecopier.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/ertev/Desktop/TDD course/tdd-course-2/tdd_intro/homework/07_filecopier/07_filecopier.pro true homework/07_filecopier/07_filecopier.pro false - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug/homework/07_filecopier + 3768 false true @@ -982,13 +982,13 @@ 08_timer - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/08_timer/08_timer.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/ertev/Desktop/TDD course/tdd-course-2/tdd_intro/homework/08_timer/08_timer.pro true homework/08_timer/08_timer.pro false - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug/homework/08_timer + 3768 false true @@ -1040,13 +1040,13 @@ 01_fizz_buzz - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/workshops/01_fizz_buzz/01_fizz_buzz.pro + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/ertev/Desktop/TDD course/tdd-course-2/tdd_intro/workshops/01_fizz_buzz/01_fizz_buzz.pro true workshops/01_fizz_buzz/01_fizz_buzz.pro false - D:/Study/tdd-course-2/build-tdd_intro-Qt_5_7_0_windows-Debug/workshops/01_fizz_buzz + 3768 false true