// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. using System.Collections; using System.Collections.Generic; using Moq; using Xunit; namespace System.Web.Mvc.Test { public class TempDataDictionaryTest { [Fact] public void CompareIsOrdinalIgnoreCase() { // Arrange TempDataDictionary tempData = new TempDataDictionary(); object item = new object(); // Act tempData["Foo"] = item; object value = tempData["FOO"]; // Assert Assert.Same(item, value); } [Fact] public void EnumeratingDictionaryMarksValuesForDeletion() { // Arrange NullTempDataProvider provider = new NullTempDataProvider(); TempDataDictionary tempData = new TempDataDictionary(); Mock controllerContext = new Mock(); tempData["Foo"] = "Foo"; tempData["Bar"] = "Bar"; // Act IEnumerator> enumerator = tempData.GetEnumerator(); while (enumerator.MoveNext()) { object value = enumerator.Current; } tempData.Save(controllerContext.Object, provider); // Assert Assert.False(tempData.ContainsKey("Foo")); Assert.False(tempData.ContainsKey("Bar")); } [Fact] public void EnumeratingTempDataAsIEnmerableMarksValuesForDeletion() { // Arrange NullTempDataProvider provider = new NullTempDataProvider(); TempDataDictionary tempData = new TempDataDictionary(); Mock controllerContext = new Mock(); tempData["Foo"] = "Foo"; tempData["Bar"] = "Bar"; // Act IEnumerator enumerator = ((IEnumerable)tempData).GetEnumerator(); while (enumerator.MoveNext()) { object value = enumerator.Current; } tempData.Save(controllerContext.Object, provider); // Assert Assert.False(tempData.ContainsKey("Foo")); Assert.False(tempData.ContainsKey("Bar")); } [Fact] public void KeepRetainsAllKeysWhenSavingDictionary() { // Arrange NullTempDataProvider provider = new NullTempDataProvider(); TempDataDictionary tempData = new TempDataDictionary(); Mock controllerContext = new Mock(); controllerContext.Setup(c => c.HttpContext.Request).Returns(new Mock().Object); tempData["Foo"] = "Foo"; tempData["Bar"] = "Bar"; // Act tempData.Keep(); tempData.Save(controllerContext.Object, provider); // Assert Assert.True(tempData.ContainsKey("Foo")); Assert.True(tempData.ContainsKey("Bar")); } [Fact] public void KeepRetainsSpecificKeysWhenSavingDictionary() { // Arrange NullTempDataProvider provider = new NullTempDataProvider(); TempDataDictionary tempData = new TempDataDictionary(); Mock controllerContext = new Mock(); controllerContext.Setup(c => c.HttpContext.Request).Returns(new Mock().Object); tempData["Foo"] = "Foo"; tempData["Bar"] = "Bar"; // Act tempData.Keep("Foo"); object value = tempData["Bar"]; tempData.Save(controllerContext.Object, provider); // Assert Assert.True(tempData.ContainsKey("Foo")); Assert.False(tempData.ContainsKey("Bar")); } [Fact] public void LoadAndSaveAreCaseInsensitive() { // Arrange Dictionary data = new Dictionary(); data["Foo"] = "Foo"; data["Bar"] = "Bar"; TestTempDataProvider provider = new TestTempDataProvider(data); Mock controllerContext = new Mock(); TempDataDictionary tempData = new TempDataDictionary(); // Act tempData.Load(controllerContext.Object, provider); object value = tempData["FOO"]; tempData.Save(controllerContext.Object, provider); // Assert Assert.False(tempData.ContainsKey("foo")); Assert.True(tempData.ContainsKey("bar")); } [Fact] public void PeekDoesNotMarkKeyAsRead() { // Arrange NullTempDataProvider provider = new NullTempDataProvider(); TempDataDictionary tempData = new TempDataDictionary(); Mock controllerContext = new Mock(); tempData["Bar"] = "barValue"; // Act object value = tempData.Peek("bar"); tempData.Save(controllerContext.Object, provider); // Assert Assert.Equal("barValue", value); Assert.True(tempData.ContainsKey("Bar")); } [Fact] public void RemovalOfKeysAreCaseInsensitive() { NullTempDataProvider provider = new NullTempDataProvider(); TempDataDictionary tempData = new TempDataDictionary(); Mock controllerContext = new Mock(); object fooValue; tempData["Foo"] = "Foo"; tempData["Bar"] = "Bar"; // Act tempData.TryGetValue("foo", out fooValue); object barValue = tempData["bar"]; tempData.Save(controllerContext.Object, provider); // Assert Assert.False(tempData.ContainsKey("Foo")); Assert.False(tempData.ContainsKey("Boo")); } [Fact] public void SaveRetainsAllKeys() { // Arrange NullTempDataProvider provider = new NullTempDataProvider(); TempDataDictionary tempData = new TempDataDictionary(); Mock controllerContext = new Mock(); tempData["Foo"] = "Foo"; tempData["Bar"] = "Bar"; // Act tempData.Save(controllerContext.Object, provider); // Assert Assert.True(tempData.ContainsKey("Foo")); Assert.True(tempData.ContainsKey("Bar")); } [Fact] public void SaveRemovesKeysThatWereRead() { // Arrange NullTempDataProvider provider = new NullTempDataProvider(); TempDataDictionary tempData = new TempDataDictionary(); Mock controllerContext = new Mock(); tempData["Foo"] = "Foo"; tempData["Bar"] = "Bar"; // Act object value = tempData["Foo"]; tempData.Save(controllerContext.Object, provider); // Assert Assert.False(tempData.ContainsKey("Foo")); Assert.True(tempData.ContainsKey("Bar")); } [Fact] public void TempDataIsADictionary() { // Arrange TempDataDictionary tempData = new TempDataDictionary(); // Act tempData["Key1"] = "Value1"; tempData.Add("Key2", "Value2"); ((ICollection>)tempData).Add(new KeyValuePair("Key3", "Value3")); // Assert (IDictionary) Assert.Equal(3, tempData.Count); Assert.True(tempData.Remove("Key1")); Assert.False(tempData.Remove("Key4")); Assert.True(tempData.ContainsValue("Value2")); Assert.False(tempData.ContainsValue("Value1")); Assert.Null(tempData["Key6"]); IEnumerator tempDataEnumerator = tempData.GetEnumerator(); tempDataEnumerator.Reset(); while (tempDataEnumerator.MoveNext()) { KeyValuePair pair = (KeyValuePair)tempDataEnumerator.Current; Assert.True(((ICollection>)tempData).Contains(pair)); } // Assert (ICollection) foreach (string key in tempData.Keys) { Assert.True(((ICollection>)tempData).Contains(new KeyValuePair(key, tempData[key]))); } foreach (string value in tempData.Values) { Assert.True(tempData.ContainsValue(value)); } foreach (string key in ((IDictionary)tempData).Keys) { Assert.True(tempData.ContainsKey(key)); } foreach (string value in ((IDictionary)tempData).Values) { Assert.True(tempData.ContainsValue(value)); } KeyValuePair[] keyValuePairArray = new KeyValuePair[tempData.Count]; ((ICollection>)tempData).CopyTo(keyValuePairArray, 0); Assert.False(((ICollection>)tempData).IsReadOnly); Assert.False(((ICollection>)tempData).Remove(new KeyValuePair("Key5", "Value5"))); IEnumerator> keyValuePairEnumerator = ((ICollection>)tempData).GetEnumerator(); keyValuePairEnumerator.Reset(); while (keyValuePairEnumerator.MoveNext()) { KeyValuePair pair = keyValuePairEnumerator.Current; Assert.True(((ICollection>)tempData).Contains(pair)); } // Act tempData.Clear(); // Assert Assert.Empty(tempData); } [Fact] public void TempDataDictionaryCreatesEmptyDictionaryIfProviderReturnsNull() { // Arrange TempDataDictionary tempDataDictionary = new TempDataDictionary(); NullTempDataProvider provider = new NullTempDataProvider(); // Act tempDataDictionary.Load(null /* controllerContext */, provider); // Assert Assert.Empty(tempDataDictionary); } [Fact] public void TryGetValueMarksKeyForDeletion() { NullTempDataProvider provider = new NullTempDataProvider(); TempDataDictionary tempData = new TempDataDictionary(); Mock controllerContext = new Mock(); object value; tempData["Foo"] = "Foo"; // Act tempData.TryGetValue("Foo", out value); tempData.Save(controllerContext.Object, provider); // Assert Assert.False(tempData.ContainsKey("Foo")); } internal class NullTempDataProvider : ITempDataProvider { public void SaveTempData(ControllerContext controllerContext, IDictionary values) { } public IDictionary LoadTempData(ControllerContext controllerContext) { return null; } } internal class TestTempDataProvider : ITempDataProvider { private IDictionary _data; public TestTempDataProvider(IDictionary data) { _data = data; } public void SaveTempData(ControllerContext controllerContext, IDictionary values) { } public IDictionary LoadTempData(ControllerContext controllerContext) { return _data; } } } }