@@ -134,6 +134,20 @@ twoDays.Should().BeLessThan(twoWeeks);
134134(twoDays <= new Time("2d")).Should().BeTrue();
135135----
136136
137+ Special Time values `0` and `-1` can be compared against eachother
138+ and other Time values although admittingly this is a tad nonsensical.
139+
140+ [source,csharp]
141+ ----
142+ Time.MinusOne.Should().BeLessThan(Time.Zero);
143+
144+ Time.Zero.Should().BeGreaterThan(Time.MinusOne);
145+
146+ Time.Zero.Should().BeLessThan(twoDays);
147+
148+ Time.MinusOne.Should().BeLessThan(twoDays);
149+ ----
150+
137151And assert equality
138152
139153[source,csharp]
@@ -146,9 +160,73 @@ twoDays.Should().Be(new Time("2d"));
146160
147161(new Time("2.1d") == new Time(TimeSpan.FromDays(2.1))).Should().BeTrue();
148162
149- (new Time("1") == new Time(1)).Should().BeTrue();
163+ (new Time("-1") == new Time(-1)).Should().BeFalse();
164+
165+ (new Time("-1") == Time.MinusOne).Should().BeTrue();
166+ ----
167+
168+ [source,csharp]
169+ ----
170+ private class StringParsingTestCases : List<Tuple<string, TimeSpan, string>>
171+ {
172+ public void Add(string original, TimeSpan expect, string toString) =>
173+ this.Add(Tuple.Create(original, expect, toString));
174+
175+ public void Add(string bad, string argumentExceptionContains) =>
176+ this.Add(Tuple.Create(bad, TimeSpan.FromDays(1), argumentExceptionContains));
177+ }
178+ ----
179+
180+ [source,csharp]
181+ ----
182+ var testCases = new StringParsingTestCases
183+ {
184+ { "1000 nanos", new TimeSpan(10) , "1000nanos"},
185+ { "1000nanos", new TimeSpan(10), "1000nanos"},
186+ { "1000 NANOS", new TimeSpan(10), "1000nanos" },
187+ { "1000NANOS", new TimeSpan(10), "1000nanos" },
188+ { "10micros", new TimeSpan(100), "10micros" },
189+ { "10 MS", new TimeSpan(0, 0, 0, 0, 10), "10ms" },
190+ { "10ms", new TimeSpan(0, 0, 0, 0, 10), "10ms" },
191+ { "10 ms", new TimeSpan(0, 0, 0, 0, 10), "10ms" },
192+ { "10s", new TimeSpan(0, 0, 10), "10s" },
193+ { "-10s", new TimeSpan(0, 0, -10), "-10s" },
194+ { "-10S", new TimeSpan(0, 0, -10), "-10s" },
195+ { "10m", new TimeSpan(0, 10, 0) , "10m"},
196+ { "10M", new TimeSpan(300, 0, 0, 0), "10M" }, // 300 days not minutes
197+ { "10h", new TimeSpan(10, 0, 0), "10h" },
198+ { "10H", new TimeSpan(10, 0, 0) , "10h"},
199+ { "10d", new TimeSpan(10, 0, 0, 0) , "10d"},
200+ };
201+ ----
202+
203+ [source,csharp]
204+ ----
205+ foreach (var testCase in testCases)
206+ {
207+ var time = new Time(testCase.Item1);
208+ time.ToTimeSpan().Should().Be(testCase.Item2, "we passed in {0}", testCase.Item1);
209+ time.ToString().Should().Be(testCase.Item3);
210+ }
211+ ----
212+
213+ [source,csharp]
214+ ----
215+ var testCases = new StringParsingTestCases
216+ {
217+ { "1000", "missing an interval"},
218+ { "1000x", "string is invalid"},
219+ };
220+ ----
150221
151- (new Time("-1") == new Time(-1)).Should().BeTrue();
222+ [source,csharp]
223+ ----
224+ foreach (var testCase in testCases)
225+ {
226+ Action create = () => new Time(testCase.Item1);
227+ var e = create.Invoking((a) => a()).ShouldThrow<ArgumentException>(testCase.Item1).Subject.First();
228+ e.Message.Should().Contain(testCase.Item3);
229+ }
152230----
153231
154232=== Units of Time
0 commit comments