public void HashtableRemoveItem() { var filler = GetFiller(); var tiller = GetTiller(); var stub = new HashtableStub(); foreach (var kvp in filler) { KeyValuePair <int, string>?newItem = kvp; KeyValuePair <int, string>?replacedItem; Assert.IsFalse(stub.InsertItem(ref newItem, out replacedItem), "All unique item inserts, expected false returned by GetOldestItem"); Assert.AreEqual(kvp, replacedItem.Value, "Expected oldest item to be equal to inserted item."); } foreach (var kvp in tiller) { if (!filler.ContainsKey(kvp.Key)) { int key = kvp.Key; KeyValuePair <int, string>?removedItem; Assert.IsFalse(stub.RemoveItem(ref key, out removedItem), "Removing not inserted item, expected false returned by RemoveItem"); } } Assert.AreEqual(filler.Count, stub.Count, "Expected _Count to be same as number of unique inserts."); GC.Collect(); Thread.Sleep(1000); // 1 sec Assert.AreEqual(filler.Count, stub.Count, "Expected _Count to be same as number of unique inserts, even after GC."); foreach (var kvp in tiller) { if (!filler.ContainsKey(kvp.Key)) { int key = kvp.Key; KeyValuePair <int, string>?removedItem; Assert.IsFalse(stub.RemoveItem(ref key, out removedItem), "Removing not inserted item, expected false returned by RemoveItem, even after GC."); } } foreach (var kvp in filler) { int key = kvp.Key; KeyValuePair <int, string>?removedItem; Assert.IsTrue(stub.RemoveItem(ref key, out removedItem), "Inserted items, expected true returned by RemoveItem"); Assert.AreEqual(kvp, removedItem.Value, "Expected removed item to be equal to inserted item."); } Assert.AreEqual(0, stub.Count, "Expected _Count to be 0 after all inserted items removed, even after GC."); //removing by multiple threads. foreach (var kvp in filler) { KeyValuePair <int, string>?newItem = kvp; KeyValuePair <int, string>?replacedItem; Assert.IsFalse(stub.InsertItem(ref newItem, out replacedItem), "All unique item inserts, expected false returned by GetOldestItem"); Assert.AreEqual(kvp, replacedItem.Value, "Expected oldest item to be equal to inserted item."); } stub = new HashtableStub(); int runningThreads = 10; for (int i = 0; i < 10; ++i) { System.Threading.ThreadPool.QueueUserWorkItem( new WaitCallback( delegate(object tgt) { int j = 0; foreach (var kvp in filler) { int key = kvp.Key; KeyValuePair <int, string>?newItem = kvp; KeyValuePair <int, string>?replacedItem; stub.FindItem(ref key, out replacedItem); if (i % 2 == 0) { stub.InsertItem(ref newItem, out replacedItem); } else { stub.RemoveItem(ref key, out replacedItem); } stub.FindItem(ref key, out replacedItem); if (j == i) { j = 0; Thread.Sleep(0); } else { ++j; } } Interlocked.Decrement(ref runningThreads); } ) ); } { int wait = 200; do { Thread.Sleep(100); }while (Interlocked.Decrement(ref wait) > 0 && runningThreads != 0); } Assert.AreEqual(0, runningThreads, "Expected all threads to be finished by now."); }
public void HashtableFindItem() { var filler = GetFiller(); var tiller = GetTiller(); var stub = new HashtableStub(); foreach (var kvp in filler) { KeyValuePair <int, string>?newItem = kvp; KeyValuePair <int, string>?replacedItem; Assert.IsFalse(stub.InsertItem(ref newItem, out replacedItem), "All unique item inserts, expected false returned by InsertItem"); } Assert.AreEqual(filler.Count, stub.Count, "Expected _Count to be same as number of unique inserts."); foreach (var kvp in filler) { int key = kvp.Key; KeyValuePair <int, string>?foundItem; Assert.IsTrue(stub.FindItem(ref key, out foundItem), "Expected return true on find on inserted key"); Assert.AreEqual(kvp, foundItem.Value, "Expected found item to be same as inserted item."); } foreach (var kvp in tiller) { if (!filler.ContainsKey(kvp.Key)) { int key = kvp.Key; KeyValuePair <int, string>?foundItem; Assert.IsFalse(stub.FindItem(ref key, out foundItem), "Expected return false on find on NOT inserted key"); } } GC.Collect(); Thread.Sleep(1000); // 1 sec Assert.AreEqual(filler.Count, stub.Count, "Expected _Count to be same as number of unique inserts, even after GC."); foreach (var kvp in filler) { int key = kvp.Key; KeyValuePair <int, string>?foundItem; Assert.IsTrue(stub.FindItem(ref key, out foundItem), "Expected return true on find on inserted key, even after GC."); Assert.AreEqual(kvp, foundItem.Value, "Expected found item to be same as inserted item, even after GC."); } foreach (var kvp in tiller) { if (!filler.ContainsKey(kvp.Key)) { int key = kvp.Key; KeyValuePair <int, string>?foundItem; Assert.IsFalse(stub.FindItem(ref key, out foundItem), "Expected return false on find on NOT inserted key, even after GC."); } } //finding int multiple threads. filler = GetFiller(); int runningThreads = 10; for (int i = 0; i < 10; ++i) { System.Threading.ThreadPool.QueueUserWorkItem( new WaitCallback( delegate(object tgt) { int j = 0; var set = i % 2 == 0 ? filler : tiller; foreach (var kvp in set) { int key = kvp.Key; KeyValuePair <int, string>?foundItem; Assert.IsTrue((set == filler) == stub.FindItem(ref key, out foundItem), "Expected return true on find on inserted key, even after GC and on multiple threads."); if (j == i) { j = 0; Thread.Sleep(0); } else { ++j; } } Interlocked.Decrement(ref runningThreads); } ) ); } { int wait = 200; do { Thread.Sleep(100); }while (Interlocked.Decrement(ref wait) > 0 && runningThreads != 0); } Assert.AreEqual(0, runningThreads, "Expected all threads to be finished by now."); }