Skip to content

Commit accfa0b

Browse files
committed
Add unit tests for messenger observable APIs
1 parent 88a39c0 commit accfa0b

File tree

5 files changed

+106
-1
lines changed

5 files changed

+106
-1
lines changed

tests/CommunityToolkit.Mvvm.Roslyn401.UnitTests/CommunityToolkit.Mvvm.Roslyn401.UnitTests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
1010
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
1111
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
12+
<PackageReference Include="System.Reactive" Version="5.0.0" />
1213
<PackageReference Include="System.Text.Json" Version="6.0.6" />
1314
</ItemGroup>
1415

tests/CommunityToolkit.Mvvm.Roslyn431.UnitTests/CommunityToolkit.Mvvm.Roslyn431.UnitTests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
1010
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
1111
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
12+
<PackageReference Include="System.Reactive" Version="5.0.0" />
1213
<PackageReference Include="System.Text.Json" Version="6.0.6" />
1314
</ItemGroup>
1415

tests/CommunityToolkit.Mvvm.UnitTests/CommunityToolkit.Mvvm.UnitTests.projitems

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
<Compile Include="$(MSBuildThisFileDirectory)Test_AsyncRelayCommand{T}.cs" />
2626
<Compile Include="$(MSBuildThisFileDirectory)Test_INotifyPropertyChangedAttribute.cs" />
2727
<Compile Include="$(MSBuildThisFileDirectory)Test_IRecipientGenerator.cs" />
28+
<Compile Include="$(MSBuildThisFileDirectory)Test_Messenger.Observables.cs" />
2829
<Compile Include="$(MSBuildThisFileDirectory)Test_Messenger.cs" />
2930
<Compile Include="$(MSBuildThisFileDirectory)Test_Messenger.Request.cs" />
3031
<Compile Include="$(MSBuildThisFileDirectory)Test_ObservableObject.cs" />
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using System;
6+
using System.Collections.Generic;
7+
using CommunityToolkit.Mvvm.Messaging;
8+
using Microsoft.VisualStudio.TestTools.UnitTesting;
9+
10+
namespace CommunityToolkit.Mvvm.UnitTests;
11+
12+
partial class Test_Messenger
13+
{
14+
[TestMethod]
15+
[DataRow(typeof(StrongReferenceMessenger))]
16+
[DataRow(typeof(WeakReferenceMessenger))]
17+
public void Test_Messenger_CreateObservable(Type type)
18+
{
19+
IMessenger messenger = (IMessenger)Activator.CreateInstance(type)!;
20+
21+
IObservable<MessageA> observable = messenger.CreateObservable<MessageA>();
22+
23+
Assert.IsNotNull(observable);
24+
25+
List<MessageA> messages = new();
26+
27+
IDisposable disposable = observable.Subscribe(messages.Add);
28+
29+
MessageA message1 = new();
30+
MessageA message2 = new();
31+
32+
_ = messenger.Send(message1);
33+
_ = messenger.Send(message2);
34+
35+
// The expected messages have been observed
36+
CollectionAssert.AreEqual(messages, new[] { message1, message2 });
37+
38+
disposable.Dispose();
39+
40+
_ = messenger.Send<MessageA>();
41+
42+
// No messages are sent after unsubscribing the observable
43+
CollectionAssert.AreEqual(messages, new[] { message1, message2 });
44+
}
45+
46+
[TestMethod]
47+
[DataRow(typeof(StrongReferenceMessenger))]
48+
[DataRow(typeof(WeakReferenceMessenger))]
49+
public void Test_Messenger_CreateObservable_WithToken(Type type)
50+
{
51+
IMessenger messenger = (IMessenger)Activator.CreateInstance(type)!;
52+
53+
IObservable<MessageA> observable = messenger.CreateObservable<MessageA, int>(42);
54+
55+
Assert.IsNotNull(observable);
56+
57+
List<MessageA> messages = new();
58+
59+
IDisposable disposable = observable.Subscribe(messages.Add);
60+
61+
MessageA message1 = new();
62+
MessageA message2 = new();
63+
64+
_ = messenger.Send(message1, 42);
65+
_ = messenger.Send(message2, 42);
66+
67+
_ = messenger.Send(new MessageA(), 1);
68+
_ = messenger.Send(new MessageA(), 999);
69+
70+
// The expected messages have been observed (only for matching tokens)
71+
CollectionAssert.AreEqual(messages, new[] { message1, message2 });
72+
73+
disposable.Dispose();
74+
75+
_ = messenger.Send(new MessageA(), 42);
76+
_ = messenger.Send(new MessageA(), 1);
77+
78+
// No messages are sent after unsubscribing the observable (regardless of token)
79+
CollectionAssert.AreEqual(messages, new[] { message1, message2 });
80+
}
81+
82+
[TestMethod]
83+
[ExpectedException(typeof(ArgumentNullException))]
84+
public void Test_Messenger_CreateObservable_NullMessenger()
85+
{
86+
_ = IMessengerExtensions.CreateObservable<MessageA>(null!);
87+
}
88+
89+
[TestMethod]
90+
[ExpectedException(typeof(ArgumentNullException))]
91+
public void Test_Messenger_CreateObservable_WithToken_NullMessenger()
92+
{
93+
_ = IMessengerExtensions.CreateObservable<MessageA, string>(null!, "Hello");
94+
}
95+
96+
[TestMethod]
97+
[ExpectedException(typeof(ArgumentNullException))]
98+
public void Test_Messenger_CreateObservable_WithToken_NullToken()
99+
{
100+
_ = IMessengerExtensions.CreateObservable<MessageA, string>(new WeakReferenceMessenger(), null!);
101+
}
102+
}

tests/CommunityToolkit.Mvvm.UnitTests/Test_Messenger.Request.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
namespace CommunityToolkit.Mvvm.UnitTests;
1414

15-
public partial class Test_Messenger
15+
partial class Test_Messenger
1616
{
1717
[TestMethod]
1818
[DataRow(typeof(StrongReferenceMessenger))]

0 commit comments

Comments
 (0)