📄 orderedmultidictionarytests.cs
字号:
//******************************
// Written by Peter Golde
// Copyright (c) 2004-2005, Wintellect
//
// Use and restribution of this code is subject to the license agreement
// contained in the file "License.txt" accompanying this file.
//******************************
using System;
using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using Wintellect.PowerCollections.Tests;
namespace Wintellect.PowerCollections.Tests
{
using MyInt = OrderedDictionaryTests.MyInt;
[TestFixture]
public class OrderedMultiDictionaryTests
{
// Check the contents of a Multi-Dictionary non-destructively. Keys and Values must be in order.
internal static void CheckOrderedMultiDictionaryContents<TKey, TValue>(OrderedMultiDictionary<TKey, TValue> dict, TKey[] keys, TValue[][] values, TKey nonKey, TValue nonValue, BinaryPredicate<TKey> keyEquals, BinaryPredicate<TValue> valueEquals)
{
int iKey, iValue;
ICollection<TValue> getValues;
if (keyEquals == null)
keyEquals = delegate(TKey x, TKey y) { return object.Equals(x, y); };
if (valueEquals == null)
valueEquals = delegate(TValue x, TValue y) { return object.Equals(x, y); };
// Check Count.
Assert.AreEqual(keys.Length, dict.Count);
// Check indexer, ContainsKey, Contains, TryGetValue for each key.
for (iKey = 0; iKey < keys.Length; ++iKey) {
Assert.IsTrue(dict.ContainsKey(keys[iKey]));
Assert.IsTrue(dict.Contains(new KeyValuePair<TKey, ICollection<TValue>>(keys[iKey], values[iKey])));
bool b = ((IDictionary<TKey,ICollection<TValue>>)dict).TryGetValue(keys[iKey], out getValues);
Assert.IsTrue(b);
iValue = 0;
foreach (TValue val in getValues) {
Assert.IsTrue(valueEquals(values[iKey][iValue], val));
++iValue;
}
iValue = 0;
foreach (TValue val in values[iKey]) {
Assert.IsTrue(dict.Contains(keys[iKey], val));
++iValue;
}
iValue = 0;
foreach (TValue val in dict[keys[iKey]]) {
Assert.IsTrue(valueEquals(values[iKey][iValue], val));
++iValue;
}
Assert.IsTrue(iValue == values[iKey].Length);
}
// Check Keys collection.
iKey = 0;
foreach (TKey key in dict.Keys) {
Assert.IsTrue(keyEquals(keys[iKey], key));
++iKey;
}
Assert.IsTrue(iKey == keys.Length);
InterfaceTests.TestReadonlyCollectionGeneric<TKey>(dict.Keys, keys, true, null, keyEquals);
// Check Values collection
iKey = 0; iValue = 0;
int valueCount = 0;
foreach (TValue val in dict.Values) {
Assert.IsTrue(valueEquals(values[iKey][iValue], val));
++iValue;
if (iValue == values[iKey].Length) {
iValue = 0;
++iKey;
}
++valueCount;
}
Assert.IsTrue(iKey == keys.Length);
int a = 0;
TValue[] vals = new TValue[valueCount];
for (iKey = 0; iKey < keys.Length; ++iKey) {
for (iValue = 0; iValue < values[iKey].Length; ++iValue) {
vals[a++] = values[iKey][iValue];
}
}
InterfaceTests.TestReadonlyCollectionGeneric<TValue>(dict.Values, vals, true, null, valueEquals);
// Check KeyValuePairs collection.
iKey = 0; iValue = 0;
valueCount = 0;
foreach (KeyValuePair<TKey, TValue> pair in dict.KeyValuePairs) {
Assert.IsTrue(keyEquals(keys[iKey], pair.Key));
Assert.IsTrue(valueEquals(values[iKey][iValue], pair.Value));
++iValue;
if (iValue == values[iKey].Length) {
iValue = 0;
++iKey;
}
++valueCount;
}
Assert.IsTrue(iKey == keys.Length);
a = 0;
KeyValuePair<TKey, TValue>[] pairs = new KeyValuePair<TKey, TValue>[valueCount];
for (iKey = 0; iKey < keys.Length; ++iKey) {
for (iValue = 0; iValue < values[iKey].Length; ++iValue) {
pairs[a++] = new KeyValuePair<TKey, TValue>(keys[iKey], values[iKey][iValue]);
}
}
InterfaceTests.TestReadonlyCollectionGeneric<KeyValuePair<TKey, TValue>>(dict.KeyValuePairs, pairs, true, null, InterfaceTests.KeyValueEquals<TKey,TValue>(keyEquals, valueEquals));
// Tests Contains, ContainsKey, TryGetValue for wrong values.
Assert.IsFalse(dict.ContainsKey(nonKey));
Assert.IsFalse(((IDictionary<TKey, ICollection<TValue>>)dict).TryGetValue(nonKey, out getValues));
for (iKey = 0; iKey < keys.Length; ++iKey) {
Assert.IsFalse(dict.Contains(keys[iKey], nonValue));
Assert.IsFalse(dict.Contains(new KeyValuePair<TKey, ICollection<TValue>>(keys[iKey], new TValue[1] { nonValue })));
}
// Test IDictionary<TKey,IEnumerable<TValue>> implementation
InterfaceTests.TestReadWriteMultiDictionaryGeneric<TKey, TValue>(dict, keys, values, nonKey, nonValue, true, "OrderedMultiDictionary", keyEquals, valueEquals);
}
// Do random add,remove,replaces and create an array.
private int[,] AddRemoveRandom(Random rand, OrderedMultiDictionary<int, string> dict, bool useDups, int iter)
{
const int MAXKEY = 100, MAXVAL = 50;
int[,] counts = new int[MAXKEY, MAXVAL];
for (int x = 0; x < iter; ++x) {
int key = rand.Next(MAXKEY);
int val = rand.Next(MAXVAL);
string valString = string.Format("A{0:0000}", val);
if (counts[key, val] == 0) {
if (rand.Next(30) == 0) {
// Do a replace
dict.Replace(key, valString);
for (int i = 0; i < MAXVAL; ++i)
counts[key, i] = 0;
counts[key, val] = 1;
}
else {
// Do an add
dict.Add(key, valString);
counts[key, val] = 1;
}
}
else {
if (rand.Next(30) == 0) {
// Do a replace
dict.Replace(key, valString);
for (int i = 0; i < MAXVAL; ++i)
counts[key, i] = 0;
counts[key, val] = 1;
}
else if (rand.Next(5) < 2) {
// Do an add
dict.Add(key, valString);
if (useDups)
counts[key, val] += 1;
}
else {
// Do a remove
dict.Remove(key, valString);
counts[key, val] -= 1;
}
}
}
return counts;
}
// Check an ordered multi-dictionary against an array.
private void CheckAgainstArray(OrderedMultiDictionary<int, string> dict, int[,] array)
{
List<string[]> values = new List<string[]>();
List<int> keys = new List<int>();
List<string> vals = new List<string>();
for (int i = 0; i < array.GetLength(0); ++i) {
bool hasval = false;
for (int j = 0; j < array.GetLength(1); ++j) {
if (array[i, j] > 0) {
hasval = true;
for (int x = 0; x < array[i, j]; ++x)
vals.Add(string.Format("A{0:0000}", j));
}
}
if (hasval) {
keys.Add(i);
values.Add(vals.ToArray());
vals.Clear();
}
}
int[] keysArray = keys.ToArray();
string[][] valsArray = values.ToArray();
CheckOrderedMultiDictionaryContents<int, string>(dict,
keysArray,
valsArray,
-1, "Foo", null, null);
}
[Test]
public void RandomAdd()
{
Random rand = new Random(14);
OrderedMultiDictionary<int,string> dict = new OrderedMultiDictionary<int,string>(true);
int[,] array = AddRemoveRandom(rand, dict, true, 3000);
CheckAgainstArray(dict, array);
}
[Test]
public void Add()
{
// Test without duplicate values.
OrderedMultiDictionary<string, double> dict1 = new OrderedMultiDictionary<string, double>(false);
dict1.Add("foo", 3.5);
dict1.Add("foo", -1.2);
dict1.Add(null, 11.1);
dict1.Add("foo", 8.8);
dict1.Add(null, 11.1);
dict1.Add("bar", 9.8);
dict1.Add("foo", 8.8);
dict1.Add("gib", 7.1);
dict1.Add("S", -9);
dict1.Add(null, 5.5);
CheckOrderedMultiDictionaryContents<string, double>(dict1,
new string[] { null, "bar", "foo", "gib", "S" },
new double[][] { new double[] { 5.5, 11.1 }, new double[] { 9.8 }, new double[] { -1.2, 3.5, 8.8 }, new double[] { 7.1 }, new double[] { -9 } },
"zip", -100, null, null);
// Test with duplicate values.
dict1 = new OrderedMultiDictionary<string, double>(true);
dict1.Add("foo", 3.5);
dict1.Add("foo", -1.2);
dict1.Add(null, 11.1);
dict1.Add("foo", 8.8);
dict1.Add(null, 11.1);
dict1.Add("bar", 9.8);
dict1.Add("foo", 8.8);
dict1.Add("gib", 7.1);
dict1.Add("S", -9);
dict1.Add(null, 5.5);
CheckOrderedMultiDictionaryContents<string, double>(dict1,
new string[] { null, "bar", "foo", "gib", "S" },
new double[][] { new double[] { 5.5, 11.1, 11.1 }, new double[] { 9.8 }, new double[] { -1.2, 3.5, 8.8, 8.8 }, new double[] { 7.1 }, new double[] { -9 } },
"zip", -100, null, null);
// Test duplicate values with distinct equal values.
OrderedMultiDictionary<string, string> dict2 = new OrderedMultiDictionary<string, string>(false, StringComparer.InvariantCultureIgnoreCase, StringComparer.InvariantCultureIgnoreCase);
dict2.Add("foo", "BAR");
dict2.Add("Foo", "bar");
InterfaceTests.TestEnumerableElements<string>(dict2.Keys, new string[] { "Foo" });
InterfaceTests.TestEnumerableElements<string>(dict2["FOO"], new string[] { "bar" });
dict2 = new OrderedMultiDictionary<string, string>(true, StringComparer.InvariantCultureIgnoreCase, StringComparer.InvariantCultureIgnoreCase);
dict2.Add("foo", "BAR");
dict2.Add("Foo", "bar");
InterfaceTests.TestEnumerableElements<string>(dict2.Keys, new string[] { "foo" });
InterfaceTests.TestEnumerableElements<string>(dict2["FOO"], new string[] { "BAR", "bar" });
Console.WriteLine(dict2.ToString());
InterfaceTests.TestEnumerableElements < KeyValuePair<string, string>>
(dict2.KeyValuePairs, new KeyValuePair<string, string>[] { new KeyValuePair<string,string>("foo", "BAR"),
new KeyValuePair<string,string>("Foo", "bar")}, InterfaceTests.KeyValueEquals<string,string>());
}
[Test]
public void AddMany1()
{
// Test without duplicate values.
OrderedMultiDictionary<string, double> dict1 = new OrderedMultiDictionary<string, double>(false, StringComparer.InvariantCultureIgnoreCase);
dict1.AddMany("foo", AlgorithmsTests.EnumerableFromArray(new double[] { 9.8, 1.2, -9, 9.8, -9, 4 }));
dict1.AddMany("hi", new double[0]);
dict1.AddMany("FOO", AlgorithmsTests.EnumerableFromArray(new double[] { 8, -9 }));
Assert.AreEqual(1, dict1.Count);
Assert.IsTrue(dict1.ContainsKey("foo"));
Assert.IsFalse(dict1.ContainsKey("hi"));
InterfaceTests.TestEnumerableElements(dict1.Keys, new string[] { "FOO" });
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -