elliebot/src/EllieBot.Tests/PubSubTests.cs
2024-06-19 15:14:05 +12:00

136 lines
No EOL
3.9 KiB
C#

using System.Threading.Tasks;
using Ellie.Common;
using NUnit.Framework;
using NUnit.Framework.Internal;
namespace EllieBot.Tests
{
public class PubSubTests
{
[Test]
public async Task Test_EventPubSub_PubSub()
{
TypedKey<int> key = "test_key";
var expected = new Randomizer().Next();
var pubsub = new EventPubSub();
await pubsub.Sub(key, data =>
{
Assert.AreEqual(expected, data);
Assert.Pass();
return default;
});
await pubsub.Pub(key, expected);
Assert.Fail("Event not registered");
}
[Test]
public async Task Test_EventPubSub_MeaninglessUnsub()
{
TypedKey<int> key = "test_key";
var expected = new Randomizer().Next();
var pubsub = new EventPubSub();
await pubsub.Sub(key, data =>
{
Assert.AreEqual(expected, data);
Assert.Pass();
return default;
});
await pubsub.Unsub(key, _ => default);
await pubsub.Pub(key, expected);
Assert.Fail("Event not registered");
}
[Test]
public async Task Test_EventPubSub_MeaninglessUnsubThatLooksTheSame()
{
TypedKey<int> key = "test_key";
var expected = new Randomizer().Next();
var pubsub = new EventPubSub();
await pubsub.Sub(key, data =>
{
Assert.AreEqual(expected, data);
Assert.Pass();
return default;
});
await pubsub.Unsub(key, data =>
{
Assert.AreEqual(expected, data);
Assert.Pass();
return default;
});
await pubsub.Pub(key, expected);
Assert.Fail("Event not registered");
}
[Test]
public async Task Test_EventPubSub_MeaningfullUnsub()
{
TypedKey<int> key = "test_key";
var pubsub = new EventPubSub();
ValueTask Action(int data)
{
Assert.Fail("Event is raised when it shouldn't be");
return default;
}
await pubsub.Sub(key, Action);
await pubsub.Unsub(key, Action);
await pubsub.Pub(key, 0);
Assert.Pass();
}
[Test]
public async Task Test_EventPubSub_ObjectData()
{
TypedKey<byte[]> key = "test_key";
var pubsub = new EventPubSub();
var localData = new byte[1];
ValueTask Action(byte[] data)
{
Assert.AreEqual(localData, data);
Assert.Pass();
return default;
}
await pubsub.Sub(key, Action);
await pubsub.Pub(key, localData);
Assert.Fail("Event not raised");
}
[Test]
public async Task Test_EventPubSub_MultiSubUnsub()
{
TypedKey<object> key = "test_key";
var pubsub = new EventPubSub();
var localData = new object();
int successCounter = 0;
ValueTask Action1(object data)
{
Assert.AreEqual(localData, data);
successCounter += 10;
return default;
}
ValueTask Action2(object data)
{
Assert.AreEqual(localData, data);
successCounter++;
return default;
}
await pubsub.Sub(key, Action1); // + 10 \
await pubsub.Sub(key, Action2); // + 1 - + = 12
await pubsub.Sub(key, Action2); // + 1 /
await pubsub.Unsub(key, Action2); // - 1/
await pubsub.Pub(key, localData);
Assert.AreEqual(successCounter, 11, "Not all events are raised.");
}
}
}