private void PacketReceive_EventCanceled <TPacket, TEvent>(TPacket packet, IPlayer sender)
            where TPacket : IPacket
            where TEvent : Event
        {
            Action <PacketReceiveEvent <TPacket> >?registeredHandler = null;

            var events = Mock.Of <IEventManager>();
            var log    = Mock.Of <ILogger>();

            Mock.Get(events)
            .Setup(em => em.RegisterHandler(It.IsAny <Action <PacketReceiveEvent <TPacket> > >(), log))
            .Callback <Action <PacketReceiveEvent <TPacket> >, ILogger>(
                (handler, log) => registeredHandler = handler);

            using var signService = new OrionSignService(events, log);

            var evt = new PacketReceiveEvent <TPacket>(packet, sender);

            Mock.Get(events)
            .Setup(em => em.Raise(It.IsAny <TEvent>(), log))
            .Callback <TEvent, ILogger>((evt, log) => evt.Cancel());

            Assert.NotNull(registeredHandler);
            registeredHandler !(evt);

            Assert.True(evt.IsCanceled);

            Mock.Get(events).VerifyAll();
        }
        public void Count_Get()
        {
            var events = Mock.Of <IEventManager>();
            var log    = Mock.Of <ILogger>();

            using var signService = new OrionSignService(events, log);

            Assert.Equal(Terraria.Sign.maxSigns, signService.Count);
        }
        public void Item_GetInvalidIndex_ThrowsIndexOutOfRangeException(int index)
        {
            var events = Mock.Of <IEventManager>();
            var log    = Mock.Of <ILogger>();

            using var signService = new OrionSignService(events, log);

            Assert.Throws <IndexOutOfRangeException>(() => signService[index]);
        }
        public void Item_GetMultipleTimes_ReturnsSameInstance()
        {
            Terraria.Main.sign[0] = new Terraria.Sign();

            var events = Mock.Of <IEventManager>();
            var log    = Mock.Of <ILogger>();

            using var signService = new OrionSignService(events, log);

            var sign  = signService[0];
            var sign2 = signService[0];

            Assert.Same(sign, sign2);
        }
        public void Item_Get()
        {
            Terraria.Main.sign[1] = new Terraria.Sign();

            var events = Mock.Of <IEventManager>();
            var log    = Mock.Of <ILogger>();

            using var signService = new OrionSignService(events, log);

            var sign = signService[1];

            Assert.Equal(1, sign.Index);
            Assert.Same(Terraria.Main.sign[1], ((OrionSign)sign).Wrapped);
        }
        public void GetEnumerator()
        {
            for (var i = 0; i < Terraria.Sign.maxSigns; ++i)
            {
                Terraria.Main.sign[i] = new Terraria.Sign();
            }

            var events = Mock.Of <IEventManager>();
            var log    = Mock.Of <ILogger>();

            using var signService = new OrionSignService(events, log);

            var signs = signService.ToList();

            for (var i = 0; i < signs.Count; ++i)
            {
                Assert.Same(Terraria.Main.sign[i], ((OrionSign)signs[i]).Wrapped);
            }
        }