private static void InMemoryKeyValueStore_AllOperations_MultipleTransaction_Core(bool saveAndLoad)
        {
            var kvs = new InMemoryKeyValueStore();

            void SaveAndLoad()
            {
                if (!saveAndLoad)
                {
                    return;
                }

                using var ms = new MemoryStream();

                kvs.Save(ms);

                ms.Position = 0;

                kvs = InMemoryKeyValueStore.Load(ms);
            }

            var subtable = kvs.GetTable("MyTable");

            using (var tx = kvs.CreateTransaction())
            {
                var table = subtable.Enter(tx);

                table.Add("A", new byte[] { 1 });

                tx.CommitAsync().Wait();
            }

            SaveAndLoad();

            using (var tx = kvs.CreateTransaction())
            {
                var table = subtable.Enter(tx);

                var one = table["A"];

                CollectionAssert.AreEqual(new byte[] { 1 }, one);

                tx.CommitAsync().Wait();
            }

            SaveAndLoad();

            using (var tx = kvs.CreateTransaction())
            {
                var table = subtable.Enter(tx);

                table.Update("A", new byte[] { 2 });

                tx.CommitAsync().Wait();
            }

            SaveAndLoad();

            using (var tx = kvs.CreateTransaction())
            {
                var table = subtable.Enter(tx);

                Assert.IsTrue(table.Contains("A"));

                tx.CommitAsync().Wait();
            }

            SaveAndLoad();

            using (var tx = kvs.CreateTransaction())
            {
                var table = subtable.Enter(tx);

                var two = table["A"];

                CollectionAssert.AreEqual(new byte[] { 2 }, two);

                tx.CommitAsync().Wait();
            }

            SaveAndLoad();

            using (var tx = kvs.CreateTransaction())
            {
                var table = subtable.Enter(tx);

                var contents = table.ToList();

                Assert.AreEqual(contents.Count, 1);
                Assert.AreEqual(contents[0].Key, "A");
                CollectionAssert.AreEquivalent(contents[0].Value, new byte[] { 2 });

                tx.CommitAsync().Wait();
            }

            SaveAndLoad();

            using (var tx = kvs.CreateTransaction())
            {
                var table = subtable.Enter(tx);

                table.Remove("A");

                tx.CommitAsync().Wait();
            }

            SaveAndLoad();

            using (var tx = kvs.CreateTransaction())
            {
                var table = subtable.Enter(tx);

                Assert.IsFalse(table.Contains("A"));

                tx.CommitAsync().Wait();
            }

            SaveAndLoad();

            using (var tx = kvs.CreateTransaction())
            {
                var table = subtable.Enter(tx);

                Assert.AreEqual(table.Count(), 0);
            }
        }
 public void DeserializeStore(byte[] bytes)
 {
     using var stream = new MemoryStream(bytes);
     _kvs             = InMemoryKeyValueStore.Load(stream);
 }