mirror of
https://github.com/Cysharp/R3.git
synced 2026-10-27 04:10:27 +08:00
211 lines
5.5 KiB
C#
211 lines
5.5 KiB
C#
namespace R3.Tests;
|
|
|
|
public class SubjectTest
|
|
{
|
|
[Fact]
|
|
public void Test()
|
|
{
|
|
// Dispose(not yet completed)
|
|
{
|
|
var s = new Subject<int>();
|
|
using var l = s.ToLiveList();
|
|
s.OnNext(1);
|
|
s.OnNext(2);
|
|
s.OnNext(3);
|
|
s.Dispose();
|
|
|
|
l.AssertEqual([1, 2, 3]);
|
|
l.AssertIsCompleted();
|
|
s.IsDisposed.ShouldBeTrue();
|
|
}
|
|
|
|
// already OnCompleted(Success), Dispose
|
|
{
|
|
var s = new Subject<int>();
|
|
using var l = s.ToLiveList();
|
|
s.OnNext(1);
|
|
s.OnNext(2);
|
|
s.OnNext(3);
|
|
s.OnCompleted();
|
|
s.Dispose();
|
|
|
|
l.AssertEqual([1, 2, 3]);
|
|
l.AssertIsCompleted();
|
|
s.IsDisposed.ShouldBeTrue();
|
|
}
|
|
|
|
// already OnCompleted(Failure), Dispose
|
|
{
|
|
var s = new Subject<int>();
|
|
using var l = s.ToLiveList();
|
|
s.OnNext(1);
|
|
s.OnNext(2);
|
|
s.OnNext(3);
|
|
s.OnCompleted(new Exception("foo"));
|
|
s.Dispose();
|
|
|
|
l.AssertEqual([1, 2, 3]);
|
|
l.AssertIsCompleted();
|
|
s.IsDisposed.ShouldBeTrue();
|
|
}
|
|
|
|
|
|
// already Disposed, call OnNext
|
|
{
|
|
var s = new Subject<int>();
|
|
s.Dispose();
|
|
Assert.Throws<ObjectDisposedException>(() => s.OnNext(1));
|
|
}
|
|
// already Disposed, call OnError
|
|
{
|
|
var s = new Subject<int>();
|
|
s.Dispose();
|
|
Assert.Throws<ObjectDisposedException>(() => s.OnErrorResume(new Exception()));
|
|
}
|
|
// already Disposed, call OnCompleted
|
|
{
|
|
var s = new Subject<int>();
|
|
s.Dispose();
|
|
Assert.Throws<ObjectDisposedException>(() => s.OnCompleted());
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void SubscribeAfterCompleted()
|
|
{
|
|
{
|
|
// after Success
|
|
var s = new Subject<int>();
|
|
s.OnCompleted();
|
|
|
|
using var l = s.ToLiveList();
|
|
|
|
l.AssertIsCompleted();
|
|
l.Result.IsSuccess.ShouldBeTrue();
|
|
}
|
|
{
|
|
// after Failure
|
|
var s = new Subject<int>();
|
|
s.OnCompleted(new Exception("foo"));
|
|
|
|
using var l = s.ToLiveList();
|
|
|
|
l.AssertIsCompleted();
|
|
l.Result.IsFailure.ShouldBeTrue();
|
|
l.Result.Exception!.Message.ShouldBe("foo");
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void SingleAssignment()
|
|
{
|
|
// normal
|
|
{
|
|
var s = new SingleAssignmentSubject<int>();
|
|
using var l = s.ToLiveList();
|
|
s.OnNext(1);
|
|
s.OnNext(2);
|
|
s.OnNext(3);
|
|
l.ShouldBe([1, 2, 3]);
|
|
|
|
s.OnCompleted();
|
|
l.AssertIsCompleted();
|
|
}
|
|
// subscribe twice
|
|
{
|
|
var s = new SingleAssignmentSubject<int>();
|
|
using var l = s.ToLiveList();
|
|
Assert.Throws<InvalidOperationException>(() => s.Subscribe());
|
|
}
|
|
|
|
// subject test copy
|
|
|
|
// Dispose(not yet completed)
|
|
{
|
|
var s = new SingleAssignmentSubject<int>();
|
|
using var l = s.ToLiveList();
|
|
s.OnNext(1);
|
|
s.OnNext(2);
|
|
s.OnNext(3);
|
|
s.Dispose();
|
|
|
|
l.AssertEqual([1, 2, 3]);
|
|
l.AssertIsCompleted();
|
|
s.IsDisposed.ShouldBeTrue();
|
|
}
|
|
|
|
// already OnCompleted(Success), Dispose
|
|
{
|
|
var s = new SingleAssignmentSubject<int>();
|
|
using var l = s.ToLiveList();
|
|
s.OnNext(1);
|
|
s.OnNext(2);
|
|
s.OnNext(3);
|
|
s.OnCompleted();
|
|
s.Dispose();
|
|
|
|
l.AssertEqual([1, 2, 3]);
|
|
l.AssertIsCompleted();
|
|
s.IsDisposed.ShouldBeTrue();
|
|
}
|
|
|
|
// already OnCompleted(Failure), Dispose
|
|
{
|
|
var s = new SingleAssignmentSubject<int>();
|
|
using var l = s.ToLiveList();
|
|
s.OnNext(1);
|
|
s.OnNext(2);
|
|
s.OnNext(3);
|
|
s.OnCompleted(new Exception("foo"));
|
|
s.Dispose();
|
|
|
|
l.AssertEqual([1, 2, 3]);
|
|
l.AssertIsCompleted();
|
|
s.IsDisposed.ShouldBeTrue();
|
|
}
|
|
|
|
|
|
// already Disposed, call OnNext
|
|
{
|
|
var s = new SingleAssignmentSubject<int>();
|
|
s.Dispose();
|
|
Assert.Throws<ObjectDisposedException>(() => s.OnNext(1));
|
|
}
|
|
// already Disposed, call OnError
|
|
{
|
|
var s = new SingleAssignmentSubject<int>();
|
|
s.Dispose();
|
|
Assert.Throws<ObjectDisposedException>(() => s.OnErrorResume(new Exception()));
|
|
}
|
|
// already Disposed, call OnCompleted
|
|
{
|
|
var s = new SingleAssignmentSubject<int>();
|
|
s.Dispose();
|
|
Assert.Throws<ObjectDisposedException>(() => s.OnCompleted());
|
|
}
|
|
|
|
|
|
{
|
|
// after Success
|
|
var s = new SingleAssignmentSubject<int>();
|
|
s.OnCompleted();
|
|
|
|
using var l = s.ToLiveList();
|
|
|
|
l.AssertIsCompleted();
|
|
l.Result.IsSuccess.ShouldBeTrue();
|
|
}
|
|
{
|
|
// after Failure
|
|
var s = new SingleAssignmentSubject<int>();
|
|
s.OnCompleted(new Exception("foo"));
|
|
|
|
using var l = s.ToLiveList();
|
|
|
|
l.AssertIsCompleted();
|
|
l.Result.IsFailure.ShouldBeTrue();
|
|
l.Result.Exception!.Message.ShouldBe("foo");
|
|
}
|
|
}
|
|
}
|