public void ShouldBeSerializable()
        {
            string name = RndProvider.GetString(16);
            int    age  = RndProvider.Next(1, 100);

            byte[] rndBytes = RndProvider.GetNonZeroBytes(128);

            // build
            Payload payload = new Payload.Builder()
                              .Value("name", name)
                              .Value("age", age)
                              .Value("rndBytes", rndBytes)
                              .Build();

            // serialize & deserialize
            Payload received = Payload.Parse(payload.ToBytes());

            // assert
            Assert.Equal(name, received.Value <string>("name"));
            Assert.Equal(age, received.Value <int>("age"));
            Assert.True(rndBytes.SequenceEqual(received.Value <byte[]>("rndBytes")));
            Assert.Equal(payload.Hash.ToHex(), received.Hash.ToHex());

            Assert.Equal(payload.Hash, received.Hash);
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            ILoggable logger = new BLog.Builder()
                               .WithConsole(true)
                               .WithFilter(LogFilter.All)
                               .Build();

            using (CancellationTokenSource cts = new CancellationTokenSource())
            {
                Console.CancelKeyPress += (sender, e) =>
                {
                    e.Cancel = true;
                    cts.Cancel();
                };

                while (!cts.IsCancellationRequested)
                {
//                    Thread.Sleep(100);

                    Payload payload = new Payload.Builder()
                                      .Value("rndBytes", RndProvider.GetNonZeroBytes(MessageLength))
                                      .Build();

                    TcpClient.SendTo("127.0.0.1", PORT, payload.ToBytes());
                }
            }
        }
        public void ShouldBeAbleToOverlap()
        {
            Payload header = new Payload.Builder()
                             .Value("ver", 0x01)
                             .Build();

            Payload body = new Payload.Builder()
                           .Value("message", "Hello, Bryllite!")
                           .Value("rndBytes", RndProvider.GetNonZeroBytes(128))
                           .Build();

            Payload message = new Payload.Builder()
                              .Value("header", header)
                              .Value("body", body)
                              .Build();

            Payload received = Payload.Parse(message.ToBytes());

            Payload receivedHeader = received.Value <Payload>("header");
            Payload receivedBody   = received.Value <Payload>("body");

            Assert.Equal(message.Hash, received.Hash);
            Assert.Equal(header.Hash, receivedHeader.Hash);
            Assert.Equal(body.Hash, receivedBody.Hash);

            Assert.Equal(header.Value <int>("ver"), receivedHeader.Value <int>("ver"));
            Assert.Equal(body.Value <string>("message"), receivedBody.Value <string>("message"));
            Assert.Equal(body.Value <byte[]>("rndBytes"), receivedBody.Value <byte[]>("rndBytes"));
        }
        public void PayloadShouldBeParsable()
        {
            Elastic3D     to     = new Elastic3D(1, 2, 3);
            ElasticLayout layout = ElasticLayout.DefineLayout(1024);

            Payload payload = new Payload.Builder()
                              .Value("to", to)
                              .Value("layout", layout)
                              .Build();

            Payload received = Payload.Parse(payload.ToBytes());

            Elastic3D     receivedTo     = received.Value <Elastic3D>("to");
            ElasticLayout receivedLayout = received.Value <ElasticLayout>("layout");

            Assert.Equal(1, receivedTo.X);
            Assert.Equal(2, receivedTo.Y);
            Assert.Equal(3, receivedTo.Z);
            Assert.Equal(to, receivedTo);

            Assert.Equal(layout.X, receivedLayout.X);
            Assert.Equal(layout.Y, receivedLayout.Y);
            Assert.Equal(layout.Z, receivedLayout.Z);
        }