using System.Collections.Generic; using System.Linq; using ICD.Common.Utils.Extensions; using NUnit.Framework; namespace ICD.Common.Utils.Tests.Extensions { [TestFixture] public sealed class DictionaryExtensionsTest { [Test] public void RemoveValueTest() { Dictionary dict = new Dictionary { {1, 10}, {2, 20}, {3, 30}, {4, 40} }; Assert.IsTrue(dict.RemoveValue(10)); Assert.IsFalse(dict.RemoveValue(0)); Assert.IsFalse(dict.ContainsKey(1)); Assert.AreEqual(3, dict.Count); } [Test] public void RemoveAllValuesTest() { Dictionary dict = new Dictionary { {1, 10}, {2, 10}, {3, 30}, {4, 40} }; dict.RemoveAllValues(10); Assert.IsFalse(dict.ContainsKey(1)); Assert.IsFalse(dict.ContainsKey(2)); Assert.AreEqual(2, dict.Count); } [Test] public void GetDefaultTest() { Dictionary dict = new Dictionary { {1, 10}, {2, 10}, {3, 30}, {4, 40} }; Assert.AreEqual(10, dict.GetDefault(1)); Assert.AreEqual(0, dict.GetDefault(0)); } [Test] public void GetDefaultValueTest() { Dictionary dict = new Dictionary { {1, 10}, {2, 10}, {3, 30}, {4, 40} }; Assert.AreEqual(10, dict.GetDefault(1, 1000)); Assert.AreEqual(1000, dict.GetDefault(0, 1000)); } [Test] public void GetOrAddDefaultTest() { Dictionary dict = new Dictionary { {1, 10}, {2, 10}, {3, 30}, {4, 40} }; Assert.AreEqual(10, dict.GetOrAddDefault(1, 1000)); Assert.AreEqual(1000, dict.GetOrAddDefault(0, 1000)); Assert.AreEqual(1000, dict[0]); Assert.AreEqual(5, dict.Count); } [Test] public void GetKeyTest() { Dictionary dict = new Dictionary { {1, 10}, {2, 20}, {3, 30} }; Assert.AreEqual(1, dict.GetKey(10)); Assert.AreEqual(2, dict.GetKey(20)); Assert.AreEqual(3, dict.GetKey(30)); Assert.Throws(() => dict.GetKey(40)); } [Test] public void TryGetKeyTest() { Dictionary dict = new Dictionary { {1, 10}, {2, 20}, {3, 30} }; int key; Assert.IsTrue(dict.TryGetKey(10, out key)); Assert.AreEqual(1, key); Assert.IsTrue(dict.TryGetKey(20, out key)); Assert.AreEqual(2, key); Assert.IsTrue(dict.TryGetKey(30, out key)); Assert.AreEqual(3, key); } [Test] public void GetKeysTest() { Dictionary dict = new Dictionary { {1, 10}, {2, 10}, {3, 30} }; int[] aKeys = dict.GetKeys(10).ToArray(); int[] bKeys = dict.GetKeys(20).ToArray(); int[] cKeys = dict.GetKeys(30).ToArray(); Assert.AreEqual(2, aKeys.Length); Assert.IsTrue(aKeys.Contains(1)); Assert.IsTrue(aKeys.Contains(2)); Assert.AreEqual(0, bKeys.Length); Assert.AreEqual(1, cKeys.Length); Assert.IsTrue(cKeys.Contains(3)); } [Test] public void UpdateTest() { Dictionary a = new Dictionary { {1, 10}, {2, 10} }; Dictionary b = new Dictionary { {2, 20}, {3, 30} }; Assert.IsTrue(a.Update(b)); Assert.IsFalse(a.Update(b)); Assert.AreEqual(3, a.Count); Assert.AreEqual(10, a[1]); Assert.AreEqual(20, a[2]); Assert.AreEqual(30, a[3]); Assert.AreEqual(2, b.Count); Assert.AreEqual(20, b[2]); Assert.AreEqual(30, b[3]); } [Test] public void AddRangeValueKeyFuncTest() { Assert.Inconclusive(); } [Test] public void AddRangeKeyValueFuncTest() { Assert.Inconclusive(); } [Test] public void AddRangeTest() { Assert.Inconclusive(); } [Test] public void DictionaryEqualTest() { Dictionary a = new Dictionary { {1, 10}, {2, 20}, {3, 30} }; Dictionary b = new Dictionary { {1, 10}, {2, 20}, {3, 30} }; Dictionary c = new Dictionary { {1, 10}, {2, 20} }; Assert.IsTrue(a.DictionaryEqual(b)); Assert.IsTrue(b.DictionaryEqual(a)); Assert.IsFalse(a.DictionaryEqual(c)); Assert.IsFalse(c.DictionaryEqual(a)); } [Test] public void DictionaryEqualComparerTest() { Assert.Inconclusive(); } [Test] public void DictionaryEqualFuncComparerTest() { Dictionary a = new Dictionary { {1, 10}, {2, 20}, {3, 30} }; Dictionary b = new Dictionary { {1, 10}, {2, 20}, {3, 30} }; Dictionary c = new Dictionary { {1, 10}, {2, 20} }; Assert.IsTrue(a.DictionaryEqual(b, (left, right) => left / 10 == right / 10)); Assert.IsTrue(b.DictionaryEqual(a, (left, right) => left / 10 == right / 10)); Assert.IsFalse(a.DictionaryEqual(c, (left, right) => left / 10 == right / 10)); Assert.IsFalse(c.DictionaryEqual(a, (left, right) => left / 10 == right / 10)); } [Test] public void OrderByKeyTest() { Dictionary a = new Dictionary { {1, 10}, {2, 20}, {3, 30} }; KeyValuePair[] ordered = a.OrderByKey().ToArray(); Assert.AreEqual(3, ordered.Length); Assert.AreEqual(10, ordered[0].Value); Assert.AreEqual(20, ordered[1].Value); Assert.AreEqual(30, ordered[2].Value); } [Test] public void OrderValuesByKeyTest() { Dictionary a = new Dictionary { {1, 10}, {2, 20}, {3, 30} }; int[] ordered = a.OrderValuesByKey().ToArray(); Assert.AreEqual(3, ordered.Length); Assert.AreEqual(10, ordered[0]); Assert.AreEqual(20, ordered[1]); Assert.AreEqual(30, ordered[2]); } [Test] public void ToInverseTest() { Dictionary forward = new Dictionary { { 1, "testA" }, { 2, "testA" }, { 3, "testB" }, { 4, "testB" } }; Dictionary> backwards = new Dictionary> { {"testA", new List {1, 2}}, {"testB", new List {3, 4}} }; Dictionary> inverse = forward.ToInverse(); bool equal = inverse.DictionaryEqual(backwards, (v1, v2) => v1.ScrambledEquals(v2)); Assert.IsTrue(equal); } } }