/* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ using System; using System.Collections.Generic; using NUnit.Framework; namespace Lucene.Net.Support { [TestFixture] public class TestWeakDictionaryBehavior { IDictionary dictionary; public static IDictionary CreateDictionary() { return new WeakDictionary(); } private void CallGC() { for (int i = 0; i < 10; i++) { GC.Collect(); GC.WaitForPendingFinalizers(); } } [SetUp] public void Setup() { dictionary = CreateDictionary(); } [Test] public void Test_Dictionary_Add() { string key = "A"; dictionary.Add(key, "value"); Assert.IsTrue(dictionary.ContainsKey(key)); Assert.AreEqual("value", dictionary[key]); Assert.AreEqual(1, dictionary.Count); CollectionAssert.AreEquivalent(dictionary.Values, new object[] { "value" }); } [Test] public void Test_Dictionary_Add_2() { string key = "A"; string key2 = "B"; dictionary.Add(key, "value"); dictionary.Add(key2, "value2"); Assert.IsTrue(dictionary.ContainsKey(key)); Assert.IsTrue(dictionary.ContainsKey(key2)); Assert.AreEqual("value", dictionary[key]); Assert.AreEqual("value2", dictionary[key2]); Assert.AreEqual(2, dictionary.Count); CollectionAssert.AreEquivalent(dictionary.Values, new object[] { "value", "value2" }); } [Test] public void Test_Keys() { string key = "A"; string key2 = "B"; dictionary.Add(key, "value"); CollectionAssert.AreEquivalent(dictionary.Keys, new object[] { key }); dictionary.Add(key2, "value2"); CollectionAssert.AreEquivalent(dictionary.Keys, new object[] { key, key2 }); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void Test_Dictionary_Add_Null() { dictionary.Add(null, "value"); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void Test_Dictionary_Set_Null() { dictionary[null] = "value"; } [Test] public void Test_Dictionary_AddReplace() { string key = "A"; string key2 = "a".ToUpper(); dictionary.Add(key, "value"); dictionary[key2] = "value2"; Assert.AreEqual(1, dictionary.Count); Assert.IsTrue(dictionary.ContainsKey(key)); Assert.AreEqual("value2", dictionary[key]); } [Test] public void Test_Dictionary_AddRemove() { string key = "A"; dictionary.Add(key, "value"); dictionary.Remove(key); Assert.AreEqual(0, dictionary.Count); Assert.IsFalse(dictionary.ContainsKey(key)); Assert.IsNull(dictionary[key]); } [Test] public void Test_Dictionary_Clear() { string key = "A"; dictionary.Add(key, "value"); dictionary.Clear(); Assert.AreEqual(0, dictionary.Count); Assert.IsFalse(dictionary.ContainsKey(key)); Assert.IsNull(dictionary[key]); } [Test] public void Test_Dictionary_AddRemove_2() { string key = "A"; dictionary.Add(key, "value"); dictionary.Remove(key); dictionary.Remove(key); Assert.AreEqual(0, dictionary.Count); Assert.IsFalse(dictionary.ContainsKey(key)); Assert.IsNull(dictionary[key]); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void Test_Dictionary_Get_Null() { object value = dictionary[null]; } [Test] [ExpectedException(typeof(ArgumentNullException))] public void Test_Dictionary_Remove_Null() { dictionary.Remove(null); } [Test] public void Test_Dictionary_GetEnumerator() { string key = "A"; dictionary.Add(key, "value"); var de = dictionary.GetEnumerator(); Assert.IsTrue(de.MoveNext()); Assert.AreEqual(key, de.Current.Key); Assert.AreEqual("value", de.Current.Value); } [Test] public void Test_Dictionary_ForEach() { string key = "A"; dictionary.Add(key, "value"); foreach (var de in dictionary) { Assert.AreEqual(key, de.Key); Assert.AreEqual("value", de.Value); } } [Test] public void Test_Collisions() { //Create 2 keys with same hashcode but that are not equal CollisionTester key1 = new CollisionTester(1, 100); CollisionTester key2 = new CollisionTester(2, 100); dictionary.Add(key1, "value1"); dictionary.Add(key2, "value2"); Assert.AreEqual("value1", dictionary[key1]); Assert.AreEqual("value2", dictionary[key2]); dictionary.Remove(key1); Assert.AreEqual(null, dictionary[key1]); } [Test] public void Test_Weak_1() { BigObject key = new BigObject(1); BigObject key2 = new BigObject(2); dictionary.Add(key, "value"); Assert.AreEqual("value", dictionary[key]); key = null; CallGC(); dictionary.Add(key2, "value2"); Assert.AreEqual(1, dictionary.Count); } [Test] public void Test_Weak_2() { BigObject key = new BigObject(1); BigObject key2 = new BigObject(2); BigObject key3 = new BigObject(3); dictionary.Add(key, "value"); dictionary.Add(key2, "value2"); Assert.AreEqual("value", dictionary[key]); key = null; CallGC(); dictionary.Add(key3, "value3"); Assert.AreEqual(2, dictionary.Count); Assert.IsNotNull(key2); } [Test] public void Test_Weak_ForEach() { BigObject[] keys1 = new BigObject[20]; BigObject[] keys2 = new BigObject[20]; for (int i = 0; i < keys1.Length; i++) { keys1[i] = new BigObject(i); dictionary.Add(keys1[i], "value"); } for (int i = 0; i < keys2.Length; i++) { keys2[i] = new BigObject(i); dictionary.Add(keys2[i], "value"); } Assert.AreEqual(40, dictionary.Count); keys2 = null; int count = 0; foreach (var de in dictionary) { CallGC(); count++; } Assert.LessOrEqual(20, count); Assert.Greater(40, count); Assert.IsNotNull(keys1); } } }