From 965284875cae4863c3366d4b659aea12c90dd8d4 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Wed, 28 May 2014 22:41:29 -0400 Subject: [PATCH] Duration - Migrated methods and unit tests from OldDuration to Duration. --- src/Duration.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ src/Duration.h | 5 ++++- test/duration.t.cpp | 35 ++++++++++++++++++++++++++++++++++- 3 files changed, 79 insertions(+), 2 deletions(-) diff --git a/src/Duration.cpp b/src/Duration.cpp index af1360ff3..6ca7d8138 100644 --- a/src/Duration.cpp +++ b/src/Duration.cpp @@ -25,10 +25,12 @@ //////////////////////////////////////////////////////////////////////////////// #include +#include #include #include #include #include +#include #define DAY 86400 #define HOUR 3600 @@ -107,11 +109,50 @@ Duration::Duration () { } +//////////////////////////////////////////////////////////////////////////////// +Duration::Duration (const std::string& input) +: _secs (0) +{ + if (digitsOnly (input)) + { + time_t value = (time_t) strtol (input.c_str (), NULL, 10); + if (value == 0 || value > 60) + { + _secs = value; + return; + } + } + + std::string::size_type idx = 0; + parse (input, idx); +} + //////////////////////////////////////////////////////////////////////////////// Duration::~Duration () { } +//////////////////////////////////////////////////////////////////////////////// +bool Duration::operator< (const Duration& other) +{ + return _secs < other._secs; +} + +//////////////////////////////////////////////////////////////////////////////// +bool Duration::operator> (const Duration& other) +{ + return _secs > other._secs; +} + +//////////////////////////////////////////////////////////////////////////////// +Duration& Duration::operator= (const Duration& other) +{ + if (this != &other) + _secs = other._secs; + + return *this; +} + //////////////////////////////////////////////////////////////////////////////// Duration::operator time_t () const { diff --git a/src/Duration.h b/src/Duration.h index 1b14ae9ce..78aeae928 100644 --- a/src/Duration.h +++ b/src/Duration.h @@ -34,9 +34,12 @@ class Duration { public: Duration (); // Default constructor + Duration (const std::string&); // Parse ~Duration (); // Destructor Duration (const Duration&); // Unimplemented - Duration& operator= (const Duration&); // Unimplemented + bool operator< (const Duration&); + bool operator> (const Duration&); + Duration& operator= (const Duration&); operator time_t () const; bool parse (const std::string&, std::string::size_type&); void clear (); diff --git a/test/duration.t.cpp b/test/duration.t.cpp index 6071eb565..2c5ae43f1 100644 --- a/test/duration.t.cpp +++ b/test/duration.t.cpp @@ -51,7 +51,7 @@ void testParse ( //////////////////////////////////////////////////////////////////////////////// int main (int argc, char** argv) { - UnitTest t (812); + UnitTest t (835); Duration dur; std::string::size_type start = 0; @@ -389,6 +389,39 @@ int main (int argc, char** argv) testParse (t, "10sennight", 10, 140 * day); testParse (t, "1.5sennight", 11, 21 * day); + Duration left, right; + + // operator< + left = Duration ("1sec"); right = Duration ("2secs"); t.ok (left < right, "duration 1sec < 2secs"); + left = Duration ("-2secs"); right = Duration ("-1sec"); t.ok (left < right, "duration -2secs < -1sec"); + left = Duration ("1sec"); right = Duration ("1min"); t.ok (left < right, "duration 1sec < 1min"); + left = Duration ("1min"); right = Duration ("1hr"); t.ok (left < right, "duration 1min < 1hr"); + left = Duration ("1hr"); right = Duration ("1d"); t.ok (left < right, "duration 1hr < 1d"); + left = Duration ("1d"); right = Duration ("1w"); t.ok (left < right, "duration 1d < 1w"); + left = Duration ("1w"); right = Duration ("1mo"); t.ok (left < right, "duration 1w < 1mo"); + left = Duration ("1mo"); right = Duration ("1q"); t.ok (left < right, "duration 1mo < 1q"); + left = Duration ("1q"); right = Duration ("1y"); t.ok (left < right, "duration 1q < 1y"); + + left = Duration ("-3s"); right = Duration ("-6s"); t.ok (right < left, "duration -6s < -3s"); + + // operator> + left = Duration ("2secs"); right = Duration ("1sec"); t.ok (left > right, "2sec > 1secs"); + left = Duration ("-1sec"); right = Duration ("-2secs"); t.ok (left > right, "-1secs > -2sec"); + left = Duration ("1min"); right = Duration ("1sec"); t.ok (left > right, "1min > 1sec"); + left = Duration ("1hr"); right = Duration ("1min"); t.ok (left > right, "1hr > 1min"); + left = Duration ("1d"); right = Duration ("1hr"); t.ok (left > right, "1d > 1hr"); + left = Duration ("1w"); right = Duration ("1d"); t.ok (left > right, "1w > 1d"); + left = Duration ("1mo"); right = Duration ("1w"); t.ok (left > right, "1mo > 1w"); + left = Duration ("1q"); right = Duration ("1mo"); t.ok (left > right, "1q > 1mo"); + left = Duration ("1y"); right = Duration ("1q"); t.ok (left > right, "1y > 1q"); + + left = Duration ("-3s"); right = Duration ("-6s"); t.ok (left > right, "duration -3s > -6s"); + + // operator<= + left = Duration ("1sec"); right = Duration ("2secs"); t.ok (left <= right, "duration 1sec <= 2secs"); + left = Duration ("2secs"); right = Duration ("2secs"); t.ok (left <= right, "duration 1sec <= 2secs"); + left = Duration ("2secs"); right = Duration ("1secs"); t.notok (left <= right, "duration NOT 1sec <= 2secs"); + // TODO Formatting. return 0;