public async Task BroadcastNewTagItemDataShouldSendNewTagItemToClients()
        {
            // Arrange
            NewTagItem receivedTagItem                      = null;
            var        connection                           = GetConnection(_factory);
            var        hasListenerBeenTriggered             = false;
            var        hasListenerBeenTriggeredAttemptCount = 0;

            connection.On <Object>("newTag", (tagItem) =>
            {
                //With some types, the conversion from json to a C# object must be done by hand:
                receivedTagItem          = Newtonsoft.Json.JsonConvert.DeserializeObject <NewTagItem>(tagItem.ToString());
                hasListenerBeenTriggered = true;
            });
            await connection.StartAsync();

            // Act
            PersistingValues.TagItem = new NewTagItem(4, 5, true);
            await connection.InvokeAsync("BroadcastNewTagItemData");

            //Assert
            while (!hasListenerBeenTriggered && hasListenerBeenTriggeredAttemptCount < MAX_HAS_LISTENER_BEEN_TRIGGERED_ATTEMPTS)
            {
                Thread.Sleep(1);
                hasListenerBeenTriggeredAttemptCount++;
            }
            if (!hasListenerBeenTriggered)
            {
                throw new Exception("Listener wasn't triggered.");
            }

            //Once we get here, the message has been sent by the server and the client has received it and reacted to it.
            receivedTagItem.Should().NotBe(null);
            receivedTagItem.positionX.Should().Be(4);
        }
        public async Task BroadcastPlayerHitNewTagItemShouldSendNewTagIdAndNewTagItemDataToClients()
        {
            // Arrange
            string     receivedTagId   = null;
            NewTagItem receivedTagItem = null;

            var hasListenerBeenTriggeredPlayerBecomesTag = false;
            var hasListenerBeenTriggeredNewTagItem       = false;
            var hasListenerBeenTriggeredAttemptCount     = 0;
            var connection = GetConnection(_factory);

            connection.On <Object>("newTag", (tagItem) =>
            {
                //With some types, the conversion from json to a C# object must be done by hand:
                receivedTagItem = Newtonsoft.Json.JsonConvert.DeserializeObject <NewTagItem>(tagItem.ToString());
                hasListenerBeenTriggeredNewTagItem = true;
            });
            connection.On <string>("broadcastPlayerBecomesTag", (tagId) =>
            {
                receivedTagId = tagId;
                hasListenerBeenTriggeredPlayerBecomesTag = true;
            });
            await connection.StartAsync();

            // Act
            await connection.InvokeAsync("BroadcastPlayerHitNewTagItem", "123");

            //Assert
            while ((!hasListenerBeenTriggeredPlayerBecomesTag || !hasListenerBeenTriggeredNewTagItem) && hasListenerBeenTriggeredAttemptCount < MAX_HAS_LISTENER_BEEN_TRIGGERED_ATTEMPTS)
            {
                Thread.Sleep(1);
                hasListenerBeenTriggeredAttemptCount++;
            }
            if (!hasListenerBeenTriggeredPlayerBecomesTag)
            {
                throw new Exception("Listener (broadcastPlayerBecomesTag) wasn't triggered.");
            }
            if (!hasListenerBeenTriggeredNewTagItem)
            {
                throw new Exception("Listener (newTag) wasn't triggered.");
            }

            //Once we get here, the message has been sent by the server and the client has received it and reacted to it.
            receivedTagId.Should().Be("123");
            receivedTagItem.isInPlay.Should().BeFalse();
        }