Skip to content

Commit 9941460

Browse files
committedFeb 11, 2015
Merge pull request #97 from RyanHauert/timespan-conversion
Fixed TimeSpanConverter so it handles standard TimeSpan format strings
2 parents 79b4a64 + 3e7e060 commit 9941460

File tree

2 files changed

+53
-7
lines changed

2 files changed

+53
-7
lines changed
 

‎src/FubuCore.Testing/Conversion/TimeSpanConverterTester.cs

+47
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,52 @@ public void happily_converts_timespans_in_5_digit_format()
1919
{
2020
TimeSpanConverter.GetTimeSpan("12:30").ShouldEqual(new TimeSpan(12, 30, 0));
2121
}
22+
23+
[Test]
24+
public void converts_timespans_for_seconds()
25+
{
26+
TimeSpanConverter.GetTimeSpan("3.5s").ShouldEqual(TimeSpan.FromSeconds(3.5));
27+
TimeSpanConverter.GetTimeSpan("5 s").ShouldEqual(TimeSpan.FromSeconds(5));
28+
TimeSpanConverter.GetTimeSpan("1 second").ShouldEqual(TimeSpan.FromSeconds(1));
29+
TimeSpanConverter.GetTimeSpan("12 seconds").ShouldEqual(TimeSpan.FromSeconds(12));
30+
}
31+
32+
[Test]
33+
public void converts_timespans_for_minutes()
34+
{
35+
TimeSpanConverter.GetTimeSpan("10m").ShouldEqual(TimeSpan.FromMinutes(10));
36+
TimeSpanConverter.GetTimeSpan("2.1 m").ShouldEqual(TimeSpan.FromMinutes(2.1));
37+
TimeSpanConverter.GetTimeSpan("1 minute").ShouldEqual(TimeSpan.FromMinutes(1));
38+
TimeSpanConverter.GetTimeSpan("5 minutes").ShouldEqual(TimeSpan.FromMinutes(5));
39+
}
40+
41+
[Test]
42+
public void converts_timespans_for_hours()
43+
{
44+
TimeSpanConverter.GetTimeSpan("24h").ShouldEqual(TimeSpan.FromHours(24));
45+
TimeSpanConverter.GetTimeSpan("4 h").ShouldEqual(TimeSpan.FromHours(4));
46+
TimeSpanConverter.GetTimeSpan("1 hour").ShouldEqual(TimeSpan.FromHours(1));
47+
TimeSpanConverter.GetTimeSpan("12.5 hours").ShouldEqual(TimeSpan.FromHours(12.5));
48+
}
49+
50+
[Test]
51+
public void converts_timespans_for_days()
52+
{
53+
TimeSpanConverter.GetTimeSpan("3d").ShouldEqual(TimeSpan.FromDays(3));
54+
TimeSpanConverter.GetTimeSpan("2 d").ShouldEqual(TimeSpan.FromDays(2));
55+
TimeSpanConverter.GetTimeSpan("1 day").ShouldEqual(TimeSpan.FromDays(1));
56+
TimeSpanConverter.GetTimeSpan("7 days").ShouldEqual(TimeSpan.FromDays(7));
57+
}
58+
59+
[Test]
60+
public void can_convert_from_standard_format()
61+
{
62+
TimeSpanConverter.GetTimeSpan("00:00:01").ShouldEqual(new TimeSpan(0, 0, 1));
63+
TimeSpanConverter.GetTimeSpan("00:10:00").ShouldEqual(new TimeSpan(0, 10, 0));
64+
TimeSpanConverter.GetTimeSpan("01:30:00").ShouldEqual(new TimeSpan(1, 30, 0));
65+
TimeSpanConverter.GetTimeSpan("1.01:30:00").ShouldEqual(new TimeSpan(1, 1, 30, 0));
66+
TimeSpanConverter.GetTimeSpan("-00:10:00").ShouldEqual(new TimeSpan(0, -10, 0));
67+
TimeSpanConverter.GetTimeSpan("12:34:56.789").ShouldEqual(new TimeSpan(0, 12, 34, 56, 789));
68+
}
2269
}
2370
}

‎src/FubuCore/Conversion/TimeSpanConverter.cs

+6-7
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.ComponentModel;
33
using System.Text.RegularExpressions;
44
using System.Linq;
5-
using FubuCore.Descriptions;
65

76
namespace FubuCore.Conversion
87
{
@@ -11,21 +10,21 @@ public class TimeSpanConverter : StatelessConverter<TimeSpan>
1110
{
1211
private const string TIMESPAN_PATTERN =
1312
@"
14-
(?<quantity>\d+ # quantity is expressed as some digits
15-
(\.\d+)?) # optionally followed by a decimal point and more digits
13+
^(?<quantity>\d+ # quantity is expressed as some digits
14+
(\.\d+)?) # optionally followed by a decimal point or colon and more digits
1615
\s* # optional whitespace
17-
(?<units>\w+) # units is expressed as a word";
16+
(?<units>[a-z]*) # units is expressed as a word
17+
$ # match the entire string";
1818

1919

2020
public static TimeSpan GetTimeSpan(string timeString)
2121
{
22-
var match = Regex.Match(timeString, TIMESPAN_PATTERN, RegexOptions.IgnorePatternWhitespace);
22+
var match = Regex.Match(timeString.Trim(), TIMESPAN_PATTERN, RegexOptions.IgnorePatternWhitespace);
2323
if (!match.Success)
2424
{
2525
return TimeSpan.Parse(timeString);
2626
}
2727

28-
2928

3029
var number = double.Parse(match.Groups["quantity"].Value);
3130
var units = match.Groups["units"].Value.ToLower();
@@ -35,6 +34,7 @@ public static TimeSpan GetTimeSpan(string timeString)
3534
case "second":
3635
case "seconds":
3736
return TimeSpan.FromSeconds(number);
37+
3838
case "m":
3939
case "minute":
4040
case "minutes":
@@ -49,7 +49,6 @@ public static TimeSpan GetTimeSpan(string timeString)
4949
case "day":
5050
case "days":
5151
return TimeSpan.FromDays(number);
52-
5352
}
5453

5554
if (timeString.Length == 4 && !timeString.Contains(":"))

0 commit comments

Comments
 (0)
Please sign in to comment.