1+ using Microsoft . VisualStudio . TestTools . UnitTesting ;
2+ using System ;
3+
4+ namespace IClock . Tests
5+ {
6+ [ TestClass ]
7+ public class TestClockTests
8+ {
9+ [ TestMethod ]
10+ public void TestClock_GetTime_Returns_DefaultTime ( )
11+ {
12+ var target = new TestClock ( ) ;
13+ Assert . AreEqual ( TestClock . DefaultTime , target . GetTime ( ) ) ;
14+ }
15+
16+ [ TestMethod ]
17+ public void TestClock_GetTime_Returns_GivenTime ( )
18+ {
19+ var time = new DateTime ( 2020 , 1 , 2 , 3 , 4 , 5 , 6 , DateTimeKind . Local ) ;
20+ var target = new TestClock ( time ) ;
21+ Assert . AreEqual ( time , target . GetTime ( ) ) ;
22+ }
23+
24+ [ TestMethod ]
25+ public void TestClock_Tick_DefaultIncrement_IsOneSecond ( )
26+ {
27+ var target = new TestClock ( ) ;
28+ var t1 = target . GetTime ( ) ;
29+ target . Tick ( ) ;
30+ var t2 = target . GetTime ( ) ;
31+
32+ Assert . AreEqual ( TimeSpan . FromSeconds ( 1 ) , t2 - t1 ) ;
33+ }
34+
35+ [ TestMethod ]
36+ public void TestClock_Tick_Uses_GivenIncrement ( )
37+ {
38+ var ts = TimeSpan . FromDays ( Math . PI ) ;
39+ var target = new TestClock ( TestClock . DefaultTime , ts ) ;
40+ var t1 = target . GetTime ( ) ;
41+ target . Tick ( ) ;
42+ var t2 = target . GetTime ( ) ;
43+
44+ Assert . AreEqual ( ts , t2 - t1 ) ;
45+ }
46+
47+ [ TestMethod ]
48+ public void TestClock_Set_ChangesTime ( )
49+ {
50+ var time = new DateTime ( 2020 , 1 , 2 , 3 , 4 , 5 , 6 , DateTimeKind . Local ) ;
51+ var target = new TestClock ( ) ;
52+ target . Set ( time ) ;
53+
54+ Assert . AreEqual ( time , target . GetTime ( ) ) ;
55+ }
56+
57+ [ TestMethod ]
58+ public void TestClock_Add_AddsTime ( )
59+ {
60+ var target = new TestClock ( ) ;
61+ var timespan = TimeSpan . FromSeconds ( Math . PI ) ;
62+ var t1 = target . GetTime ( ) ;
63+ target . Add ( timespan ) ;
64+ var t2 = target . GetTime ( ) ;
65+
66+ Assert . AreEqual ( timespan , t2 - t1 ) ;
67+ }
68+
69+ private DateTimeOffset GetTime1 ( ) => TestClock . GetDeterministicRandomTime ( ) ;
70+ private DateTimeOffset GetTime2 ( ) => TestClock . GetDeterministicRandomTime ( ) ;
71+
72+ [ TestMethod ]
73+ public void TestClock_GetDeterministicRandomTime_IsDeterministic ( )
74+ {
75+ // Each invocation within the same method should return the same value
76+ Assert . AreEqual ( TestClock . GetDeterministicRandomTime ( ) , TestClock . GetDeterministicRandomTime ( ) ) ;
77+
78+ // Each invocation from different methods should (likely) return the different values
79+ Assert . AreNotEqual ( GetTime1 ( ) , GetTime2 ( ) ) ;
80+ Assert . AreNotEqual ( TestClock . GetDeterministicRandomTime ( TimeSpan . Zero , "A" ) , TestClock . GetDeterministicRandomTime ( TimeSpan . Zero , "B" ) ) ;
81+ }
82+
83+ [ TestMethod ]
84+ public void TestClock_TestVector ( ) // Do not change method name or fix expected value when you do
85+ {
86+ // Pre-calculated test vector
87+ var expected = new DateTimeOffset ( 635894622187178864L , TimeSpan . Zero ) ;
88+
89+ // Make sure GetRandomTime() returns a deterministic "random" time
90+ Assert . AreEqual ( expected , TestClock . GetDeterministicRandomTime ( ) ) ;
91+ // Make sure a second invocation doesn't change the returned time
92+ Assert . AreEqual ( expected , TestClock . GetDeterministicRandomTime ( ) ) ;
93+ }
94+
95+ [ TestMethod ]
96+ public void TestClock_GetDeterministicRandomTime_UsesGivenOffset ( )
97+ {
98+ var offset = TimeSpan . FromMinutes ( 123 ) ;
99+ Assert . AreEqual ( offset , TestClock . GetDeterministicRandomTime ( offset ) . Offset ) ;
100+ }
101+
102+ }
103+ }
0 commit comments