internal async Task Non_Generic_Async_Event_Should_Run_Asynchronously()
        {
            var notifier   = new NonGenericNotifier();
            var tcs        = new TaskCompletionSource <object>();
            var eventFired = false;

            async Task RespondToSomethingHappening(object sender, EventArgs eventArgs)
            {
                await tcs.Task;

                eventFired = true;
            }

            notifier.SomethingHappened += RespondToSomethingHappening;

            var eventTask = notifier.OnSomethingHappening();

            await Task.Delay(100);

            eventFired.ShouldBeFalse();
            tcs.SetResult(null);

            await eventTask;

            eventFired.ShouldBeTrue();
        }
        internal async Task All_Handlers_Should_Finish_Before_Event_Task_Completes()
        {
            var notifier = new NonGenericNotifier();

            IEnumerable <TaskCompletionSource <object> > CreateAndSubscribeHandlers()
            {
                while (true)
                {
                    var tcs = new TaskCompletionSource <object>();

                    Task RespondToSomethingHappening(object sender, EventArgs eventArgs) => tcs.Task;

                    notifier.SomethingHappened += RespondToSomethingHappening;

                    yield return(tcs);
                }
            }

            // Reversing the order that the handlers signal completion ensures that we test that the event task
            // completes only when _all_ handlers finish, and not just the last one subscribed.
            var tcsArray  = CreateAndSubscribeHandlers().Take(5).Reverse().ToArray();
            var eventTask = notifier.OnSomethingHappening();

            foreach (var tcs in tcsArray.Reverse())
            {
                await Task.Delay(10);

                eventTask.IsCompleted.ShouldBeFalse();
                tcs.SetResult(null);
            }

            await eventTask;
        }
        internal async Task Exceptions_That_Occur_During_Event_Handling_Should_Be_Propagated()
        {
            var notifier = new NonGenericNotifier();

            Task FaultyHandler(object sender, EventArgs eventArgs) => throw new InvalidOperationException();

            notifier.SomethingHappened += FaultyHandler;

            await Should.ThrowAsync <InvalidOperationException>(async() => await notifier.OnSomethingHappening());
        }
        internal async Task Non_Generic_Synchronous_Event_Handlers_Should_Be_Convertible_To_Equivalent_Asynchronous_Handlers()
        {
            var notifier   = new NonGenericNotifier();
            var eventFired = false;

            notifier.SomethingHappened += Async((sender, args) => eventFired = true);

            await notifier.OnSomethingHappening();

            eventFired.ShouldBeTrue();
        }
        internal void Invoke_Async_Should_Return_Completed_Task_If_No_Handlers_Are_Subscribed()
        {
            var notifier = new NonGenericNotifier();

            notifier.OnSomethingHappening().IsCompleted.ShouldBeTrue();
        }