Jo Shields 3c1f479b9d Imported Upstream version 4.0.0~alpha1
Former-commit-id: 806294f5ded97629b74c85c09952f2a74fe182d9
2015-04-07 09:35:12 +01:00

224 lines
5.9 KiB
C#

// KeyedCollectionTest.cs - NUnit Test Cases for System.Collections.ObjectModel.KeyedCollection
//
// Carlo Kok (ck@carlo-kok.com)
//
// (C) Carlo Kok
//
using NUnit.Framework;
using System;
using System.Globalization;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace MonoTests.System.Collections.ObjectModel
{
[TestFixture]
public class KeyedCollectionTest
{
private class CaseInsensitiveComparer : IEqualityComparer<string>
{
public CaseInsensitiveComparer () { }
#region IEqualityComparer<string> Members
public bool Equals (string x, string y)
{
return String.Compare (x, y, true,
CultureInfo.InvariantCulture) == 0;
}
public int GetHashCode (string obj)
{
return obj.ToUpper (CultureInfo.InvariantCulture).GetHashCode ();
}
#endregion
}
private class StrKeyCollection : KeyedCollection<string, string>
{
public StrKeyCollection (
IEqualityComparer<string> comparer,
int dictionaryCreationThreshold):
base (comparer, dictionaryCreationThreshold)
{
}
protected override string GetKeyForItem (string item)
{
return "Key:" + item;
}
public IDictionary<string, string> GetDictionary()
{
return Dictionary;
}
}
public KeyedCollectionTest ()
{
}
[Test]
public void TestDelete ()
{
StrKeyCollection collection =
new StrKeyCollection (EqualityComparer<string>.Default, 2);
collection.Add ("One"); // Key:First
collection.Add ("Two"); // Key:Two
Assert.IsTrue (collection.Remove ("Key:One"));
collection.Add ("Four"); // Key:Four
collection.Insert (2, "Three"); // Key:Three
Assert.IsTrue (collection.Remove ("Key:Three"));
Assert.IsFalse (collection.Remove ("Unknown"));
Assert.AreEqual (collection.GetDictionary ().Count, 2);
Assert.AreEqual (collection.Count, 2, "Collection count not equal to 2");
// check if all items are ordered correctly
Assert.AreEqual (collection [0], "Two");
Assert.AreEqual (collection [1], "Four");
Assert.AreEqual (collection ["Key:Two"], "Two");
Assert.AreEqual (collection ["Key:Four"], "Four");
try {
collection ["Key:One"].ToString();
Assert.Fail ("Unknown key should fail");
} catch (KeyNotFoundException e) {
e.ToString(); // avoid warning
// oke
}
try {
collection ["Key:One"].ToString();
Assert.Fail ("Unknown key should fail");
} catch (KeyNotFoundException e) {
e.ToString (); // avoid warning
// oke
}
}
[Test]
public void Insert_InvalidIndexDoesNotInsert ()
{
StrKeyCollection collection =
new StrKeyCollection(EqualityComparer<string>.Default, 0);
InsertInvalidIndex (collection, -1);
InsertInvalidIndex (collection, 1);
}
void InsertInvalidIndex (StrKeyCollection collection, int index)
{
try {
collection.Insert (index, "One");
Assert.Fail ("Invalid index should fail.");
}
catch (ArgumentOutOfRangeException) {
}
catch (Exception e) {
Assert.Fail ("Invalid exception type: expected ArgumentOutOfRangeException, got " + e.GetType ().Name);
}
IDictionary<string, string> dict = collection.GetDictionary ();
if (dict != null) {
Assert.AreEqual (0, dict.Count);
Assert.IsFalse (dict.ContainsKey ("Key:One"));
}
}
[Test]
public void Insert_DuplicateKey ()
{
StrKeyCollection collection =
new StrKeyCollection(EqualityComparer<string>.Default, 0);
collection.Add ("One");
try {
collection.Add ("One");
Assert.Fail ("Duplicate keys should throw ArgumentException.");
}
catch (ArgumentException) {
}
catch (Exception e) {
Assert.Fail ("Invalid exception type: expected ArgumentOutOfRangeException, got " + e.GetType ().Name);
}
Assert.AreEqual (1, collection.Count);
Assert.AreEqual (1, collection.GetDictionary ().Count);
}
[Test]
public void Insert_DuplicateKey_NoDictionary ()
{
StrKeyCollection collection =
new StrKeyCollection(EqualityComparer<string>.Default, 4);
collection.Add ("One");
try {
collection.Add ("One");
Assert.Fail ("Duplicate keys should throw ArgumentException.");
}
catch (ArgumentException) {
}
catch (Exception e) {
Assert.Fail ("Invalid exception type: expected ArgumentOutOfRangeException, got " + e.GetType ().Name);
}
Assert.AreEqual (1, collection.Count);
Assert.AreEqual (null, collection.GetDictionary ());
}
[Test]
public void TestInsert ()
{
StrKeyCollection collection =
new StrKeyCollection(EqualityComparer<string>.Default, 2);
Assert.IsNull (collection.GetDictionary (),
"Dictionary created too early"); // There can't be a dictionary yet
collection.Add ("One"); // Key:First
Assert.IsNull (collection.GetDictionary(),
"Dictionary created too early"); // There can't be a dictionary yet
collection.Add ("Two"); // Key:Two
Assert.IsNull (collection.GetDictionary (),
"Dictionary created too early"); // There can't be a dictionary yet
collection.Add ("Four"); // Key:Four
Assert.IsNotNull(collection.GetDictionary (),
"Dictionary created too late"); // There must be a dictionary
collection.Insert (2, "Three"); // Key:Three
Assert.AreEqual (collection.Count, 4,
"Collection count not equal to 4");
// check if all items are ordered correctly
Assert.AreEqual (collection [0], "One");
Assert.AreEqual (collection [1], "Two");
Assert.AreEqual (collection [2], "Three");
Assert.AreEqual (collection [3], "Four");
Assert.AreEqual (collection ["Key:One"], "One");
Assert.AreEqual (collection ["Key:Two"], "Two");
Assert.AreEqual (collection ["Key:Three"], "Three");
Assert.AreEqual (collection ["Key:Four"], "Four");
Assert.AreEqual (collection.GetDictionary ().Count, 4);
try {
collection ["UnkownKey"].ToString();
Assert.Fail ("Unknown key should fail");
} catch(KeyNotFoundException e) {
e.ToString(); // avoid warning
// oke
}
}
}
}