-
Notifications
You must be signed in to change notification settings - Fork 36
/
Copy pathDisposableExtensionsTests.cs
93 lines (67 loc) · 2.16 KB
/
DisposableExtensionsTests.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
using System;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using NUnit.Framework;
namespace CodeJam;
[TestFixture(Category = "Disposable")]
[SuppressMessage("ReSharper", "HeapView.CanAvoidClosure")]
public static class DisposableExtensionsTests
{
[Test]
public static void DisposeAllMustReleaseAllObjects()
{
const int expectedDisposeCount = 10;
int actualDisposeCount = 0;
var objectsForDispose = Enumerable
.Range(0, expectedDisposeCount)
.Select(x => Disposable.Create(() => ++actualDisposeCount));
objectsForDispose.DisposeAll();
Assert.AreEqual(expectedDisposeCount, actualDisposeCount);
}
[Test]
public static void DisposeAllMustCollectAllExceptions()
{
const int expectedExceptionCount = 7;
var objectsWithException = Enumerable
.Range(0, expectedExceptionCount)
.Select(x => Disposable.Create(() => throw new Exception()));
const int expectedSuccessCount = 3;
var objectsWithoutException = Enumerable
.Range(0, expectedSuccessCount)
.Select(x => Disposable.Create(() => { }));
var objectsForDispose = objectsWithException.Concat(objectsWithoutException).ToArray();
int actualExceptionCount = -1;
try
{
objectsForDispose.DisposeAll();
}
catch (AggregateException ex)
{
actualExceptionCount = ex.InnerExceptions.Count;
}
Assert.AreEqual(expectedExceptionCount, actualExceptionCount);
}
#if NETSTANDARD21_OR_GREATER || NETCOREAPP30_OR_GREATER
[Test]
public static async Task DisposeAsyncMustCallDiposeOnce()
{
const int expectedDisposeCount = 1;
int actualDisposeCount = 0;
var objectForDispose = Disposable.Create(() => ++actualDisposeCount);
await objectForDispose.DisposeAsync();
Assert.AreEqual(expectedDisposeCount, actualDisposeCount);
}
[Test]
public static void DisposeAsyncMustNotBlockThread()
{
var disposeDuration = new TimeSpan(0, 0, 1);
var longDisposableObject = Disposable.Create(() => Thread.Sleep(disposeDuration));
var startTime = DateTime.Now;
var task = longDisposableObject.DisposeAsync();
var callDuration = DateTime.Now - startTime;
Assert.Less(callDuration, disposeDuration);
}
#endif
}