diff --git a/src/Duration.cpp b/src/Duration.cpp index 01d5f5d33..550fa6554 100644 --- a/src/Duration.cpp +++ b/src/Duration.cpp @@ -108,22 +108,48 @@ bool Duration::valid (const std::string& input) const if (autoComplete (lower_input, supported, matches) == 1) return true; - // Support \d+ d|w|m|q|y - // Verify all digits followed by d, w, m, q, or y. - unsigned int length = lower_input.length (); - for (unsigned int i = 0; i < length; ++i) + // 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. + Nibbler n (lower_input); + int value; + if (n.getUnsignedInt (value)) { - if (! isdigit (lower_input[i]) && - i == length - 1) - { - std::string type = lower_input.substr (length - 1); - if (type == "d" || // TODO i18n - type == "w" || // TODO i18n - type == "m" || // TODO i18n - type == "q" || // TODO i18n - type == "y") // TODO i18n - return true; - } + n.skip (' '); + + 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; @@ -168,27 +194,50 @@ void Duration::parse (const std::string& input) else if (found == "biannual" || found == "biyearly") mDays = 730; // TODO i18n } - // Support \d+ d|w|m|q|y + // 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 { - // Verify all digits followed by d, w, m, q, or y. - unsigned int length = lower_input.length (); - for (unsigned int i = 0; i < length; ++i) + Nibbler n (lower_input); + int value; + if (n.getUnsignedInt (value)) { - if (! isdigit (lower_input[i]) && - i == length - 1) - { - int number = atoi (lower_input.substr (0, i).c_str ()); + n.skip (' '); - switch (lower_input[length - 1]) - { - case 'd': mDays = number * 1; break; // TODO i18n - case 'w': mDays = number * 7; break; // TODO i18n - case 'm': mDays = number * 30; break; // TODO i18n - case 'q': mDays = number * 91; break; // TODO i18n - case 'y': mDays = number * 365; break; // TODO i18n - } - } + if (n.getLiteral ("yrs") && n.depleted ()) mDays = value * 365; + else if (n.getLiteral ("yr") && n.depleted ()) mDays = value * 365; + else if (n.getLiteral ("y") && n.depleted ()) mDays = value * 365; + + else if (n.getLiteral ("qtrs") && n.depleted ()) mDays = value * 91; + else if (n.getLiteral ("qtr") && n.depleted ()) mDays = value * 91; + else if (n.getLiteral ("q") && n.depleted ()) mDays = value * 91; + + else if (n.getLiteral ("mths") && n.depleted ()) mDays = value * 30; + else if (n.getLiteral ("mth") && n.depleted ()) mDays = value * 30; + else if (n.getLiteral ("mo") && n.depleted ()) mDays = value * 30; + + else if (n.getLiteral ("wks") && n.depleted ()) mDays = value * 7; + else if (n.getLiteral ("wk") && n.depleted ()) mDays = value * 7; + else if (n.getLiteral ("w") && n.depleted ()) mDays = value * 7; + + else if (n.getLiteral ("days") && n.depleted ()) mDays = value * 1; + else if (n.getLiteral ("day") && n.depleted ()) mDays = value * 1; + else if (n.getLiteral ("d") && n.depleted ()) mDays = value * 1; + + else if (n.getLiteral ("hrs") && n.depleted ()) mDays = 0; + else if (n.getLiteral ("hr") && n.depleted ()) mDays = 0; + else if (n.getLiteral ("h") && n.depleted ()) mDays = 0; + + else if (n.getLiteral ("mins") && n.depleted ()) mDays = 0; + else if (n.getLiteral ("min") && n.depleted ()) mDays = 0; + else if (n.getLiteral ("m") && n.depleted ()) mDays = 0; + + else if (n.getLiteral ("secs") && n.depleted ()) mDays = 0; + else if (n.getLiteral ("sec") && n.depleted ()) mDays = 0; + else if (n.getLiteral ("s") && n.depleted ()) mDays = 0; + + else if (n.getLiteral ("-") && n.depleted ()) mDays = 0; } } diff --git a/src/tests/bug.period.t b/src/tests/bug.period.t index c51fa52bf..e16e2be6a 100755 --- a/src/tests/bug.period.t +++ b/src/tests/bug.period.t @@ -75,61 +75,61 @@ Confirmed: =cut my $output = qx{../task rc:period.rc add daily due:tomorrow recur:daily}; -unlike ($output, qr/was not recignized/, 'recur:daily'); +unlike ($output, qr/was not recognized/, 'recur:daily'); $output = qx{../task rc:period.rc add day due:tomorrow recur:day}; -unlike ($output, qr/was not recignized/, 'recur:day'); +unlike ($output, qr/was not recognized/, 'recur:day'); $output = qx{../task rc:period.rc add weekly due:tomorrow recur:weekly}; -unlike ($output, qr/was not recignized/, 'recur:weekly'); +unlike ($output, qr/was not recognized/, 'recur:weekly'); $output = qx{../task rc:period.rc add sennight due:tomorrow recur:sennight}; -unlike ($output, qr/was not recignized/, 'recur:sennight'); +unlike ($output, qr/was not recognized/, 'recur:sennight'); $output = qx{../task rc:period.rc add biweekly due:tomorrow recur:biweekly}; -unlike ($output, qr/was not recignized/, 'recur:biweekly'); +unlike ($output, qr/was not recognized/, 'recur:biweekly'); $output = qx{../task rc:period.rc add fortnight due:tomorrow recur:fortnight}; -unlike ($output, qr/was not recignized/, 'recur:fortnight'); +unlike ($output, qr/was not recognized/, 'recur:fortnight'); $output = qx{../task rc:period.rc add monthly due:tomorrow recur:monthly}; -unlike ($output, qr/was not recignized/, 'recur:monthly'); +unlike ($output, qr/was not recognized/, 'recur:monthly'); $output = qx{../task rc:period.rc add quarterly due:tomorrow recur:quarterly}; -unlike ($output, qr/was not recignized/, 'recur:quarterly'); +unlike ($output, qr/was not recognized/, 'recur:quarterly'); $output = qx{../task rc:period.rc add semiannual due:tomorrow recur:semiannual}; -unlike ($output, qr/was not recignized/, 'recur:semiannual'); +unlike ($output, qr/was not recognized/, 'recur:semiannual'); $output = qx{../task rc:period.rc add bimonthly due:tomorrow recur:bimonthly}; -unlike ($output, qr/was not recignized/, 'recur:bimonthly'); +unlike ($output, qr/was not recognized/, 'recur:bimonthly'); $output = qx{../task rc:period.rc add biannual due:tomorrow recur:biannual}; -unlike ($output, qr/was not recignized/, 'recur:biannual'); +unlike ($output, qr/was not recognized/, 'recur:biannual'); $output = qx{../task rc:period.rc add biyearly due:tomorrow recur:biyearly}; -unlike ($output, qr/was not recignized/, 'recur:biyearly'); +unlike ($output, qr/was not recognized/, 'recur:biyearly'); $output = qx{../task rc:period.rc add annual due:tomorrow recur:annual}; -unlike ($output, qr/was not recignized/, 'recur:annual'); +unlike ($output, qr/was not recognized/, 'recur:annual'); $output = qx{../task rc:period.rc add yearly due:tomorrow recur:yearly}; -unlike ($output, qr/was not recignized/, 'recur:yearly'); +unlike ($output, qr/was not recognized/, 'recur:yearly'); $output = qx{../task rc:period.rc add 2d due:tomorrow recur:2d}; -unlike ($output, qr/was not recignized/, 'recur:2m'); +unlike ($output, qr/was not recognized/, 'recur:2d'); $output = qx{../task rc:period.rc add 2w due:tomorrow recur:2w}; -unlike ($output, qr/was not recignized/, 'recur:2q'); +unlike ($output, qr/was not recognized/, 'recur:2w'); -$output = qx{../task rc:period.rc add 2m due:tomorrow recur:2m}; -unlike ($output, qr/was not recignized/, 'recur:2d'); +$output = qx{../task rc:period.rc add 2m due:tomorrow recur:2mo}; +unlike ($output, qr/was not recognized/, 'recur:2m'); $output = qx{../task rc:period.rc add 2q due:tomorrow recur:2q}; -unlike ($output, qr/was not recignized/, 'recur:2w'); +unlike ($output, qr/was not recognized/, 'recur:2q'); $output = qx{../task rc:period.rc add 2y due:tomorrow recur:2y}; -unlike ($output, qr/was not recignized/, 'recur:2y'); +unlike ($output, qr/was not recognized/, 'recur:2y'); # Verify that the recurring task instances get created. One of each. $output = qx{../task rc:period.rc list}; diff --git a/src/tests/duration.t.cpp b/src/tests/duration.t.cpp index 6c271447b..195195f4c 100644 --- a/src/tests/duration.t.cpp +++ b/src/tests/duration.t.cpp @@ -48,48 +48,173 @@ int convertDuration (const std::string& input) int main (int argc, char** argv) { - UnitTest t (35); + UnitTest t (148); Duration d; - t.ok (d.valid ("daily"), "duration daily = 1"); - t.ok (d.valid ("weekdays"), "duration weekdays = 1"); - t.ok (d.valid ("day"), "duration day = 1"); - t.ok (d.valid ("0d"), "duration 0d = 0"); - t.ok (d.valid ("1d"), "duration 1d = 1"); - t.ok (d.valid ("7d"), "duration 7d = 7"); - t.ok (d.valid ("10d"), "duration 10d = 10"); - t.ok (d.valid ("100d"), "duration 100d = 100"); - t.ok (d.valid ("weekly"), "duration weekly = 7"); - t.ok (d.valid ("sennight"), "duration sennight = 7"); - t.ok (d.valid ("biweekly"), "duration biweekly = 14"); - t.ok (d.valid ("fortnight"), "duration fortnight = 14"); - t.ok (d.valid ("0w"), "duration 0w = 0"); - t.ok (d.valid ("1w"), "duration 1w = 7"); - t.ok (d.valid ("7w"), "duration 7w = 49"); - t.ok (d.valid ("10w"), "duration 10w = 70"); - t.ok (d.valid ("100w"), "duration 100w = 700"); + 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.notok (d.valid ("woof"), "duration woof = fail"); + 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.is (convertDuration ("daily"), 1, "duration daily = 1"); - t.is (convertDuration ("weekdays"), 1, "duration weekdays = 1"); - t.is (convertDuration ("day"), 1, "duration day = 1"); - t.is (convertDuration ("0d"), 0, "duration 0d = 0"); - t.is (convertDuration ("1d"), 1, "duration 1d = 1"); - t.is (convertDuration ("7d"), 7, "duration 7d = 7"); - t.is (convertDuration ("10d"), 10, "duration 10d = 10"); - t.is (convertDuration ("100d"), 100, "duration 100d = 100"); + 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.is (convertDuration ("weekly"), 7, "duration weekly = 7"); - t.is (convertDuration ("sennight"), 7, "duration sennight = 7"); - t.is (convertDuration ("biweekly"), 14, "duration biweekly = 14"); - t.is (convertDuration ("fortnight"), 14, "duration fortnight = 14"); - t.is (convertDuration ("0w"), 0, "duration 0w = 0"); - t.is (convertDuration ("1w"), 7, "duration 1w = 7"); - t.is (convertDuration ("7w"), 49, "duration 7w = 49"); - t.is (convertDuration ("10w"), 70, "duration 10w = 70"); - t.is (convertDuration ("100w"), 700, "duration 100w = 700"); + 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 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 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 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 mins"), "valid duration 0 mins = 0"); + 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 ("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.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 ("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 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 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 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 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"); return 0; }