Skip to content

Commit

Permalink
Add unit tests for messenger observable APIs
Browse files Browse the repository at this point in the history
  • Loading branch information
Sergio0694 committed Sep 30, 2022
1 parent 12435ac commit e266557
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<PackageReference Include="MSTest.TestAdapter" Version="2.2.8" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.8" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
<PackageReference Include="System.Reactive" Version="5.0.0" />
<PackageReference Include="System.Text.Json" Version="6.0.6" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<PackageReference Include="MSTest.TestAdapter" Version="2.2.8" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.8" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
<PackageReference Include="System.Reactive" Version="5.0.0" />
<PackageReference Include="System.Text.Json" Version="6.0.6" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Test_AsyncRelayCommand{T}.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Test_INotifyPropertyChangedAttribute.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Test_IRecipientGenerator.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Test_Messenger.Observables.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Test_Messenger.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Test_Messenger.Request.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Test_ObservableObject.cs" />
Expand Down
102 changes: 102 additions & 0 deletions tests/CommunityToolkit.Mvvm.UnitTests/Test_Messenger.Observables.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System;
using System.Collections.Generic;
using CommunityToolkit.Mvvm.Messaging;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace CommunityToolkit.Mvvm.UnitTests;

partial class Test_Messenger
{
[TestMethod]
[DataRow(typeof(StrongReferenceMessenger))]
[DataRow(typeof(WeakReferenceMessenger))]
public void Test_Messenger_CreateObservable(Type type)
{
IMessenger messenger = (IMessenger)Activator.CreateInstance(type)!;

IObservable<MessageA> observable = messenger.CreateObservable<MessageA>();

Assert.IsNotNull(observable);

List<MessageA> messages = new();

IDisposable disposable = observable.Subscribe(messages.Add);

MessageA message1 = new();
MessageA message2 = new();

_ = messenger.Send(message1);
_ = messenger.Send(message2);

// The expected messages have been observed
CollectionAssert.AreEqual(messages, new[] { message1, message2 });

disposable.Dispose();

_ = messenger.Send<MessageA>();

// No messages are sent after unsubscribing the observable
CollectionAssert.AreEqual(messages, new[] { message1, message2 });
}

[TestMethod]
[DataRow(typeof(StrongReferenceMessenger))]
[DataRow(typeof(WeakReferenceMessenger))]
public void Test_Messenger_CreateObservable_WithToken(Type type)
{
IMessenger messenger = (IMessenger)Activator.CreateInstance(type)!;

IObservable<MessageA> observable = messenger.CreateObservable<MessageA, int>(42);

Assert.IsNotNull(observable);

List<MessageA> messages = new();

IDisposable disposable = observable.Subscribe(messages.Add);

MessageA message1 = new();
MessageA message2 = new();

_ = messenger.Send(message1, 42);
_ = messenger.Send(message2, 42);

_ = messenger.Send(new MessageA(), 1);
_ = messenger.Send(new MessageA(), 999);

// The expected messages have been observed (only for matching tokens)
CollectionAssert.AreEqual(messages, new[] { message1, message2 });

disposable.Dispose();

_ = messenger.Send(new MessageA(), 42);
_ = messenger.Send(new MessageA(), 1);

// No messages are sent after unsubscribing the observable (regardless of token)
CollectionAssert.AreEqual(messages, new[] { message1, message2 });
}

[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void Test_Messenger_CreateObservable_NullMessenger()
{
_ = IMessengerExtensions.CreateObservable<MessageA>(null!);
}

[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void Test_Messenger_CreateObservable_WithToken_NullMessenger()
{
_ = IMessengerExtensions.CreateObservable<MessageA, string>(null!, "Hello");
}

[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void Test_Messenger_CreateObservable_WithToken_NullToken()
{
_ = IMessengerExtensions.CreateObservable<MessageA, string>(new WeakReferenceMessenger(), null!);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

namespace CommunityToolkit.Mvvm.UnitTests;

public partial class Test_Messenger
partial class Test_Messenger
{
[TestMethod]
[DataRow(typeof(StrongReferenceMessenger))]
Expand Down

0 comments on commit e266557

Please sign in to comment.