forked from ServiceStack/ServiceStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathReflectionExtensionsTests.cs
More file actions
145 lines (119 loc) · 4.53 KB
/
ReflectionExtensionsTests.cs
File metadata and controls
145 lines (119 loc) · 4.53 KB
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
using System;
using System.Collections.Generic;
using NUnit.Framework;
using ServiceStack.Text;
namespace ServiceStack.Common.Tests
{
public enum UserFileType
{
DefaultProfile,
OriginalProfile,
Profile75X75,
Profile66X66,
Profile63X63,
}
public class TestClassA
{
public IList<string> ToStringList { get; set; }
public ArrayOfString FromStringList { get; set; }
public IList<UserFileType> FromUserFileTypes { get; set; }
}
public class TestClassB
{
public ArrayOfString ToStringList { get; set; }
public IList<string> FromStringList { get; set; }
public ArrayOfString FromUserFileTypes { get; set; }
}
public class TestClassC
{
public IList<string> FromStringList { get; protected set; }
}
[TestFixture]
public class ReflectionExtensionsTests
{
[Test]
public void Can_translate_generic_lists()
{
var values = new[] { "A", "B", "C" };
var testA = new TestClassA
{
FromStringList = new ArrayOfString(values),
ToStringList = new List<string>(values),
FromUserFileTypes = new List<UserFileType>
{
UserFileType.DefaultProfile, UserFileType.OriginalProfile
},
};
var fromTestA = testA.ConvertTo<TestClassB>();
AssertAreEqual(testA, fromTestA);
var userFileTypeValues = testA.FromUserFileTypes.Map(x => x.ToString());
var testB = new TestClassB
{
FromStringList = new List<string>(values),
ToStringList = new ArrayOfString(values),
FromUserFileTypes = new ArrayOfString(userFileTypeValues),
};
var fromTestB = testB.ConvertTo<TestClassA>();
AssertAreEqual(fromTestB, testB);
}
[Test]
public void Can_translate_generic_list_does_ignore_protected_setters()
{
var values = new[] { "A", "B", "C" };
var testA = new TestClassA
{
ToStringList = new List<string>(values),
};
var fromTestA = testA.ConvertTo<TestClassC>();
Assert.NotNull(fromTestA);
Assert.IsNull(fromTestA.FromStringList);
}
private static void AssertAreEqual(TestClassA testA, TestClassB testB)
{
Assert.That(testA, Is.Not.Null);
Assert.That(testB, Is.Not.Null);
Assert.That(testA.FromStringList, Is.Not.Null);
Assert.That(testB.FromStringList, Is.Not.Null);
Assert.That(testA.FromStringList,
Is.EquivalentTo(new List<string>(testB.FromStringList)));
Assert.That(testA.ToStringList, Is.Not.Null);
Assert.That(testB.ToStringList, Is.Not.Null);
Assert.That(testA.ToStringList, Is.EquivalentTo(testB.ToStringList));
Assert.That(testA.FromUserFileTypes, Is.Not.Null);
Assert.That(testB.FromUserFileTypes, Is.Not.Null);
Assert.That(testA.FromUserFileTypes,
Is.EquivalentTo(testB.FromUserFileTypes.ConvertAll(x => x.ToEnum<UserFileType>())));
}
#if !NETCORE
[Test]
public void Can_cache_a_geneneric_tuple_activator()
{
var genericArgs = new[]
{
typeof(TestClassA),
typeof(TestClassB),
typeof(TestClassC),
};
Type genericType = typeof(Tuple<,,>).GetCachedGenericType(genericArgs);
var ci = genericType.GetConstructor(genericArgs);
var activator = ci.GetActivator();
var tuple = (Tuple<TestClassA, TestClassB, TestClassC>)
activator(new TestClassA(), new TestClassB(), new TestClassC());
tuple = (Tuple<TestClassA, TestClassB, TestClassC>)
activator(new TestClassA(), new TestClassB(), new TestClassC());
Assert.That(tuple.Item1, Is.Not.Null);
Assert.That(tuple.Item2, Is.Not.Null);
Assert.That(tuple.Item3, Is.Not.Null);
}
[Test]
public void Can_cache_generic_list_activator()
{
Type genericType = typeof(List<>).GetCachedGenericType(typeof(TestClassA));
var ci = genericType.GetConstructor(Type.EmptyTypes);
var activator = ci.GetActivator();
var list = (List<TestClassA>)activator();
Assert.That(list, Is.Not.Null);
}
#endif
}
}