Skip to content

Commit 82d8aed

Browse files
authored
Merge pull request #109 from bazyleu/feature/disposables-add-update
Extend API for disposables collection
2 parents d3744d0 + 9b87913 commit 82d8aed

File tree

6 files changed

+119
-1
lines changed

6 files changed

+119
-1
lines changed

Assets/UniState/Runtime/Core/Disposables/DisposableListExtensions.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,23 @@ public static class DisposableListExtensions
88
public static void Add(this List<IDisposable> disposables, Action action)
99
=> disposables.Add(new DisposableAction(action));
1010

11+
public static void Add(this List<IDisposable> disposables, params IDisposable[] newDisposables) =>
12+
disposables.AddRange(newDisposables);
13+
14+
public static List<IDisposable> ThenAdd(this List<IDisposable> disposables, IDisposable disposable)
15+
{
16+
disposables.Add(disposable);
17+
18+
return disposables;
19+
}
20+
21+
public static List<IDisposable> ThenAdd(this List<IDisposable> disposables, Action action)
22+
{
23+
disposables.Add(action);
24+
25+
return disposables;
26+
}
27+
1128
public static void Dispose(this List<IDisposable> disposables)
1229
{
1330
if (disposables?.Count > 0)
File renamed without changes.
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using NUnit.Framework;
4+
using UniState;
5+
6+
namespace UniStateTests.EditMode.Disposables
7+
{
8+
[TestFixture]
9+
public class DisposableListExtensionsTests
10+
{
11+
private class DisposableSpy : IDisposable
12+
{
13+
private readonly Action _onDispose;
14+
15+
public DisposableSpy(Action onDispose) => _onDispose = onDispose;
16+
17+
public void Dispose() => _onDispose();
18+
}
19+
20+
[Test]
21+
public void Add_WithAction_AddsDisposableAction()
22+
{
23+
var disposables = new List<IDisposable>();
24+
var disposeCount = 0;
25+
26+
disposables.Add(() => disposeCount++);
27+
28+
Assert.AreEqual(1, disposables.Count);
29+
Assert.IsInstanceOf<DisposableAction>(disposables[0]);
30+
31+
disposables.Dispose();
32+
33+
Assert.AreEqual(1, disposeCount);
34+
}
35+
36+
[Test]
37+
public void Add_WithParams_AddsAllDisposables()
38+
{
39+
var first = new DisposableSpy(() => { });
40+
var second = new DisposableSpy(() => { });
41+
var third = new DisposableSpy(() => { });
42+
43+
var disposables = new List<IDisposable> { first };
44+
45+
disposables.Add(second, third);
46+
47+
Assert.AreEqual(3, disposables.Count);
48+
Assert.AreSame(first, disposables[0]);
49+
Assert.AreSame(second, disposables[1]);
50+
Assert.AreSame(third, disposables[2]);
51+
}
52+
53+
[Test]
54+
public void ThenAdd_WithDisposable_ReturnsSameList()
55+
{
56+
var disposables = new List<IDisposable>();
57+
var spy = new DisposableSpy(() => { });
58+
59+
var result = disposables.ThenAdd(spy);
60+
61+
Assert.AreSame(disposables, result);
62+
Assert.Contains(spy, disposables);
63+
}
64+
65+
[Test]
66+
public void ThenAdd_WithAction_AddsDisposableActionAndReturnsList()
67+
{
68+
var disposables = new List<IDisposable>();
69+
70+
var result = disposables.ThenAdd(() => { });
71+
72+
Assert.AreSame(disposables, result);
73+
Assert.AreEqual(1, disposables.Count);
74+
Assert.IsInstanceOf<DisposableAction>(disposables[0]);
75+
}
76+
77+
[Test]
78+
public void Dispose_DisposesInReverseOrderAndSkipsNull()
79+
{
80+
var callOrder = new List<int>();
81+
var first = new DisposableSpy(() => callOrder.Add(1));
82+
var second = new DisposableSpy(() => callOrder.Add(2));
83+
var third = new DisposableSpy(() => callOrder.Add(3));
84+
85+
var disposables = new List<IDisposable> { first, null, second, third };
86+
87+
disposables.Dispose();
88+
89+
CollectionAssert.AreEqual(new[] { 3, 2, 1 }, callOrder);
90+
}
91+
92+
[Test]
93+
public void Dispose_WithNullList_DoesNotThrow()
94+
{
95+
Assert.DoesNotThrow(() => DisposableListExtensions.Dispose(null));
96+
}
97+
}
98+
}

Assets/UniStateTests/EditMode/Disposables/DisposableListExtensionsTests.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/UniStateTests/EditMode/States/StateDisposablesTests.cs renamed to Assets/UniStateTests/EditMode/Disposables/StateDisposablesTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
using UniStateTests.Common;
88
using Zenject;
99

10-
namespace UniStateTests.EditMode.Common
10+
namespace UniStateTests.EditMode.Disposables
1111
{
1212
[TestFixture]
1313
internal class StateDisposablesTests: ZenjectTestsBase

Assets/UniStateTests/EditMode/States/StateDisposablesTests.cs.meta renamed to Assets/UniStateTests/EditMode/Disposables/StateDisposablesTests.cs.meta

File renamed without changes.

0 commit comments

Comments
 (0)