public void PooledDictionary_Serialization()
        {
            var ms = new MemoryStream();

            using (var obj = PooledDictionary <string, int> .New())
            {
                var map = obj.Dictionary;

                map.Add("qux", 42);
                map.Add("foo", 43);
                map.Add("bar", 44);
                map.Add("baz", 45);

                var fmt = new BinaryFormatter();
                fmt.Serialize(ms, map);
            }

            ms.Position = 0;

            {
                var fmt = new BinaryFormatter();
                var map = (PooledDictionary <string, int>)fmt.Deserialize(ms);

                Assert.IsTrue(map.TryGetValue("qux", out var val1) && val1 == 42);
                Assert.IsTrue(map.TryGetValue("foo", out var val2) && val2 == 43);
                Assert.IsTrue(map.TryGetValue("bar", out var val3) && val3 == 44);
                Assert.IsTrue(map.TryGetValue("baz", out var val4) && val4 == 45);

                map.Free(); // no-op but doesn't throw
            }
        }
        public void PooledDictionary_GlobalPool()
        {
            for (var i = 0; i < 100; i++)
            {
                using var obj = PooledDictionary <string, int> .New();

                var map = obj.Dictionary;

                Assert.AreEqual(0, map.Count);

                map.Add("qux", 42);
                map.Add("foo", 43);
                map.Add("bar", 44);
                map.Add("baz", 45);
            }
        }
        private static void PooledDictionary_Simple_Impl(DictionaryPool <string, int> pool)
        {
            for (var i = 0; i < 100; i++)
            {
                using var obj = i % 2 == 0 ? pool.New() : PooledDictionary <string, int> .New(pool);

                var map = obj.Dictionary;

                Assert.AreEqual(0, map.Count);

                map.Add("qux", 42);
                map.Add("foo", 43);
                map.Add("bar", 44);
                map.Add("baz", 45);
            }
        }
        public void PooledDictionary_GottenTooBig()
        {
            var bigPool = DictionaryPool <int, string> .Create(1, 16, EqualityComparer <int> .Default, 2048);

            var smallPool = DictionaryPool <int, string> .Create(1, 16, EqualityComparer <int> .Default, 16);

            TooBig(() => PooledDictionary <int, string> .New(), h => h.Dictionary, (h, n) => { for (var i = 0; i < n; i++)
                                                                                               {
                                                                                                   h.Add(i, "");
                                                                                               }
                   }, 1024);
            TooBig(() => bigPool.New(), h => h.Dictionary, (h, n) => { for (var i = 0; i < n; i++)
                                                                       {
                                                                           h.Add(i, "");
                                                                       }
                   }, 2048);
            TooBig(() => smallPool.New(), h => h.Dictionary, (h, n) => { for (var i = 0; i < n; i++)
                                                                         {
                                                                             h.Add(i, "");
                                                                         }
                   }, 16);
        }