public void Snapshot_Full()
        {
            var d = new TransactionalDictionary <int, char>
            {
                { 0, '0' },
                { 1, 'a' },
                { 2, 'b' },
                { 4, '4' },
                { 6, 'c' },
            };

            d[1] = '1';

            d.Remove(2);
            d[2] = '2';

            d.Add(5, '5');

            d.Remove(6);
            d.Add(6, 'd');

            d.Remove(6);
            d[6] = '6';

            d.Add(3, '3');

            var s = d.CreateSnapshot(differential: false);

            var res = new Dictionary <int, char>();

            var v = new DictionarySnapshotVisitor <int, char>(res);

            s.Accept(v);

            var e = new Dictionary <int, char>
            {
                { 0, '0' },
                { 1, '1' },
                { 2, '2' },
                { 3, '3' },
                { 4, '4' },
                { 5, '5' },
                { 6, '6' },
            };

            AssertEqual(e, d);
            AssertEqual(res, d);
        }
        public void Snapshot_Delta()
        {
            var res = new Dictionary <int, char>();
            var v   = new DictionarySnapshotVisitor <int, char>(res);

            var d = new TransactionalDictionary <int, char>
            {
                { 0, '0' },
                { 1, '1' },
                { 2, '2' },
                { 3, '3' },
                { 4, '4' },
                { 6, '6' },
            };

            CheckpointAndAssert(delta: false);

            d.Add(5, '5');

            CheckpointAndAssert(delta: true);

            d.Remove(2);

            CheckpointAndAssert(delta: true);

            d[0] = '-';

            CheckpointAndAssert(delta: true);

            d.Remove(5);
            d.Add(5, 'x');

            CheckpointAndAssert(delta: true);

            d.Remove(4);
            d.Add(4, 'x');
            d.Remove(4);

            CheckpointAndAssert(delta: true);

            d.Remove(3);
            d.Add(3, 'x');
            d.Remove(3);
            d.Add(3, 'y');

            CheckpointAndAssert(delta: true);

            d.Add(7, 'a');
            d.Remove(7);

            CheckpointAndAssert(delta: true);

            d.Add(8, 'b');
            d.Remove(8);
            d.Add(8, 'c');

            CheckpointAndAssert(delta: true);

            d.Add(9, 'd');
            d.Remove(9);
            d.Add(9, 'e');
            d.Remove(9);

            CheckpointAndAssert(delta: true);

            var e = new Dictionary <int, char>
            {
                { 0, '-' },
                { 1, '1' },
                { 3, 'y' },
                { 5, 'x' },
                { 6, '6' },
                { 8, 'c' },
            };

            AssertEqual(e, d);

            void CheckpointAndAssert(bool delta)
            {
                var s1 = d.CreateSnapshot(delta);

                s1.Accept(v);
                s1.OnCommitted();

                AssertEqual(res, d);
            }
        }