/
DateTimeProviderTest.cs
113 lines (103 loc) · 4.21 KB
/
DateTimeProviderTest.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using FluentAssertions;
using System;
using System.Threading.Tasks;
using Xunit;
namespace TestableDateTimeProvider.Tests
{
public class DateTimeProviderTest
{
public DateTimeProviderTest()
{
}
[Fact]
public void GetUtcNow_WhenNoContext_ReturnsCorrectUtcNow()
{
var timeDifferenceTolerance = 2000;
var result = DateTimeProvider.Instance.GetUtcNow();
result.Should().BeCloseTo(DateTime.UtcNow, timeDifferenceTolerance);
}
[Fact]
public void GetUtcNow_WhenSingleContext_ReturnsCorrectFakeUtcNow()
{
var fakeDate = new DateTime(2018, 5, 26, 10, 0, 0, DateTimeKind.Utc);
DateTime result;
using (var context = new DateTimeProviderContext(fakeDate))
{
result = DateTimeProvider.Instance.GetUtcNow();
}
result.Should().Be(fakeDate);
}
[Fact]
public void GetUtcNow_WhenMultipleContext_ReturnsCorrectFakeUtcNow()
{
var fakeDate1 = new DateTime(2018, 5, 26, 10, 0, 0, DateTimeKind.Utc);
var fakeDate2 = new DateTime(2020, 7, 15, 12, 30, 0, DateTimeKind.Utc);
DateTime result1;
DateTime result2;
using (var context1 = new DateTimeProviderContext(fakeDate1))
{
result1 = DateTimeProvider.Instance.GetUtcNow();
using (var context2 = new DateTimeProviderContext(fakeDate2))
{
result2 = DateTimeProvider.Instance.GetUtcNow();
}
}
result1.Should().Be(fakeDate1);
result2.Should().Be(fakeDate2);
}
[Fact]
public void GetUtcNow_WhenMultipleContextRunningInParallel_ReturnsCorrectFakeUtcNow()
{
var fakeDate11 = new DateTime(2018, 5, 26, 10, 0, 0, DateTimeKind.Utc);
var fakeDate12 = new DateTime(2020, 7, 15, 12, 30, 0, DateTimeKind.Utc);
var fakeDate21 = new DateTime(2021, 8, 21, 10, 0, 0, DateTimeKind.Utc);
var fakeDate22 = new DateTime(2022, 9, 25, 13, 45, 0, DateTimeKind.Utc);
var fakeDate31 = new DateTime(2015, 10, 21, 13, 0, 0, DateTimeKind.Utc);
var fakeDate32 = new DateTime(2014, 11, 18, 10, 10, 10, DateTimeKind.Utc);
var result1 = default(DateTime);
var result2 = default(DateTime);
var result3 = default(DateTime);
Action action1 =
() =>
{
using (var context1 = new DateTimeProviderContext(fakeDate11))
{
using (var context2 = new DateTimeProviderContext(fakeDate12))
{
result1 = DateTimeProvider.Instance.GetUtcNow();
}
}
};
Action action2 =
() =>
{
using (var context1 = new DateTimeProviderContext(fakeDate21))
{
using (var context2 = new DateTimeProviderContext(fakeDate22))
{
result2 = DateTimeProvider.Instance.GetUtcNow();
}
}
};
Action action3 =
() =>
{
using (var context1 = new DateTimeProviderContext(fakeDate31))
{
using (var context2 = new DateTimeProviderContext(fakeDate32))
{
result3 = DateTimeProvider.Instance.GetUtcNow();
}
}
};
Parallel.Invoke(action1, action2, action3);
while (result1 == DateTime.MinValue
|| result2 == DateTime.MinValue
|| result3 == DateTime.MinValue)
{ }
result1.Should().Be(fakeDate12);
result2.Should().Be(fakeDate22);
result3.Should().Be(fakeDate32);
}
}
}