//----------------------------------------------------------------------- // // Copyright (c) Outercurve Foundation. All rights reserved. // //----------------------------------------------------------------------- namespace DotNetOpenAuth.Test.Messaging.Reflection { using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Xml; using DotNetOpenAuth.Messaging; using DotNetOpenAuth.Messaging.Reflection; using NUnit.Framework; [TestFixture] public class MessageDictionaryTests : MessagingTestBase { private Mocks.TestMessage message; [SetUp] public override void SetUp() { base.SetUp(); this.message = new Mocks.TestDirectedMessage(); } [Test, ExpectedException(typeof(ArgumentNullException))] public void CtorNull() { this.MessageDescriptions.GetAccessor(null); } /// /// A test for System.Collections.Generic.IDictionary<System.String,System.String>.Values /// [Test] public void Values() { IDictionary target = this.MessageDescriptions.GetAccessor(this.message); Collection expected = new Collection { this.message.Age.ToString(), XmlConvert.ToString(DateTime.SpecifyKind(this.message.Timestamp, DateTimeKind.Utc), XmlDateTimeSerializationMode.Utc), }; CollectionAssert.AreEquivalent(expected, target.Values); this.message.Age = 15; this.message.Location = new Uri("http://localtest"); this.message.Name = "Andrew"; target["extra"] = "a"; expected = new Collection { this.message.Age.ToString(), this.message.Location.AbsoluteUri, this.message.Name, XmlConvert.ToString(DateTime.SpecifyKind(this.message.Timestamp, DateTimeKind.Utc), XmlDateTimeSerializationMode.Utc), "a", }; CollectionAssert.AreEquivalent(expected, target.Values); } /// /// A test for System.Collections.Generic.IDictionary<System.String,System.String>.Keys /// [Test] public void Keys() { // We expect that non-nullable value type fields will automatically have keys // in the dictionary for them. IDictionary target = this.MessageDescriptions.GetAccessor(this.message); Collection expected = new Collection { "age", "Timestamp", }; CollectionAssert.AreEquivalent(expected, target.Keys); this.message.Name = "Andrew"; expected.Add("Name"); target["extraField"] = string.Empty; expected.Add("extraField"); CollectionAssert.AreEquivalent(expected, target.Keys); } /// /// A test for System.Collections.Generic.IDictionary<System.String,System.String>.Item /// [Test] public void Item() { IDictionary target = this.MessageDescriptions.GetAccessor(this.message); // Test setting of declared message properties. this.message.Age = 15; Assert.AreEqual("15", target["age"]); target["age"] = "13"; Assert.AreEqual(13, this.message.Age); // Test setting extra fields target["extra"] = "fun"; Assert.AreEqual("fun", target["extra"]); Assert.AreEqual("fun", ((IProtocolMessage)this.message).ExtraData["extra"]); // Test clearing extra fields target["extra"] = null; Assert.IsFalse(target.ContainsKey("extra")); } /// /// A test for System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<System.String,System.String<<.IsReadOnly /// [Test] public void IsReadOnly() { ICollection> target = this.MessageDescriptions.GetAccessor(this.message); Assert.IsFalse(target.IsReadOnly); } /// /// A test for System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<System.String,System.String<<.Count /// [Test] public void Count() { ICollection> target = this.MessageDescriptions.GetAccessor(this.message); IDictionary targetDictionary = (IDictionary)target; Assert.AreEqual(targetDictionary.Keys.Count, target.Count); targetDictionary["extraField"] = "hi"; Assert.AreEqual(targetDictionary.Keys.Count, target.Count); } /// /// A test for System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<System.String,System.String<<.GetEnumerator /// [Test] public void GetEnumerator() { IEnumerable> target = this.MessageDescriptions.GetAccessor(this.message); IDictionary targetDictionary = (IDictionary)target; var keys = targetDictionary.Keys.GetEnumerator(); var values = targetDictionary.Values.GetEnumerator(); IEnumerator> actual = target.GetEnumerator(); bool keysLast = true, valuesLast = true, actualLast = true; while (true) { keysLast = keys.MoveNext(); valuesLast = values.MoveNext(); actualLast = actual.MoveNext(); if (!keysLast || !valuesLast || !actualLast) { break; } Assert.AreEqual(keys.Current, actual.Current.Key); Assert.AreEqual(values.Current, actual.Current.Value); } Assert.IsTrue(keysLast == valuesLast && keysLast == actualLast); } [Test] public void GetEnumeratorUntyped() { IEnumerable target = this.MessageDescriptions.GetAccessor(this.message); IDictionary targetDictionary = (IDictionary)target; var keys = targetDictionary.Keys.GetEnumerator(); var values = targetDictionary.Values.GetEnumerator(); IEnumerator actual = target.GetEnumerator(); bool keysLast = true, valuesLast = true, actualLast = true; while (true) { keysLast = keys.MoveNext(); valuesLast = values.MoveNext(); actualLast = actual.MoveNext(); if (!keysLast || !valuesLast || !actualLast) { break; } KeyValuePair current = (KeyValuePair)actual.Current; Assert.AreEqual(keys.Current, current.Key); Assert.AreEqual(values.Current, current.Value); } Assert.IsTrue(keysLast == valuesLast && keysLast == actualLast); } /// /// A test for System.Collections.Generic.IDictionary<System.String,System.String>.TryGetValue /// [Test] public void TryGetValue() { IDictionary target = this.MessageDescriptions.GetAccessor(this.message); this.message.Name = "andrew"; string name; Assert.IsTrue(target.TryGetValue("Name", out name)); Assert.AreEqual(this.message.Name, name); Assert.IsFalse(target.TryGetValue("name", out name)); Assert.IsNull(name); target["extra"] = "value"; string extra; Assert.IsTrue(target.TryGetValue("extra", out extra)); Assert.AreEqual("value", extra); } /// /// A test for System.Collections.Generic.IDictionary<System.String,System.String>.Remove /// [Test] public void RemoveTest1() { IDictionary target = this.MessageDescriptions.GetAccessor(this.message); this.message.Name = "andrew"; Assert.IsTrue(target.Remove("Name")); Assert.IsNull(this.message.Name); Assert.IsFalse(target.Remove("Name")); Assert.IsFalse(target.Remove("extra")); target["extra"] = "value"; Assert.IsTrue(target.Remove("extra")); Assert.IsFalse(target.ContainsKey("extra")); } /// /// A test for System.Collections.Generic.IDictionary<System.String,System.String>.ContainsKey /// [Test] public void ContainsKey() { IDictionary target = this.MessageDescriptions.GetAccessor(this.message); Assert.IsTrue(target.ContainsKey("age"), "Value type declared element should have a key."); Assert.IsFalse(target.ContainsKey("Name"), "Null declared element should NOT have a key."); Assert.IsFalse(target.ContainsKey("extra")); target["extra"] = "value"; Assert.IsTrue(target.ContainsKey("extra")); } /// /// A test for System.Collections.Generic.IDictionary<System.String,System.String>.Add /// [Test] public void AddByKeyAndValue() { IDictionary target = this.MessageDescriptions.GetAccessor(this.message); target.Add("extra", "value"); Assert.IsTrue(target.Contains(new KeyValuePair("extra", "value"))); target.Add("Name", "Andrew"); Assert.AreEqual("Andrew", this.message.Name); } [Test, ExpectedException(typeof(ArgumentNullException))] public void AddNullValue() { IDictionary target = this.MessageDescriptions.GetAccessor(this.message); target.Add("extra", null); } /// /// A test for System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<System.String,System.String<<.Add /// [Test] public void AddByKeyValuePair() { IDictionary target = this.MessageDescriptions.GetAccessor(this.message); target.Add(new KeyValuePair("extra", "value")); Assert.IsTrue(target.Contains(new KeyValuePair("extra", "value"))); } [Test, ExpectedException(typeof(ArgumentException))] public void AddExtraFieldThatAlreadyExists() { IDictionary target = this.MessageDescriptions.GetAccessor(this.message); target.Add("extra", "value"); target.Add("extra", "value"); } [Test, ExpectedException(typeof(ArgumentException))] public void AddDeclaredValueThatAlreadyExists() { IDictionary target = this.MessageDescriptions.GetAccessor(this.message); target.Add("Name", "andrew"); target.Add("Name", "andrew"); } [Test] public void DefaultReferenceTypeDeclaredPropertyHasNoKey() { IDictionary target = this.MessageDescriptions.GetAccessor(this.message); Assert.IsFalse(target.ContainsKey("Name"), "A null value should result in no key."); Assert.IsFalse(target.Keys.Contains("Name"), "A null value should result in no key."); } [Test] public void RemoveStructDeclaredProperty() { IDictionary target = this.MessageDescriptions.GetAccessor(this.message); this.message.Age = 5; Assert.IsTrue(target.ContainsKey("age")); target.Remove("age"); Assert.IsTrue(target.ContainsKey("age")); Assert.AreEqual(0, this.message.Age); } /// /// A test for System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<System.String,System.String<<.Remove /// [Test] public void RemoveByKeyValuePair() { ICollection> target = this.MessageDescriptions.GetAccessor(this.message); this.message.Name = "Andrew"; Assert.IsFalse(target.Remove(new KeyValuePair("Name", "andrew"))); Assert.AreEqual("Andrew", this.message.Name); Assert.IsTrue(target.Remove(new KeyValuePair("Name", "Andrew"))); Assert.IsNull(this.message.Name); } /// /// A test for System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<System.String,System.String<<.CopyTo /// [Test] public void CopyTo() { ICollection> target = this.MessageDescriptions.GetAccessor(this.message); IDictionary targetAsDictionary = (IDictionary)target; KeyValuePair[] array = new KeyValuePair[target.Count + 1]; int arrayIndex = 1; target.CopyTo(array, arrayIndex); Assert.AreEqual(new KeyValuePair(), array[0]); for (int i = 1; i < array.Length; i++) { Assert.IsNotNull(array[i].Key); Assert.AreEqual(targetAsDictionary[array[i].Key], array[i].Value); } } /// /// A test for System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<System.String,System.String<<.Contains /// [Test] public void ContainsKeyValuePair() { ICollection> target = this.MessageDescriptions.GetAccessor(this.message); IDictionary targetAsDictionary = (IDictionary)target; Assert.IsFalse(target.Contains(new KeyValuePair("age", "1"))); Assert.IsTrue(target.Contains(new KeyValuePair("age", "0"))); targetAsDictionary["extra"] = "value"; Assert.IsFalse(target.Contains(new KeyValuePair("extra", "Value"))); Assert.IsTrue(target.Contains(new KeyValuePair("extra", "value"))); Assert.IsFalse(target.Contains(new KeyValuePair("wayoff", "value"))); } /// /// A test for System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<System.String,System.String<<.Clear /// [Test] public void ClearValues() { MessageDictionary target = this.MessageDescriptions.GetAccessor(this.message); IDictionary targetAsDictionary = (IDictionary)target; this.message.Name = "Andrew"; this.message.Age = 15; targetAsDictionary["extra"] = "value"; target.ClearValues(); Assert.AreEqual(2, target.Count, "Clearing should remove all keys except for declared non-nullable structs."); Assert.IsFalse(targetAsDictionary.ContainsKey("extra")); Assert.IsNull(this.message.Name); Assert.AreEqual(0, this.message.Age); } /// /// Verifies that the Clear method throws the expected exception. /// [Test, ExpectedException(typeof(NotSupportedException))] public void Clear() { MessageDictionary target = this.MessageDescriptions.GetAccessor(this.message); target.Clear(); } } }