//-----------------------------------------------------------------------
//
// 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();
}
}
}