public void InvertedLookupReactiveEntityCollection_ArgumentChecks()
        {
            var inner = new ReactiveEntityCollection <string, string>(StringComparer.Ordinal);

            AssertEx.ThrowsException <ArgumentNullException>(() => _ = new InvertedLookupReactiveEntityCollection <string, string>(default(IReactiveEntityCollection <string, string>), StringComparer.Ordinal), ex => Assert.AreEqual("collection", ex.ParamName));
            AssertEx.ThrowsException <ArgumentNullException>(() => _ = new InvertedLookupReactiveEntityCollection <string, string>(inner, null), ex => Assert.AreEqual("valueComparer", ex.ParamName));
        }
        public void InvertedLookupReactiveEntityCollection_Simple()
        {
            var collection = new InvertedLookupReactiveEntityCollection <string, int>(
                new ReactiveEntityCollection <string, int>(StringComparer.Ordinal),
                EqualityComparer <int> .Default)
            {
                { "foo", 1 },
                { "bar", 2 }
            };

            Assert.IsTrue(collection.TryGetKey(1, out var key));
            Assert.AreEqual("foo", key);

            Assert.IsFalse(collection.TryGetKey(3, out key));

            Assert.IsTrue(collection.TryRemove("foo", out var value));
            Assert.AreEqual(1, value);

            Assert.IsFalse(collection.TryGetKey(1, out key));
            Assert.IsFalse(collection.TryGetValue("foo", out value));

            Assert.IsTrue(collection.ContainsKey("bar"));
            Assert.IsTrue(collection.TryGetValue("bar", out value));
            Assert.AreEqual(2, value);
            Assert.IsTrue(collection.TryGetKey(2, out key));
            Assert.AreEqual("bar", key);

            Assert.IsTrue(collection.RemovedKeys.SequenceEqual(new[] { "foo" }));
            collection.ClearRemovedKeys(new[] { "foo" });
            Assert.AreEqual(0, collection.RemovedKeys.Count());

            collection.Add("foo", 1);
            collection.Add("qux", 3);
            collection.Add("baz", 4);

            Assert.IsTrue(collection.Values.OrderBy(x => x).SequenceEqual(new[] { 1, 2, 3, 4 }));
            Assert.IsTrue(collection.OrderBy(kv => kv.Value)
                          .SequenceEqual(new Dictionary <string, int> {
                { "foo", 1 }, { "bar", 2 }, { "qux", 3 }, { "baz", 4 }
            }.OrderBy(kv => kv.Value)));

            collection.Clear();
            Assert.AreEqual(0, collection.Count());
        }