public void TestAddRange(bool track)
        {
            var events = 0;
            var acc    = new Accumulator("test");
            var dic    = new TrackableDictionary <string, int>(acc, track)
            {
                { "one", 1 }, { "two", 2 }
            };
            var other = new TrackableDictionary <string, int>()
            {
                { "three", 3 }, { "four", 4 }
            };

            dic.CollectionChanged += (s, e) =>
            {
                events++;
                Assert.AreEqual(e.Action, NotifyCollectionChangedAction.Reset);
            };
            dic.AddRange(other);
            Assert.IsTrue(dic.ContainsKey("three"));
            Assert.IsTrue(dic.ContainsKey("four"));
            Assert.AreEqual(dic["three"], 3);
            Assert.AreEqual(dic["four"], 4);
            Assert.AreEqual(1, events);
            if (track)
            {
                Assert.AreEqual(4, acc.Records.Count);
            }
            else
            {
                Assert.AreEqual(0, acc.Records.Count);
            }
        }
        public void TestAdd(bool track)
        {
            var events = 0;
            var acc    = new Accumulator("test");
            var dic    = new TrackableDictionary <string, int>(acc, track)
            {
                { "one", 1 }, { "two", 2 }
            };

            dic.CollectionChanged += (s, e) =>
            {
                events++;
                Assert.AreEqual(e.Action, NotifyCollectionChangedAction.Add);
                Assert.AreEqual(e.NewItems[0], new KeyValuePair <string, int>("three", 3));
            };
            dic.Add("three", 3);
            Assert.IsTrue(dic.ContainsKey("three"));
            Assert.AreEqual(dic["three"], 3);

            Assert.AreEqual(1, events);

            if (track)
            {
                Assert.AreEqual(3, acc.Records.Count);
            }
            else
            {
                Assert.AreEqual(0, acc.Records.Count);
            }
        }
        public void TestTryGetValueAndRemoveKey(bool track)
        {
            var events = 0;
            var acc    = new Accumulator("test");
            var dic    = new TrackableDictionary <string, int>(acc, track)
            {
                { "one", 1 }, { "two", 2 }
            };

            dic.CollectionChanged += (s, e) =>
            {
                events++;
                Assert.AreEqual(e.Action, NotifyCollectionChangedAction.Remove);
                Assert.AreEqual(e.OldItems[0], new KeyValuePair <string, int>("one", 1));
            };
            Assert.IsTrue(dic.TryGetValueAndRemoveKey("one", out var val));
            Assert.AreEqual(1, val);
            Assert.IsFalse(dic.ContainsKey("one"));
            Assert.AreEqual(1, events);
            if (track)
            {
                Assert.AreEqual(3, acc.Records.Count);
            }
            else
            {
                Assert.AreEqual(0, acc.Records.Count);
            }
        }
        public void TestTryGetValue(bool track)
        {
            var acc = new Accumulator("test");
            var dic = new TrackableDictionary <string, int>(acc, track)
            {
                { "one", 1 }, { "two", 2 }
            };

            Assert.IsTrue(dic.TryGetValue("one", out var val));
            Assert.AreEqual(1, val);
            Assert.IsTrue(dic.ContainsKey("one"));

            Assert.IsFalse(dic.TryGetValue("four", out val));

            if (track)
            {
                Assert.AreEqual(2, acc.Records.Count);
            }
            else
            {
                Assert.AreEqual(0, acc.Records.Count);
            }
        }