Browse Source

Added Date class

- added Date class to wrap timestamp functionality
- added tests for Date class
pcmattulat 4 years ago
parent
commit
f217aff6d0
4 changed files with 183 additions and 2 deletions
  1. 5 2
      CMakeLists.txt
  2. 52 0
      source/time/Date.cpp
  3. 44 0
      source/time/Date.hpp
  4. 82 0
      test/cases/time/DateTest.cpp

+ 5 - 2
CMakeLists.txt

@@ -47,14 +47,17 @@ set(SOURCE_FILES
         ${CMAKE_CURRENT_SOURCE_DIR}/source/boxing/Double.hpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/boxing/Double.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/boxing/String.hpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/boxing/String.cpp)
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/boxing/String.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/time/Date.hpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/time/Date.cpp)
 
 set(TEST_FILES
         ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/boxing/IntegerTest.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/boxing/BooleanTest.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/boxing/FloatTest.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/boxing/DoubleTest.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/boxing/StringTest.cpp)
+        ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/boxing/StringTest.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/time/DateTest.cpp)
 
 ##########################################################
 # Build

+ 52 - 0
source/time/Date.cpp

@@ -0,0 +1,52 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-14
+ * Changed:         2020-08-14
+ *
+ * */
+
+#include <iomanip>
+#include <sstream>
+#include "Date.hpp"
+
+ls_std::Date::Date() : Class("Date")
+{
+  this->timestamp = std::time(nullptr);
+  this->init();
+}
+
+ls_std::Date & ls_std::Date::operator+(int _value) {
+  this->timestamp += (_value * 86400);
+  return *this;
+}
+
+bool ls_std::Date::after(Date foreignDate) {
+  return this->timestamp > foreignDate.getTime();
+}
+
+bool ls_std::Date::before(Date foreignDate) {
+  return this->timestamp < foreignDate.getTime();
+}
+
+time_t ls_std::Date::getTime() {
+  return this->timestamp;
+}
+
+void ls_std::Date::setTime(time_t _timestamp) {
+  this->timestamp = _timestamp;
+  this->init();
+}
+
+std::string ls_std::Date::toString() {
+  std::stringstream _stream {};
+  _stream << std::put_time(this->localTime, "%Y-%m-%d %H:%M:%S");
+
+  return _stream.str();
+}
+
+void ls_std::Date::init() {
+  this->localTime = std::localtime(&this->timestamp);
+  this->localTime->tm_mon += 1;
+}

+ 44 - 0
source/time/Date.hpp

@@ -0,0 +1,44 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-14
+ * Changed:         2020-08-14
+ *
+ * */
+
+#ifndef DATE_HPP
+#define DATE_HPP
+
+#include "../base/Class.hpp"
+#include <ctime>
+
+namespace ls_std {
+  class Date : public Class {
+    public:
+
+      Date();
+      ~Date() = default;
+
+      // arithmetic operators
+
+      Date& operator+(int _value);
+
+      // additional functionality
+
+      bool after(Date foreignDate);
+      bool before(Date foreignDate);
+      time_t getTime();
+      void setTime(time_t _timestamp);
+      std::string toString();
+
+    private:
+
+      time_t timestamp {};
+      tm* localTime {};
+
+      void init();
+  };
+}
+
+#endif

+ 82 - 0
test/cases/time/DateTest.cpp

@@ -0,0 +1,82 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-14
+ * Changed:         2020-08-14
+ *
+ * */
+
+#include <gtest/gtest.h>
+#include <regex>
+#include "../../../source/time/Date.hpp"
+
+namespace {
+  class DateTest : public ::testing::Test {
+    protected:
+
+      DateTest() = default;
+      ~DateTest() override = default;
+
+      void SetUp() override {}
+      void TearDown() override {}
+  };
+
+  // arithmetic operators
+
+  TEST_F(DateTest, operatorAdd)
+  {
+    ls_std::Date date {};
+    time_t timestamp = date.getTime();
+
+    date = date + 1;
+    ASSERT_EQ(timestamp + 86400, date.getTime());
+  }
+
+  // additional functionality
+
+  TEST_F(DateTest, after)
+  {
+    ls_std::Date date {};
+
+    ls_std::Date date2 {};
+    date2.setTime(1000000);
+
+    ASSERT_TRUE(date.after(date2));
+  }
+
+  TEST_F(DateTest, before)
+  {
+    ls_std::Date date {};
+    date.setTime(1000000);
+
+    ls_std::Date date2 {};
+
+    ASSERT_TRUE(date.before(date2));
+  }
+
+  TEST_F(DateTest, getTime)
+  {
+    ls_std::Date date {};
+    ASSERT_TRUE(date.getTime() > 0);
+  }
+
+  TEST_F(DateTest, setTime)
+  {
+    ls_std::Date date {};
+    ASSERT_TRUE(date.getTime() > 1000000);
+
+    date.setTime(1000);
+    ASSERT_EQ(1000, date.getTime());
+  }
+
+  TEST_F(DateTest, toString)
+  {
+    ls_std::Date date {};
+    std::string regexSearchString = R"((\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}))";
+    std::regex _regex {regexSearchString};
+    std::string dateString = date.toString();
+
+    ASSERT_TRUE(std::regex_match(dateString, _regex));
+  }
+}