summaryrefslogtreecommitdiffstats
path: root/src/DotNetOAuth.Test/Messaging/Reflection/MessagePartTests.cs
blob: 5c032e672706f7c55762e5faf7ca49a6e698cad9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using DotNetOAuth.Messaging.Reflection;
using System.Reflection;
using DotNetOAuth.Test.Mocks;

namespace DotNetOAuth.Test.Messaging.Reflection {
	[TestClass]
	public class MessagePartTests :MessagingTestBase {
		class MessageWithNonNullableOptionalStruct : TestMessage {
			/// <summary>
			/// Optional structs like int must be nullable for Optional to make sense.
			/// </summary>
			[MessagePart(IsRequired = false)]
			internal int optionalInt = 0;
		}
		class MessageWithNonNullableRequiredStruct : TestMessage {
			/// <summary>
			/// This should work because a required field will always have a value so it
			/// need not be nullable.
			/// </summary>
			[MessagePart(IsRequired = true)]
			internal int optionalInt = 0;
		}
		class MessageWithNullableOptionalStruct : TestMessage {
			/// <summary>
			/// Optional structs like int must be nullable for Optional to make sense.
			/// </summary>
			[MessagePart(IsRequired = false)]
			internal int? optionalInt = 0;
		}

		[TestMethod, ExpectedException(typeof(ArgumentException))]
		public void OptionalNonNullableStruct() {
			ParameterizedMessageTypeTest(typeof(MessageWithNonNullableOptionalStruct));
		}

		[TestMethod]
		public void RequiredNonNullableStruct() {
			ParameterizedMessageTypeTest(typeof(MessageWithNonNullableRequiredStruct));
		}

		[TestMethod]
		public void OptionalNullableStruct() {
			ParameterizedMessageTypeTest(typeof(MessageWithNullableOptionalStruct));
		}

		[TestMethod, ExpectedException(typeof(ArgumentNullException))]
		public void CtorNullMember() {
			new MessagePart(null, new MessagePartAttribute());
		}

		[TestMethod, ExpectedException(typeof(ArgumentNullException))]
		public void CtorNullAttribute() {
			FieldInfo field = typeof(MessageWithNullableOptionalStruct).GetField("optionalInt", BindingFlags.NonPublic | BindingFlags.Instance);
			new MessagePart(field, null);
		}

		[TestMethod]
		public void SetValue() {
			var message = new MessageWithNonNullableRequiredStruct();
			MessagePart part = ParameterizedMessageTypeTest(message.GetType());
			part.SetValue(message, "5");
			Assert.AreEqual(5, message.optionalInt);
		}

		[TestMethod]
		public void GetValue() {
			var message = new MessageWithNonNullableRequiredStruct();
			message.optionalInt = 8;
			MessagePart part = ParameterizedMessageTypeTest(message.GetType());
			Assert.AreEqual("8", part.GetValue(message));
		}

		[TestMethod, ExpectedException(typeof(ArgumentException))]
		public void NonFieldOrPropertyMember() {
			MemberInfo method = typeof(MessageWithNullableOptionalStruct).GetMethod("Equals", BindingFlags.Public | BindingFlags.Instance);
			new MessagePart(method, new MessagePartAttribute());
		}

		private MessagePart ParameterizedMessageTypeTest(Type messageType) {
			FieldInfo field = messageType.GetField("optionalInt", BindingFlags.NonPublic | BindingFlags.Instance);
			MessagePartAttribute attribute = field.GetCustomAttributes(typeof(MessagePartAttribute), true).OfType<MessagePartAttribute>().Single();
			return new MessagePart(field, attribute);
		}
	}
}