private void TestPacketScopes(Client client)
        {
            _ = Task.Run(async() =>
            {
                using (var scope = new ClientPacketScope(new Client[] { client }))
                {
                    await Task.Delay(500);
                    client.SendPacket(new ChatEchoPacket(this.root.Id, "After 500 #1", Color.White));
                    await Task.Delay(500);
                    client.SendPacket(new ChatEchoPacket(this.root.Id, "After 500 #2", Color.White));
                }
            });

            _ = Task.Run(async() =>
            {
                using (var scope = new ClientPacketScope(new Client[] { }))
                {
                    for (int i = 0; i < 10; i++)
                    {
                        await Task.Delay(100);
                        client.SendPacket(new ChatEchoPacket(this.root.Id, $"After 100 #{i + 1}", Color.White));
                    }
                }
            });
        }
    public void ClientOutOfScope_DoesNotSendPacket()
    {
        var server = new TestingServer();

        var player = server.AddFakePlayer();

        using var scope = new ClientPacketScope(Array.Empty <IClient>());
        player.Client.SendPacket(new SetElementModelRpcPacket(player.Id, 0));

        server.VerifyPacketSent(Packets.Enums.PacketId.PACKET_ID_LUA_ELEMENT_RPC, player, count: 0);
    }
    public void ClientInScope_SendsPacket()
    {
        var server = new TestingServer();

        var player = server.AddFakePlayer();

        using var scope = new ClientPacketScope(new IClient[] { player.Client });
        player.Client.SendPacket(new SetElementModelRpcPacket(player.Id, 0));

        server.VerifyPacketSent(Packets.Enums.PacketId.PACKET_ID_LUA_ELEMENT_RPC, player);
    }
    public void ClientOutOfScope_DoesNotSendPacket()
    {
        var server = new TestingServer();

        var player = server.AddFakePlayer();

        using var scope = new ClientPacketScope(Array.Empty <Client>());
        player.Client.SendPacket(new SetElementModelRpcPacket(player.Id, 0));

        server.NetWrapperMock.Verify(x => x.SendPacket(
                                         player.Address,
                                         It.IsAny <ushort>(),
                                         It.IsAny <SetElementModelRpcPacket>()
                                         ), Times.Never);
    }
    public void ClientInScope_SendsPacket()
    {
        var server = new TestingServer();

        var player = server.AddFakePlayer();

        using var scope = new ClientPacketScope(new Client[] { player.Client });
        player.Client.SendPacket(new SetElementModelRpcPacket(player.Id, 0));

        server.NetWrapperMock.Verify(x => x.SendPacket(
                                         player.Address,
                                         It.IsAny <ushort>(),
                                         It.IsAny <SetElementModelRpcPacket>()
                                         ), Times.Once);
    }
    public async Task AsyncScopes_DoNotInterfere()
    {
        var server = new TestingServer();

        var player = server.AddFakePlayer();

        await Task.WhenAll(new Task[]
        {
            Task.Run(async() =>
            {
                await Task.Delay(10);
                using var scope = new ClientPacketScope(new Client[] { player.Client });
                player.Client.SendPacket(new SetElementModelRpcPacket(player.Id, 1));
                await Task.Delay(25);
            }),
            Task.Run(async() =>
            {
                using var scope = new ClientPacketScope(Array.Empty <Client>());
                await Task.Delay(25);
                player.Client.SendPacket(new SetElementModelRpcPacket(player.Id, 2));
            })
        });