public static void BasicTests()
        {
            using (CreateTimer("ZeroBuffers"))
            {
                var bytes = BFast.WriteBFastToBytes(ZeroBuffers);
                TestBFastBytes(bytes);
                var tmp = BFast.ReadBFast(bytes).ToArray();
                Assert.AreEqual(0, tmp.Length);
            }
            using (CreateTimer("Ten1MBBuffers"))
            {
                var bytes = BFast.WriteBFastToBytes(Ten1MBBuffers);
                TestBFastBytes(bytes);
                var tmp = BFast.ReadBFast(bytes).ToArray();
                Assert.AreEqual(10, tmp.Length);
                Assert.AreEqual(tmp.Select(x => x.Name).ToArray(), Enumerable.Range(0, 10).Select(x => x.ToString()).ToArray());
                Assert.AreEqual(tmp.Select(x => (int)x.NumBytes()).ToArray(), Enumerable.Repeat(Mb, 10).ToArray());

                for (var i = 0; i < 10; ++i)
                {
                    Assert.AreEqual(Ten1MBBuffers[i].Item2, tmp[i].ToBytes(), $"Buffer {i} are different");
                }
            }
            using (CreateTimer("OneGBBuffer"))
            {
                //Enumerable.Range(0, Gb).Select(i => (double)i).ToArray()
                var bytes = BFast.WriteBFastToBytes(One1GBBuffer);
                TestBFastBytes(bytes);
                var tmp = BFast.ReadBFast(bytes).ToArray();
                Assert.AreEqual(1, tmp.Length);
                Assert.AreEqual(tmp.Select(x => x.Name).ToArray(), new[] { "0" });
                Assert.AreEqual(tmp.Select(x => x.NumBytes()).ToArray(), Enumerable.Repeat((long)Gb, 1).ToArray());
            }
        }
        public static void TestStringPacking()
        {
            var noStrings    = new string[0];
            var oneStrings   = new[] { "" };
            var twoStrings   = new[] { "", "ab" };
            var threeStrings = new[] { "a", "b", "" };
            var noPacked     = BFast.PackStrings(noStrings);
            var onePacked    = BFast.PackStrings(oneStrings);
            var twoPacked    = BFast.PackStrings(twoStrings);
            var threePacked  = BFast.PackStrings(threeStrings);

            Assert.AreEqual(0, noPacked.Length);
            Assert.AreEqual(1, onePacked.Length);
            Assert.AreEqual(4, twoPacked.Length);
            Assert.AreEqual(5, threePacked.Length);
            Assert.AreEqual(noStrings, BFast.UnpackStrings(noPacked));
            Assert.AreEqual(oneStrings, BFast.UnpackStrings(onePacked));
            Assert.AreEqual(twoStrings, BFast.UnpackStrings(twoPacked));
            Assert.AreEqual(threeStrings, BFast.UnpackStrings(threePacked));
        }
        public static void ValidateBFast(byte[] buffer, BFastBuilder srcBuilder)
        {
            var bfast = BFast.ReadBFast(buffer).ToArray();

            var names      = srcBuilder.BufferNames().ToArray();
            var sizes      = srcBuilder.BufferSizes().ToArray();
            var numBuffers = names.Count();

            // We should have the same number of buffers
            AssertEquals(bfast.Length, numBuffers);
            for (var i = 0; i < numBuffers; i++)
            {
                // Of equal size
                AssertEquals(bfast[i].Name, names[i]);
                AssertEquals(bfast[i].Data.Length, sizes[i]);
                // And they might be sub-buffers
                if (srcBuilder.Children[i].Item2 is BFastBuilder childBuilder)
                {
                    ValidateBFast(bfast[i].ToBytes(), childBuilder);
                }
            }
        }