예제 #1
0
        public void TestMultiplePacket()
        {
            var codec = new PacketCodec();

            var a = new ConnectPacket();
            var b = new DisconnectPacket();

            var stream = new MemoryStream();
            var writer = new BinaryWriter(stream);
            var data   = ByteJoin.Combine(codec.Encode(a), codec.Encode(b));

            var reader = new BinaryReader(new MemoryStream(data));
            var iter   = new PacketEnumerator(reader);

            // 1st packet
            {
                Assert.True(iter.MoveNext());
                ConnectPacket p;
                Assert.True(iter.GetCurrent(out p));
                Assert.Equal(a, p);
            }

            // 2nd packet
            {
                Assert.True(iter.MoveNext());
                DisconnectPacket p;
                Assert.True(iter.GetCurrent(out p));
                Assert.Equal(b, p);
            }

            // end of stream
            {
                Assert.False(iter.MoveNext());
            }
        }
예제 #2
0
        public void TestEmpty()
        {
            var reader = new BinaryReader(new MemoryStream(new byte[] { }));
            var iter   = new PacketEnumerator(reader);

            Assert.False(iter.MoveNext());
        }
예제 #3
0
        protected virtual IEnumerable <PacketInterval> NonEmptyExecute()
        {
            // this is possibly a deferred execution enumerable
            // You should record the state of the query parameters
            // and check the match only against the recorded state.
            //
            // avoid the following mistake of user code:
            //
            // var intervals = query.Resolution(0).Execute();
            // query.Resolution(1);
            // foreach(var ival in interval) { ... }
            var qp      = _qp.Clone() as PreciseQueryParams;
            var packets = PacketEnumerator.Create(_ctx);
            int start   = -1;
            int end     = -1;

            foreach (var pack in packets.Where(qp.Matches))
            {
                if (start == -1)
                {
                    start = pack.PacketIdx;
                    end   = start + 1;
                }
                else if (pack.PacketIdx == end)
                {
                    // the current matching packet
                    // has extended our interval
                    end++;
                }
                else
                {
                    // ok, done for now, grab preceding interval
                    // and create a new one.
                    var ival = new PacketInterval(_ctx.TileIdx, start, end);
                    start = pack.PacketIdx;
                    end   = start + 1;
                    yield return(ival);
                }
            }
            // now grab the last interval that could not be grabbed
            // due to the end of the enumeration.
            if (start != -1)
            {
                yield return(new PacketInterval(_ctx.TileIdx, start, end));
            }
        }
예제 #4
0
        public void TestSinglePacket()
        {
            var codec  = new PacketCodec();
            var a      = new ConnectPacket();
            var stream = new MemoryStream();
            var writer = new BinaryWriter(stream);
            var data   = codec.Encode(a);

            var reader = new BinaryReader(new MemoryStream(data));
            var iter   = new PacketEnumerator(reader);

            Assert.True(iter.MoveNext());
            Assert.Equal((short)a.Type, iter.CurrentType);
            ConnectPacket p;

            Assert.True(iter.GetCurrent(out p));
            Assert.Equal(a, p);
        }