diff --git a/src/Duration.cpp b/src/Duration.cpp index 583ad2b37..e833adfad 100644 --- a/src/Duration.cpp +++ b/src/Duration.cpp @@ -35,6 +35,59 @@ #include "util.h" #include "Duration.h" +static const char* durations[] = +{ + "annual", + "biannual", + "bimonthly", + "biweekly", + "biyearly", + "daily", + "days", + "day", + "d", + "fortnight", + "hours", + "hrs", + "h", + "minutes", + "mins", + "min", + "m", + + "mnths", + "monthly", + "months", + "month", + "mos", + "mo", + "mths", + + "quarterly", + "quarters", + "qrtrs", + "qtrs", + "q", + "seconds", + "secs", + "sec", + "s", + "semiannual", + "sennight", + "weekdays", + "weekly", + "weeks", + "wks", + "w", + "yearly", + "years", + "yrs", + "y", + "-", +}; + +#define NUM_DURATIONS (sizeof (durations) / sizeof (durations[0])) + //////////////////////////////////////////////////////////////////////////////// Duration::Duration () : mSecs (0) @@ -42,6 +95,13 @@ Duration::Duration () { } +//////////////////////////////////////////////////////////////////////////////// +Duration::Duration (const Duration& other) +{ + mSecs = other.mSecs; + mNegative = other.mNegative; +} + //////////////////////////////////////////////////////////////////////////////// Duration::Duration (time_t input) { @@ -59,6 +119,8 @@ Duration::Duration (time_t input) //////////////////////////////////////////////////////////////////////////////// Duration::Duration (const std::string& input) +: mSecs (0) +, mNegative (false) { parse (input); } @@ -73,7 +135,7 @@ Duration::operator time_t () Duration::operator std::string () { std::stringstream s; - s << (mNegative ? -mSecs : mSecs); + s << (mNegative ? - (long) mSecs : (long) mSecs); return s.str (); } @@ -168,80 +230,39 @@ Duration::~Duration () { } +//////////////////////////////////////////////////////////////////////////////// +bool Duration::negative () const +{ + return mNegative; +} + //////////////////////////////////////////////////////////////////////////////// bool Duration::valid (const std::string& input) const { std::string lower_input = lowerCase (input); + // Assume the ordinal is 1, but look for an integer, just in case. + int value = 1; + Nibbler n (lower_input); + n.skipAll (' '); + n.getInt (value); + n.skipAll (' '); + + if (value < 0) + value = -value; + + std::string units; + n.getUntilEOS (units); + + // Auto complete against all supported durations. std::vector supported; - supported.push_back ("daily"); // TODO i18n - supported.push_back ("day"); // TODO i18n - supported.push_back ("weekly"); // TODO i18n - supported.push_back ("weekdays"); // TODO i18n - supported.push_back ("sennight"); // TODO i18n - supported.push_back ("biweekly"); // TODO i18n - supported.push_back ("fortnight"); // TODO i18n - supported.push_back ("monthly"); // TODO i18n - supported.push_back ("bimonthly"); // TODO i18n - supported.push_back ("quarterly"); // TODO i18n - supported.push_back ("biannual"); // TODO i18n - supported.push_back ("biyearly"); // TODO i18n - supported.push_back ("annual"); // TODO i18n - supported.push_back ("semiannual"); // TODO i18n - supported.push_back ("yearly"); // TODO i18n + for (unsigned int i = 0; i < NUM_DURATIONS; ++i) + supported.push_back (durations[i]); std::vector matches; - if (autoComplete (lower_input, supported, matches) == 1) + if (autoComplete (units, supported, matches) == 1) return true; - // Support \s+ -? \d+ \s? s|secs?|m|mins?|h|hrs?|d|days?|wks?|mo|mths?|y|yrs?|- - // Note: Does not support a sign character. That must be external to - // Duration. - Nibbler n (lower_input); - int value; - - n.skipAll (' '); - n.skip ('-'); - - if (n.getUnsignedInt (value)) - { - n.skipAll (' '); - - if (n.getLiteral ("yrs") && n.depleted ()) return true; - else if (n.getLiteral ("yr") && n.depleted ()) return true; - else if (n.getLiteral ("y") && n.depleted ()) return true; - - else if (n.getLiteral ("qtrs") && n.depleted ()) return true; - else if (n.getLiteral ("qtr") && n.depleted ()) return true; - else if (n.getLiteral ("q") && n.depleted ()) return true; - - else if (n.getLiteral ("mths") && n.depleted ()) return true; - else if (n.getLiteral ("mth") && n.depleted ()) return true; - else if (n.getLiteral ("mo") && n.depleted ()) return true; - - else if (n.getLiteral ("wks") && n.depleted ()) return true; - else if (n.getLiteral ("wk") && n.depleted ()) return true; - else if (n.getLiteral ("w") && n.depleted ()) return true; - - else if (n.getLiteral ("days") && n.depleted ()) return true; - else if (n.getLiteral ("day") && n.depleted ()) return true; - else if (n.getLiteral ("d") && n.depleted ()) return true; - - else if (n.getLiteral ("hrs") && n.depleted ()) return true; - else if (n.getLiteral ("hr") && n.depleted ()) return true; - else if (n.getLiteral ("h") && n.depleted ()) return true; - - else if (n.getLiteral ("mins") && n.depleted ()) return true; - else if (n.getLiteral ("min") && n.depleted ()) return true; - else if (n.getLiteral ("m") && n.depleted ()) return true; - - else if (n.getLiteral ("secs") && n.depleted ()) return true; - else if (n.getLiteral ("sec") && n.depleted ()) return true; - else if (n.getLiteral ("s") && n.depleted ()) return true; - - else if (n.getLiteral ("-") && n.depleted ()) return true; - } - return false; } @@ -250,95 +271,98 @@ void Duration::parse (const std::string& input) { std::string lower_input = lowerCase (input); - std::vector supported; - supported.push_back ("daily"); // TODO i18n - supported.push_back ("day"); // TODO i18n - supported.push_back ("weekly"); // TODO i18n - supported.push_back ("weekdays"); // TODO i18n - supported.push_back ("sennight"); // TODO i18n - supported.push_back ("biweekly"); // TODO i18n - supported.push_back ("fortnight"); // TODO i18n - supported.push_back ("monthly"); // TODO i18n - supported.push_back ("bimonthly"); // TODO i18n - supported.push_back ("quarterly"); // TODO i18n - supported.push_back ("biannual"); // TODO i18n - supported.push_back ("biyearly"); // TODO i18n - supported.push_back ("annual"); // TODO i18n - supported.push_back ("semiannual"); // TODO i18n - supported.push_back ("yearly"); // TODO i18n + // Assume the ordinal is 1, but look for an integer, just in case. + int value = 1; + Nibbler n (lower_input); + n.skipAll (' '); + n.getInt (value); - std::vector matches; - if (autoComplete (lower_input, supported, matches) == 1) + n.skipAll (' '); + + if (value < 0) { - std::string found = matches[0]; - - if (found == "daily" || found == "day") mSecs = 86400 * 1; // TODO i18n - else if (found == "weekdays") mSecs = 86400 * 1; // TODO i18n - else if (found == "weekly" || found == "sennight") mSecs = 86400 * 7; // TODO i18n - else if (found == "biweekly" || found == "fortnight") mSecs = 86400 * 14; // TODO i18n - else if (found == "monthly") mSecs = 86400 * 30; // TODO i18n - else if (found == "bimonthly") mSecs = 86400 * 61; // TODO i18n - else if (found == "quarterly") mSecs = 86400 * 91; // TODO i18n - else if (found == "semiannual") mSecs = 86400 * 183; // TODO i18n - else if (found == "yearly" || found == "annual") mSecs = 86400 * 365; // TODO i18n - else if (found == "biannual" || found == "biyearly") mSecs = 86400 * 730; // TODO i18n + mNegative = true; + value = -value; } - - // Support -? \d+ \s? s|secs?|m|mins?|h|hrs?|d|days?|wks?|mo|mths?|y|yrs?|- - // Note: Does not support a sign character. That must be external to - // Duration. else - { - Nibbler n (lower_input); - - n.skipAll (' '); mNegative = false; - if (n.skip ('-')) - mNegative = true; - int value; - if (n.getUnsignedInt (value)) - { - n.skipAll (' '); + std::string units; + n.getUntilEOS (units); - if (n.getLiteral ("yrs") && n.depleted ()) mSecs = value * 86400 * 365; - else if (n.getLiteral ("yr") && n.depleted ()) mSecs = value * 86400 * 365; - else if (n.getLiteral ("y") && n.depleted ()) mSecs = value * 86400 * 365; + // Auto complete against all supported durations. + std::vector supported; + for (unsigned int i = 0; i < NUM_DURATIONS; ++i) + supported.push_back (durations[i]); - else if (n.getLiteral ("qtrs") && n.depleted ()) mSecs = value * 86400 * 91; - else if (n.getLiteral ("qtr") && n.depleted ()) mSecs = value * 86400 * 91; - else if (n.getLiteral ("q") && n.depleted ()) mSecs = value * 86400 * 91; + mSecs = 0; + std::vector matches; + if (autoComplete (units, supported, matches) == 1) + { + std::string match = matches[0]; - else if (n.getLiteral ("mths") && n.depleted ()) mSecs = value * 86400 * 30; - else if (n.getLiteral ("mth") && n.depleted ()) mSecs = value * 86400 * 30; - else if (n.getLiteral ("mo") && n.depleted ()) mSecs = value * 86400 * 30; + if (match == "biannual") mSecs = value * 86400 * 730; + else if (match == "biyearly") mSecs = value * 86400 * 730; - else if (n.getLiteral ("wks") && n.depleted ()) mSecs = value * 86400 * 7; - else if (n.getLiteral ("wk") && n.depleted ()) mSecs = value * 86400 * 7; - else if (n.getLiteral ("w") && n.depleted ()) mSecs = value * 86400 * 7; + else if (match == "yearly") mSecs = value * 86400 * 365; + else if (match == "annual") mSecs = value * 86400 * 365; + else if (match == "years") mSecs = value * 86400 * 365; + else if (match == "yrs") mSecs = value * 86400 * 365; + else if (match == "y") mSecs = value * 86400 * 365; + else if (match == "yearly") mSecs = value * 86400 * 365; + else if (match == "annual") mSecs = value * 86400 * 365; - else if (n.getLiteral ("days") && n.depleted ()) mSecs = value * 86400; - else if (n.getLiteral ("day") && n.depleted ()) mSecs = value * 86400; - else if (n.getLiteral ("d") && n.depleted ()) mSecs = value * 86400; + else if (match == "semiannual") mSecs = value * 86400 * 183; - else if (n.getLiteral ("hrs") && n.depleted ()) mSecs = value * 3600; - else if (n.getLiteral ("hr") && n.depleted ()) mSecs = value * 3600; - else if (n.getLiteral ("h") && n.depleted ()) mSecs = value * 3600; + else if (match == "bimonthly") mSecs = value * 86400 * 61; + else if (match == "quarterly") mSecs = value * 86400 * 91; + else if (match == "quarters") mSecs = value * 86400 * 91; + else if (match == "qrtrs") mSecs = value * 86400 * 91; + else if (match == "qtrs") mSecs = value * 86400 * 91; + else if (match == "q") mSecs = value * 86400 * 91; - else if (n.getLiteral ("mins") && n.depleted ()) mSecs = value * 60; - else if (n.getLiteral ("min") && n.depleted ()) mSecs = value * 60; - else if (n.getLiteral ("m") && n.depleted ()) mSecs = value * 60; + else if (match == "monthly") mSecs = value * 86400 * 30; + else if (match == "month") mSecs = value * 86400 * 30; + else if (match == "months") mSecs = value * 86400 * 30; + else if (match == "mnths") mSecs = value * 86400 * 30; + else if (match == "mos") mSecs = value * 86400 * 30; + else if (match == "mo") mSecs = value * 86400 * 30; + else if (match == "mths") mSecs = value * 86400 * 30; - else if (n.getLiteral ("secs") && n.depleted ()) mSecs = value; - else if (n.getLiteral ("sec") && n.depleted ()) mSecs = value; - else if (n.getLiteral ("s") && n.depleted ()) mSecs = value; + else if (match == "biweekly") mSecs = value * 86400 * 14; + else if (match == "fortnight") mSecs = value * 86400 * 14; - else if (n.getLiteral ("-") && n.depleted ()) mSecs = 0; - } + else if (match == "weekly") mSecs = value * 86400 * 7; + else if (match == "sennight") mSecs = value * 86400 * 7; + else if (match == "weeks") mSecs = value * 86400 * 7; + else if (match == "wks") mSecs = value * 86400 * 7; + else if (match == "w") mSecs = value * 86400 * 7; + + else if (match == "daily") mSecs = value * 86400 * 1; + else if (match == "day") mSecs = value * 86400 * 1; + else if (match == "weekdays") mSecs = value * 86400 * 1; + else if (match == "days") mSecs = value * 86400 * 1; + else if (match == "d") mSecs = value * 86400 * 1; + + else if (match == "hours") mSecs = value * 3600; + else if (match == "hrs") mSecs = value * 3600; + else if (match == "h") mSecs = value * 3600; + + else if (match == "minutes") mSecs = value * 60; + else if (match == "mins") mSecs = value * 60; + else if (match == "min") mSecs = value * 60; + else if (match == "m") mSecs = value * 60; + + else if (match == "seconds") mSecs = value; + else if (match == "secs") mSecs = value; + else if (match == "sec") mSecs = value; + else if (match == "s") mSecs = value; + + else if (match == "-") mSecs = 0; } if (mSecs == 0) - throw std::string ("The duration '") + input + "' was not recognized."; // TODO i18n + throw std::string ("The duration '") + input + "' was not recognized."; } //////////////////////////////////////////////////////////////////////////////// diff --git a/src/Duration.h b/src/Duration.h index ac0a0c2e5..cb5e7982a 100644 --- a/src/Duration.h +++ b/src/Duration.h @@ -34,7 +34,8 @@ class Duration { public: Duration (); // Default constructor - Duration (time_t); // Default constructor + Duration (const Duration&); // Copy constructor + Duration (time_t); // Constructor Duration (const std::string&); // Parse bool operator< (const Duration&); bool operator> (const Duration&); @@ -47,6 +48,7 @@ public: std::string format () const; std::string formatCompact () const; + bool negative () const; bool valid (const std::string&) const; void parse (const std::string&); diff --git a/src/tests/duration.t.cpp b/src/tests/duration.t.cpp index 07c88c374..f2bd1efb0 100644 --- a/src/tests/duration.t.cpp +++ b/src/tests/duration.t.cpp @@ -506,169 +506,169 @@ int main (int argc, char** argv) d = Duration (364*86400), t.is (d.formatCompact (), "11mo", "364*86400 -> 11mo"); d = Duration (365*86400), t.is (d.formatCompact (), "1.0y", "365*86400 -> 1.0y"); - t.ok (d.valid ("daily"), "valid duration daily = 1"); - t.ok (d.valid ("day"), "valid duration day = 1"); - t.ok (d.valid ("weekly"), "valid duration weekly = 7"); - t.ok (d.valid ("weekdays"), "valid duration weekdays = 1"); - t.ok (d.valid ("sennight"), "valid duration sennight = 7"); - t.ok (d.valid ("biweekly"), "valid duration biweekly = 14"); - t.ok (d.valid ("fortnight"), "valid duration fortnight = 14"); - t.ok (d.valid ("monthly"), "valid duration monthly = 30"); - t.ok (d.valid ("bimonthly"), "valid duration bimonthly = 61"); - t.ok (d.valid ("quarterly"), "valid duration quarterly = 91"); - t.ok (d.valid ("annual"), "valid duration annual = 365"); - t.ok (d.valid ("yearly"), "valid duration yearly = 365"); - t.ok (d.valid ("semiannual"), "valid duration semiannual = 183"); - t.ok (d.valid ("biannual"), "valid duration biannual = 730"); - t.ok (d.valid ("biyearly"), "valid duration biyearly = 730"); + t.ok (d.valid ("daily"), "valid duration daily"); + t.ok (d.valid ("day"), "valid duration day"); + t.ok (d.valid ("weekly"), "valid duration weekly"); + t.ok (d.valid ("weekdays"), "valid duration weekdays"); + t.ok (d.valid ("sennight"), "valid duration sennight"); + t.ok (d.valid ("biweekly"), "valid duration biweekly"); + t.ok (d.valid ("fortnight"), "valid duration fortnight"); + t.ok (d.valid ("monthly"), "valid duration monthly"); + t.ok (d.valid ("bimonthly"), "valid duration bimonthly"); + t.ok (d.valid ("quarterly"), "valid duration quarterly"); + t.ok (d.valid ("annual"), "valid duration annual"); + t.ok (d.valid ("yearly"), "valid duration yearly"); + t.ok (d.valid ("semiannual"), "valid duration semiannual"); + t.ok (d.valid ("biannual"), "valid duration biannual"); + t.ok (d.valid ("biyearly"), "valid duration biyearly"); - t.ok (d.valid ("0 yrs"), "valid duration 0 yrs = 0"); - t.ok (d.valid ("0 yr"), "valid duration 0 yr = 0"); - t.ok (d.valid ("0y"), "valid duration 0y = 0"); - t.ok (d.valid ("1 yrs"), "valid duration 1 yrs = 365"); - t.ok (d.valid ("1 yr"), "valid duration 1 yr = 365"); - t.ok (d.valid ("1y"), "valid duration 1y = 365"); - t.ok (d.valid ("10 yrs"), "valid duration 10 yrs = 3650"); - t.ok (d.valid ("10 yr"), "valid duration 10 yr = 3650"); - t.ok (d.valid ("10y"), "valid duration 10y = 3650"); + t.ok (d.valid ("0 yrs"), "valid duration 0 yrs"); + t.ok (d.valid ("0 yr"), "valid duration 0 yr"); + t.ok (d.valid ("0y"), "valid duration 0y"); + t.ok (d.valid ("1 yrs"), "valid duration 1 yrs"); + t.ok (d.valid ("1 yr"), "valid duration 1 yr"); + t.ok (d.valid ("1y"), "valid duration 1y"); + t.ok (d.valid ("10 yrs"), "valid duration 10 yrs"); + t.ok (d.valid ("10 yr"), "valid duration 10 yr"); + t.ok (d.valid ("10y"), "valid duration 10y"); - t.ok (d.valid ("0 qtrs"), "valid duration 0 qtrs = 0"); - t.ok (d.valid ("0 qtr"), "valid duration 0 qtr = 0"); - t.ok (d.valid ("0q"), "valid duration 0q = 0"); - t.ok (d.valid ("1 qtrs"), "valid duration 1 qtrs = 91"); - t.ok (d.valid ("1 qtr"), "valid duration 1 qtr = 91"); - t.ok (d.valid ("1q"), "valid duration 1q = 91"); - t.ok (d.valid ("10 qtrs"), "valid duration 10 qtrs = 910"); - t.ok (d.valid ("10 qtr"), "valid duration 10 qtr = 910"); - t.ok (d.valid ("10q"), "valid duration 10q = 910"); + t.ok (d.valid ("0 qtrs"), "valid duration 0 qtrs"); + t.ok (d.valid ("0 qtr"), "valid duration 0 qtr"); + t.ok (d.valid ("0q"), "valid duration 0q"); + t.ok (d.valid ("1 qtrs"), "valid duration 1 qtrs"); + t.ok (d.valid ("1 qtr"), "valid duration 1 qtr"); + t.ok (d.valid ("1q"), "valid duration 1q"); + t.ok (d.valid ("10 qtrs"), "valid duration 10 qtrs"); + t.ok (d.valid ("10 qtr"), "valid duration 10 qtr"); + t.ok (d.valid ("10q"), "valid duration 10q"); - t.ok (d.valid ("0 mths"), "valid duration 0 mths = 0"); - t.ok (d.valid ("0 mth"), "valid duration 0 mth = 0"); - t.ok (d.valid ("0mo"), "valid duration 0mo = 0"); - t.ok (d.valid ("1 mths"), "valid duration 1 mths = 30"); - t.ok (d.valid ("1 mth"), "valid duration 1 mth = 30"); - t.ok (d.valid ("1mo"), "valid duration 1mo = 30"); - t.ok (d.valid ("10 mths"), "valid duration 10 mths = 300"); - t.ok (d.valid ("10 mth"), "valid duration 10 mth = 300"); - t.ok (d.valid ("10mo"), "valid duration 10mo = 300"); + t.ok (d.valid ("0 mnths"), "valid duration 0 mths"); + t.ok (d.valid ("0 mnth"), "valid duration 0 mth"); + t.ok (d.valid ("0mo"), "valid duration 0mo"); + t.ok (d.valid ("1 mnths"), "valid duration 1 mths"); + t.ok (d.valid ("1 mth"), "valid duration 1 mth"); + t.ok (d.valid ("1mo"), "valid duration 1mo"); + t.ok (d.valid ("10 mnths"), "valid duration 10 mths"); + t.ok (d.valid ("10 mnth"), "valid duration 10 mth"); + t.ok (d.valid ("10mo"), "valid duration 10mo"); - t.ok (d.valid ("0 wks"), "valid duration 0 wks = 0"); - t.ok (d.valid ("0 wk"), "valid duration 0 wk = 0"); - t.ok (d.valid ("0w"), "valid duration 0w = 0"); - t.ok (d.valid ("1 wks"), "valid duration 1 wks = 7"); - t.ok (d.valid ("1 wk"), "valid duration 1 wk = 7"); - t.ok (d.valid ("1w"), "valid duration 1w = 7"); - t.ok (d.valid ("10 wks"), "valid duration 10 wks = 70"); - t.ok (d.valid ("10 wk"), "valid duration 10 wk = 70"); - t.ok (d.valid ("10w"), "valid duration 10w = 70"); + t.ok (d.valid ("0 wks"), "valid duration 0 wks"); + t.ok (d.valid ("0 wk"), "valid duration 0 wk"); + t.ok (d.valid ("0w"), "valid duration 0w"); + t.ok (d.valid ("1 wks"), "valid duration 1 wks"); + t.ok (d.valid ("1 wk"), "valid duration 1 wk"); + t.ok (d.valid ("1w"), "valid duration 1w"); + t.ok (d.valid ("10 wks"), "valid duration 10 wks"); + t.ok (d.valid ("10 wk"), "valid duration 10 wk"); + t.ok (d.valid ("10w"), "valid duration 10w"); - t.ok (d.valid ("0 days"), "valid duration 0 days = 0"); - t.ok (d.valid ("0 day"), "valid duration 0 day = 0"); - t.ok (d.valid ("0d"), "valid duration 0d = 0"); - t.ok (d.valid ("1 days"), "valid duration 1 days = 1"); - t.ok (d.valid ("1 day"), "valid duration 1 day = 1"); - t.ok (d.valid ("1d"), "valid duration 1d = 1"); - t.ok (d.valid ("10 days"), "valid duration 10 days = 10"); - t.ok (d.valid ("10 day"), "valid duration 10 day = 10"); - t.ok (d.valid ("10d"), "valid duration 10d = 10"); + t.ok (d.valid ("0 days"), "valid duration 0 days"); + t.ok (d.valid ("0 day"), "valid duration 0 day"); + t.ok (d.valid ("0d"), "valid duration 0d"); + t.ok (d.valid ("1 days"), "valid duration 1 days"); + t.ok (d.valid ("1 day"), "valid duration 1 day"); + t.ok (d.valid ("1d"), "valid duration 1d"); + t.ok (d.valid ("10 days"), "valid duration 10 days"); + t.ok (d.valid ("10 day"), "valid duration 10 day"); + t.ok (d.valid ("10d"), "valid duration 10d"); - t.ok (d.valid ("0 hrs"), "valid duration 0 hrs = 0"); - t.ok (d.valid ("0 hr"), "valid duration 0 hr = 0"); - t.ok (d.valid ("0h"), "valid duration 0h = 0"); - t.ok (d.valid ("1 hrs"), "valid duration 1 hrs = 0"); - t.ok (d.valid ("1 hr"), "valid duration 1 hr = 0"); - t.ok (d.valid ("1h"), "valid duration 1h = 0"); - t.ok (d.valid ("10 hrs"), "valid duration 10 hrs = 0"); - t.ok (d.valid ("10 hr"), "valid duration 10 hr = 0"); - t.ok (d.valid ("10h"), "valid duration 10h = 0"); + t.ok (d.valid ("0 hrs"), "valid duration 0 hrs"); + t.ok (d.valid ("0 hr"), "valid duration 0 hr"); + t.ok (d.valid ("0h"), "valid duration 0h"); + t.ok (d.valid ("1 hrs"), "valid duration 1 hrs"); + t.ok (d.valid ("1 hr"), "valid duration 1 hr"); + t.ok (d.valid ("1h"), "valid duration 1h"); + t.ok (d.valid ("10 hrs"), "valid duration 10 hrs"); + t.ok (d.valid ("10 hr"), "valid duration 10 hr"); + t.ok (d.valid ("10h"), "valid duration 10h"); - t.ok (d.valid ("0 mins"), "valid duration 0 mins = 0"); + t.ok (d.valid ("0 mins"), "valid duration 0 mins"); t.ok (d.valid ("0 min"), "valid duration 0 min"); - t.ok (d.valid ("0m"), "valid duration 0m = 0"); - t.ok (d.valid ("1 mins"), "valid duration 1 mins = 0"); - t.ok (d.valid ("1 min"), "valid duration 1 min = 0"); - t.ok (d.valid ("1m"), "valid duration 1m = 0"); - t.ok (d.valid ("10 mins"), "valid duration 10 mins = 0"); - t.ok (d.valid ("10 min"), "valid duration 10 min = 0"); - t.ok (d.valid ("10m"), "valid duration 10m = 0"); + t.ok (d.valid ("0m"), "valid duration 0m"); + t.ok (d.valid ("1 mins"), "valid duration 1 mins"); + t.ok (d.valid ("1 min"), "valid duration 1 min"); + t.ok (d.valid ("1m"), "valid duration 1m"); + t.ok (d.valid ("10 mins"), "valid duration 10 mins"); + t.ok (d.valid ("10 min"), "valid duration 10 min"); + t.ok (d.valid ("10m"), "valid duration 10m"); - t.ok (d.valid ("0 secs"), "valid duration 0 secs = 0"); - t.ok (d.valid ("0 sec"), "valid duration 0 sec = 0"); - t.ok (d.valid ("0s"), "valid duration 0s = 0"); - t.ok (d.valid ("1 secs"), "valid duration 1 secs = 0"); - t.ok (d.valid ("1 sec"), "valid duration 1 sec = 0"); - t.ok (d.valid ("1s"), "valid duration 1s = 0"); - t.ok (d.valid ("10 secs"), "valid duration 10 secs = 0"); - t.ok (d.valid ("10 sec"), "valid duration 10 sec = 0"); - t.ok (d.valid ("10s"), "valid duration 10s = 0"); + t.ok (d.valid ("0 secs"), "valid duration 0 secs"); + t.ok (d.valid ("0 sec"), "valid duration 0 sec"); + t.ok (d.valid ("0s"), "valid duration 0s"); + t.ok (d.valid ("1 secs"), "valid duration 1 secs"); + t.ok (d.valid ("1 sec"), "valid duration 1 sec"); + t.ok (d.valid ("1s"), "valid duration 1s"); + t.ok (d.valid ("10 secs"), "valid duration 10 secs"); + t.ok (d.valid ("10 sec"), "valid duration 10 sec"); + t.ok (d.valid ("10s"), "valid duration 10s"); t.notok (d.valid ("woof"), "valid duration woof = fail"); - t.is (convertDuration ("daily"), 1, "valid duration daily = 1"); - t.is (convertDuration ("day"), 1, "valid duration day = 1"); - t.is (convertDuration ("weekly"), 7, "valid duration weekly = 7"); - t.is (convertDuration ("weekdays"), 1, "valid duration weekdays = 1"); - t.is (convertDuration ("sennight"), 7, "valid duration sennight = 7"); - t.is (convertDuration ("biweekly"), 14, "valid duration biweekly = 14"); - t.is (convertDuration ("fortnight"), 14, "valid duration fortnight = 14"); - t.is (convertDuration ("monthly"), 30, "valid duration monthly = 30"); - t.is (convertDuration ("bimonthly"), 61, "valid duration bimonthly = 61"); - t.is (convertDuration ("quarterly"), 91, "valid duration quarterly = 91"); - t.is (convertDuration ("annual"), 365, "valid duration annual = 365"); - t.is (convertDuration ("yearly"), 365, "valid duration yearly = 365"); - t.is (convertDuration ("semiannual"), 183, "valid duration semiannual = 183"); - t.is (convertDuration ("biannual"), 730, "valid duration biannual = 730"); - t.is (convertDuration ("biyearly"), 730, "valid duration biyearly = 730"); + t.is (convertDuration ("daily"), 1, "valid duration daily"); + t.is (convertDuration ("day"), 1, "valid duration day"); + t.is (convertDuration ("weekly"), 7, "valid duration weekly"); + t.is (convertDuration ("weekdays"), 1, "valid duration weekdays"); + t.is (convertDuration ("sennight"), 7, "valid duration sennight"); + t.is (convertDuration ("biweekly"), 14, "valid duration biweekly"); + t.is (convertDuration ("fortnight"), 14, "valid duration fortnight"); + t.is (convertDuration ("monthly"), 30, "valid duration monthly"); + t.is (convertDuration ("bimonthly"), 61, "valid duration bimonthly"); + t.is (convertDuration ("quarterly"), 91, "valid duration quarterly"); + t.is (convertDuration ("annual"), 365, "valid duration annual"); + t.is (convertDuration ("yearly"), 365, "valid duration yearly"); + t.is (convertDuration ("semiannual"), 183, "valid duration semiannual"); + t.is (convertDuration ("biannual"), 730, "valid duration biannual"); + t.is (convertDuration ("biyearly"), 730, "valid duration biyearly"); - t.is (convertDuration ("0 yrs"), 0, "valid duration 0 yrs = 0"); - t.is (convertDuration ("0 yr"), 0, "valid duration 0 yr = 0"); - t.is (convertDuration ("0y"), 0, "valid duration 0y = 0"); - t.is (convertDuration ("1 yrs"), 365, "valid duration 1 yrs = 365"); - t.is (convertDuration ("1 yr"), 365, "valid duration 1 yr = 365"); - t.is (convertDuration ("1y"), 365, "valid duration 1y = 365"); - t.is (convertDuration ("10 yrs"), 3650, "valid duration 10 yrs = 3650"); - t.is (convertDuration ("10 yr"), 3650, "valid duration 10 yr = 3650"); - t.is (convertDuration ("10y"), 3650, "valid duration 10y = 3650"); + t.is (convertDuration ("0 yrs"), 0, "valid duration 0 yrs"); + t.is (convertDuration ("0 yr"), 0, "valid duration 0 yr"); + t.is (convertDuration ("0y"), 0, "valid duration 0y"); + t.is (convertDuration ("1 yrs"), 365, "valid duration 1 yrs"); + t.is (convertDuration ("1 yr"), 365, "valid duration 1 yr"); + t.is (convertDuration ("1y"), 365, "valid duration 1y"); + t.is (convertDuration ("10 yrs"), 3650, "valid duration 10 yrs"); + t.is (convertDuration ("10 yr"), 3650, "valid duration 10 yr"); + t.is (convertDuration ("10y"), 3650, "valid duration 10y"); - t.is (convertDuration ("0 qtrs"), 0, "valid duration 0 qtrs = 0"); - t.is (convertDuration ("0 qtr"), 0, "valid duration 0 qtr = 0"); - t.is (convertDuration ("0q"), 0, "valid duration 0q = 0"); - t.is (convertDuration ("1 qtrs"), 91, "valid duration 1 qtrs = 91"); - t.is (convertDuration ("1 qtr"), 91, "valid duration 1 qtr = 91"); - t.is (convertDuration ("1q"), 91, "valid duration 1q = 91"); - t.is (convertDuration ("10 qtrs"), 910, "valid duration 10 qtrs = 910"); - t.is (convertDuration ("10 qtr"), 910, "valid duration 10 qtr = 910"); - t.is (convertDuration ("10q"), 910, "valid duration 10q = 910"); + t.is (convertDuration ("0 qtrs"), 0, "valid duration 0 qtrs"); + t.is (convertDuration ("0 qtr"), 0, "valid duration 0 qtr"); + t.is (convertDuration ("0q"), 0, "valid duration 0q"); + t.is (convertDuration ("1 qtrs"), 91, "valid duration 1 qtrs"); + t.is (convertDuration ("1 qtr"), 91, "valid duration 1 qtr"); + t.is (convertDuration ("1q"), 91, "valid duration 1q"); + t.is (convertDuration ("10 qtrs"), 910, "valid duration 10 qtrs"); + t.is (convertDuration ("10 qtr"), 910, "valid duration 10 qtr"); + t.is (convertDuration ("10q"), 910, "valid duration 10q"); - t.is (convertDuration ("0 mths"), 0, "valid duration 0 mths = 0"); - t.is (convertDuration ("0 mth"), 0, "valid duration 0 mth = 0"); - t.is (convertDuration ("0mo"), 0, "valid duration 0mo = 0"); - t.is (convertDuration ("1 mths"), 30, "valid duration 1 mths = 30"); - t.is (convertDuration ("1 mth"), 30, "valid duration 1 mth = 30"); - t.is (convertDuration ("1mo"), 30, "valid duration 1mo = 30"); - t.is (convertDuration ("10 mths"), 300, "valid duration 10 mths = 300"); - t.is (convertDuration ("10 mth"), 300, "valid duration 10 mth = 300"); - t.is (convertDuration ("10mo"), 300, "valid duration 10mo = 300"); + t.is (convertDuration ("0 mths"), 0, "valid duration 0 mths"); + t.is (convertDuration ("0 mth"), 0, "valid duration 0 mth"); + t.is (convertDuration ("0mo"), 0, "valid duration 0mo"); + t.is (convertDuration ("1 mths"), 30, "valid duration 1 mths"); + t.is (convertDuration ("1 mth"), 30, "valid duration 1 mth"); + t.is (convertDuration ("1mo"), 30, "valid duration 1mo"); + t.is (convertDuration ("10 mths"), 300, "valid duration 10 mths"); + t.is (convertDuration ("10 mth"), 300, "valid duration 10 mth"); + t.is (convertDuration ("10mo"), 300, "valid duration 10mo"); - t.is (convertDuration ("0 wks"), 0, "valid duration 0 wks = 0"); - t.is (convertDuration ("0 wk"), 0, "valid duration 0 wk = 0"); - t.is (convertDuration ("0w"), 0, "valid duration 0w = 0"); - t.is (convertDuration ("1 wks"), 7, "valid duration 1 wks = 7"); - t.is (convertDuration ("1 wk"), 7, "valid duration 1 wk = 7"); - t.is (convertDuration ("1w"), 7, "valid duration 1w = 7"); - t.is (convertDuration ("10 wks"), 70, "valid duration 10 wks = 70"); - t.is (convertDuration ("10 wk"), 70, "valid duration 10 wk = 70"); - t.is (convertDuration ("10w"), 70, "valid duration 10w = 70"); + t.is (convertDuration ("0 wks"), 0, "valid duration 0 wks"); + t.is (convertDuration ("0 wk"), 0, "valid duration 0 wk"); + t.is (convertDuration ("0w"), 0, "valid duration 0w"); + t.is (convertDuration ("1 wks"), 7, "valid duration 1 wks"); + t.is (convertDuration ("1 wk"), 7, "valid duration 1 wk"); + t.is (convertDuration ("1w"), 7, "valid duration 1w"); + t.is (convertDuration ("10 wks"), 70, "valid duration 10 wks"); + t.is (convertDuration ("10 wk"), 70, "valid duration 10 wk"); + t.is (convertDuration ("10w"), 70, "valid duration 10w"); - t.is (convertDuration ("0 days"), 0, "valid duration 0 days = 0"); - t.is (convertDuration ("0 day"), 0, "valid duration 0 day = 0"); - t.is (convertDuration ("0d"), 0, "valid duration 0d = 0"); - t.is (convertDuration ("1 days"), 1, "valid duration 1 days = 1"); - t.is (convertDuration ("1 day"), 1, "valid duration 1 day = 1"); - t.is (convertDuration ("1d"), 1, "valid duration 1d = 1"); - t.is (convertDuration ("10 days"), 10, "valid duration 10 days = 10"); - t.is (convertDuration ("10 day"), 10, "valid duration 10 day = 10"); - t.is (convertDuration ("10d"), 10, "valid duration 10d = 10"); + t.is (convertDuration ("0 days"), 0, "valid duration 0 days"); + t.is (convertDuration ("0 day"), 0, "valid duration 0 day"); + t.is (convertDuration ("0d"), 0, "valid duration 0d"); + t.is (convertDuration ("1 days"), 1, "valid duration 1 days"); + t.is (convertDuration ("1 day"), 1, "valid duration 1 day"); + t.is (convertDuration ("1d"), 1, "valid duration 1d"); + t.is (convertDuration ("10 days"), 10, "valid duration 10 days"); + t.is (convertDuration ("10 day"), 10, "valid duration 10 day"); + t.is (convertDuration ("10d"), 10, "valid duration 10d"); try { @@ -700,6 +700,8 @@ int main (int argc, char** argv) catch (const std::string& e) { t.diag (e); } catch (...) { t.diag ("Unknown error"); } + // TODO Duration::negative + return 0; } diff --git a/src/util.cpp b/src/util.cpp index 632bb700b..e0dd40ecf 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -195,8 +195,8 @@ int autoComplete ( } // Maintain a list of partial matches. - if (length <= item->length () && - partial == item->substr (0, length)) + else if (length <= item->length () && + partial == item->substr (0, length)) matches.push_back (*item); } }