Skip to content

Commit 47928cd

Browse files
committed
Added InitDispose class.
1 parent cefbf9f commit 47928cd

File tree

2 files changed

+154
-1
lines changed

2 files changed

+154
-1
lines changed

CodeJam.Main.Tests/DisposableTests.cs

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,5 +125,71 @@ public static void TestParameterizedAnonymousDisposable()
125125
Assert.IsTrue(disposed);
126126
Assert.AreEqual("state", state);
127127
}
128+
129+
[Test]
130+
public static void InitDisposeTest1()
131+
{
132+
var i = 0;
133+
134+
using (InitDispose.Create(
135+
() => Assert.That(++i, Is.EqualTo(1)),
136+
() => Assert.That(++i, Is.EqualTo(3))))
137+
{
138+
Assert.That(++i, Is.EqualTo(2));
139+
}
140+
141+
Assert.That(++i, Is.EqualTo(4));
142+
}
143+
144+
[Test]
145+
public static void InitDisposeTest2()
146+
{
147+
var i = 0;
148+
149+
using (InitDispose.Create(
150+
() => Assert.That(++i, Is.EqualTo(1).Or.EqualTo(3))))
151+
{
152+
Assert.That(++i, Is.EqualTo(2));
153+
}
154+
155+
Assert.That(++i, Is.EqualTo(4));
156+
}
157+
158+
[Test]
159+
public static void InitDisposeTest3()
160+
{
161+
var i = 0;
162+
163+
using (InitDispose.Create(
164+
isInit => Assert.That(i += isInit ? 1 : 2, Is.EqualTo(1).Or.EqualTo(4))))
165+
{
166+
Assert.That(++i, Is.EqualTo(2));
167+
}
168+
169+
Assert.That(++i, Is.EqualTo(5));
170+
}
171+
172+
[Test]
173+
public static void InitDisposeTest4()
174+
{
175+
var i = 0;
176+
177+
using (InitDispose.Create(
178+
() =>
179+
{
180+
Assert.That(++i, Is.EqualTo(1));
181+
return "123";
182+
},
183+
s =>
184+
{
185+
Assert.That(++i, Is.EqualTo(3));
186+
Assert.That(s, Is.EqualTo("123"));
187+
}))
188+
{
189+
Assert.That(++i, Is.EqualTo(2));
190+
}
191+
192+
Assert.That(++i, Is.EqualTo(4));
193+
}
128194
}
129-
}
195+
}

CodeJam.Main/InitDispose.cs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
using System;
2+
3+
using JetBrains.Annotations;
4+
5+
namespace CodeJam
6+
{
7+
/// <summary>Helper methods for <see cref="IDisposable"/></summary>
8+
[PublicAPI]
9+
public static class InitDispose
10+
{
11+
/// <summary>
12+
/// Calls <paramref name="initAction"/> and
13+
/// creates <see cref="IDisposable"/> instance that calls <paramref name="disposeAction"/> on disposing.
14+
/// </summary>
15+
/// <param name="initAction">The init action.</param>
16+
/// <param name="disposeAction">The dispose action.</param>
17+
/// <returns>
18+
/// Instance of <see cref="IDisposable"/> that calls <paramref name="disposeAction"/> on disposing.
19+
/// </returns>
20+
[NotNull, Pure]
21+
public static IDisposable Create([NotNull] Action initAction, [NotNull] Action disposeAction)
22+
{
23+
Code.NotNull(initAction, nameof(initAction));
24+
Code.NotNull(disposeAction, nameof(disposeAction));
25+
26+
initAction();
27+
return Disposable.Create(disposeAction);
28+
}
29+
30+
/// <summary>
31+
/// Calls <paramref name="initAction"/> and
32+
/// creates <see cref="IDisposable"/> instance that calls <paramref name="disposeAction"/> on disposing.
33+
/// </summary>
34+
/// <param name="initAction">The init action.</param>
35+
/// <param name="disposeAction">The dispose action.</param>
36+
/// <returns>
37+
/// Instance of <see cref="IDisposable"/> that calls <paramref name="disposeAction"/> on disposing.
38+
/// </returns>
39+
[NotNull, Pure]
40+
public static IDisposable Create<T>([NotNull] Func<T> initAction, [NotNull] Action<T> disposeAction)
41+
{
42+
Code.NotNull(initAction, nameof(initAction));
43+
Code.NotNull(disposeAction, nameof(disposeAction));
44+
45+
var initState = initAction();
46+
return Disposable.Create(disposeAction, initState);
47+
}
48+
49+
/// <summary>
50+
/// Calls <paramref name="initDisposeAction"/> and
51+
/// creates <see cref="IDisposable"/> instance that calls <paramref name="initDisposeAction"/> on disposing.
52+
/// </summary>
53+
/// <param name="initDisposeAction">The init and dispose action.</param>
54+
/// <returns>
55+
/// Instance of <see cref="IDisposable"/> that calls <paramref name="initDisposeAction"/> on disposing.
56+
/// </returns>
57+
[NotNull, Pure]
58+
public static IDisposable Create([NotNull] Action initDisposeAction)
59+
{
60+
Code.NotNull(initDisposeAction, nameof(initDisposeAction));
61+
62+
initDisposeAction();
63+
return Disposable.Create(initDisposeAction);
64+
}
65+
66+
/// <summary>
67+
/// Calls <paramref name="initDisposeAction"/> and
68+
/// creates <see cref="IDisposable"/> instance that calls <paramref name="initDisposeAction"/> on disposing.
69+
/// </summary>
70+
/// <param name="initDisposeAction">
71+
/// The init and dispose action.
72+
/// <paramref name="initDisposeAction"/> takes true if this is initAction.
73+
/// It takes false if this is disposeAction.
74+
/// </param>
75+
/// <returns>
76+
/// Instance of <see cref="IDisposable"/> that calls <paramref name="initDisposeAction"/> on disposing.
77+
/// </returns>
78+
[NotNull, Pure]
79+
public static IDisposable Create([NotNull] Action<bool> initDisposeAction)
80+
{
81+
Code.NotNull(initDisposeAction, nameof(initDisposeAction));
82+
83+
initDisposeAction(true);
84+
return Disposable.Create<bool>(initDisposeAction, false);
85+
}
86+
}
87+
}

0 commit comments

Comments
 (0)