using Quobject.EngineIoClientDotNet.ComponentEmitter; using Quobject.EngineIoClientDotNet.Modules; using System; using System.Collections.Generic; using System.Linq; using Xunit; namespace Quobject.EngineIoClientDotNet_Tests.ComponentEmitterTests { public class EmitterTests { public class TestListener1 : IListener { private readonly List _calls; public TestListener1(List calls) { this._calls = calls; } public void Call(params object[] args) { _calls.Add("one"); _calls.Add(args[0]); } public int CompareTo(IListener other) { return this.GetId().CompareTo(other.GetId()); } public int GetId() { return 0; } } public class TestListener2 : IListener { private readonly List _calls; public TestListener2(List calls) { this._calls = calls; } public void Call(params object[] args) { _calls.Add("two"); _calls.Add(args[0]); } public int CompareTo(IListener other) { return this.GetId().CompareTo(other.GetId()); } public int GetId() { return 0; } } [Fact] public void On() { var emitter = new Emitter(); var calls = new List(); var listener1 = new TestListener1(calls); emitter.On("foo", listener1); var listener2 = new TestListener2(calls); emitter.On("foo", listener2); emitter.Emit("foo", 1); emitter.Emit("bar", 1); emitter.Emit("foo", 2); var expected = new Object[] {"one", 1, "two", 1, "one", 2, "two", 2}; Assert.Equal(expected, calls.ToArray()); } [Fact] public void Once() { var emitter = new Emitter(); var calls = new List(); var listener1 = new TestListener1(calls); emitter.Once("foo", listener1); emitter.Emit("foo", 1); emitter.Emit("foo", 2); emitter.Emit("foo", 3); emitter.Emit("bar", 1); var expected = new Object[] {"one", 1}; Assert.Equal(expected, calls.ToArray()); } public class TestListener3 : IListener { private readonly List _calls; public TestListener3(List calls) { this._calls = calls; } public void Call(params object[] args) { _calls.Add("one"); } public int CompareTo(IListener other) { return this.GetId().CompareTo(other.GetId()); } public int GetId() { return 0; } } public class TestListener4 : IListener { private readonly List _calls; public TestListener4(List calls) { this._calls = calls; } public void Call(params object[] args) { _calls.Add("two"); } public int CompareTo(IListener other) { return this.GetId().CompareTo(other.GetId()); } public int GetId() { return 0; } } [Fact] public void Off() { var emitter = new Emitter(); var calls = new List(); var listener3 = new TestListener3(calls); emitter.On("foo", listener3); var listener4 = new TestListener4(calls); emitter.On("foo", listener4); emitter.Off("foo", listener4); emitter.Emit("foo"); var expected = new Object[] {"one"}; Assert.Equal(expected, calls.ToArray()); } [Fact] public void OffWithOnce() { var emitter = new Emitter(); var calls = new List(); var listener3 = new TestListener3(calls); emitter.Once("foo", listener3); emitter.Off("foo", listener3); emitter.Emit("foo"); var expected = new Object[] {}; Assert.Equal(expected, calls.ToArray()); } public class TestListener5 : IListener { private readonly List _called; public TestListener5(List called) { this._called = called; } public void Call(params object[] args) { this._called[0] = true; } public int CompareTo(IListener other) { return this.GetId().CompareTo(other.GetId()); } public int GetId() { return 0; } } public class TestListener6 : IListener { private readonly Emitter _emitter; private readonly IListener _bListener; public TestListener6(Emitter emitter, IListener bListener) { this._emitter = emitter; this._bListener = bListener; } public void Call(params object[] args) { _emitter.Off("tobi", _bListener); } public int CompareTo(IListener other) { return this.GetId().CompareTo(other.GetId()); } public int GetId() { return 0; } } [Fact] public void OffWhenCalledfromEvent() { var emitter = new Emitter(); var called = new List {false}; var listener5 = new TestListener5(called); var listener6 = new TestListener6(emitter, listener5); emitter.On("tobi", listener6); emitter.Once("tobi", listener5); emitter.Emit("tobi"); Assert.True(called[0]); called[0] = false; emitter.Emit("tobi"); Assert.False(called[0]); } [Fact] public void OffEvent() { var emitter = new Emitter(); var calls = new List(); var listener3 = new TestListener3(calls); emitter.On("foo", listener3); var listener4 = new TestListener4(calls); emitter.On("foo", listener3); emitter.On("foo", listener4); emitter.Off("foo"); emitter.Emit("foo"); emitter.Emit("foo"); var expected = new Object[] {}; Assert.Equal(expected, calls.ToArray()); } [Fact] public void OffAll() { var emitter = new Emitter(); var calls = new List(); var listener3 = new TestListener3(calls); var listener4 = new TestListener4(calls); emitter.On("foo", listener3); emitter.On("bar", listener4); emitter.Emit("foo"); emitter.Emit("bar"); emitter.Off(); emitter.Emit("foo"); emitter.Emit("bar"); var expected = new Object[] {"one", "two"}; Assert.Equal(expected, calls.ToArray()); } [Fact] public void Listeners() { var emitter = new Emitter(); var calls = new List(); var listener3 = new TestListener3(calls); emitter.On("foo", listener3); var expected = new IListener[] {listener3}; Assert.Equal(expected, emitter.Listeners("foo").ToArray()); } [Fact] public void ListenersWithoutHandlers() { var emitter = new Emitter(); var expected = new IListener[] {}; Assert.Equal(expected, emitter.Listeners("foo").ToArray()); } [Fact] public void HasListeners() { var emitter = new Emitter(); var calls = new List(); Assert.False(emitter.HasListeners("foo")); var listener3 = new TestListener3(calls); emitter.On("foo", listener3); Assert.True(emitter.HasListeners("foo")); } [Fact] public void HasListenersWithoutHandlers() { var emitter = new Emitter(); Assert.False(emitter.HasListeners("foo")); } } }