Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,23 @@ public static class DisposableListExtensions
public static void Add(this List<IDisposable> disposables, Action action)
=> disposables.Add(new DisposableAction(action));

public static void Add(this List<IDisposable> disposables, params IDisposable[] newDisposables) =>
disposables.AddRange(newDisposables);

public static List<IDisposable> ThenAdd(this List<IDisposable> disposables, IDisposable disposable)
{
disposables.Add(disposable);

return disposables;
}

public static List<IDisposable> ThenAdd(this List<IDisposable> disposables, Action action)
{
disposables.Add(action);

return disposables;
}

public static void Dispose(this List<IDisposable> disposables)
{
if (disposables?.Count > 0)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
using System;
using System.Collections.Generic;
using NUnit.Framework;
using UniState;

namespace UniStateTests.EditMode.Disposables
{
[TestFixture]
public class DisposableListExtensionsTests
{
private class DisposableSpy : IDisposable
{
private readonly Action _onDispose;

public DisposableSpy(Action onDispose) => _onDispose = onDispose;

public void Dispose() => _onDispose();
}

[Test]
public void Add_WithAction_AddsDisposableAction()
{
var disposables = new List<IDisposable>();
var disposeCount = 0;

disposables.Add(() => disposeCount++);

Assert.AreEqual(1, disposables.Count);
Assert.IsInstanceOf<DisposableAction>(disposables[0]);

disposables.Dispose();

Assert.AreEqual(1, disposeCount);
}

[Test]
public void Add_WithParams_AddsAllDisposables()
{
var first = new DisposableSpy(() => { });
var second = new DisposableSpy(() => { });
var third = new DisposableSpy(() => { });

var disposables = new List<IDisposable> { first };

disposables.Add(second, third);

Assert.AreEqual(3, disposables.Count);
Assert.AreSame(first, disposables[0]);
Assert.AreSame(second, disposables[1]);
Assert.AreSame(third, disposables[2]);
}

[Test]
public void ThenAdd_WithDisposable_ReturnsSameList()
{
var disposables = new List<IDisposable>();
var spy = new DisposableSpy(() => { });

var result = disposables.ThenAdd(spy);

Assert.AreSame(disposables, result);
Assert.Contains(spy, disposables);
}

[Test]
public void ThenAdd_WithAction_AddsDisposableActionAndReturnsList()
{
var disposables = new List<IDisposable>();

var result = disposables.ThenAdd(() => { });

Assert.AreSame(disposables, result);
Assert.AreEqual(1, disposables.Count);
Assert.IsInstanceOf<DisposableAction>(disposables[0]);
}

[Test]
public void Dispose_DisposesInReverseOrderAndSkipsNull()
{
var callOrder = new List<int>();
var first = new DisposableSpy(() => callOrder.Add(1));
var second = new DisposableSpy(() => callOrder.Add(2));
var third = new DisposableSpy(() => callOrder.Add(3));

var disposables = new List<IDisposable> { first, null, second, third };

disposables.Dispose();

CollectionAssert.AreEqual(new[] { 3, 2, 1 }, callOrder);
}

[Test]
public void Dispose_WithNullList_DoesNotThrow()
{
Assert.DoesNotThrow(() => DisposableListExtensions.Dispose(null));
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
using UniStateTests.Common;
using Zenject;

namespace UniStateTests.EditMode.Common
namespace UniStateTests.EditMode.Disposables
{
[TestFixture]
internal class StateDisposablesTests: ZenjectTestsBase
Expand Down