annotate UnitTests/CS/Patterns/DuckTypingTest.cs @ 6:11b6da379593

Исправлена странная ошибка при использовании OfType<...>().Where(...)
author cin
date Mon, 05 Dec 2016 05:50:52 +0300
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using NUnit.Framework;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using BLToolkit.Patterns;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 namespace Patterns
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 [TestFixture]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 public class DuckTypingTest
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 public interface TestInterface
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 int Method(int value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 void Method(int v1, out int v2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 int Prop { get; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 event EventHandler Event;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 void CallEvent();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 public interface TestInterface2
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 int Method(int value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 void I2Method(int v1, out int v2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 public class TestClass
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 public static int Field;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 public int Method(int value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 return value + 2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 public void Method(int v1, out int v2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 v2 = v1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 public void I2Method(int v1, out int v2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 v2 = v1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 public int Prop
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 get { return 22; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 public event EventHandler Event;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 public void CallEvent()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 Event(this, EventArgs.Empty);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 public void Test()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 var duck = DuckTyping.Implement<TestInterface> (new TestClass());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 var same = DuckTyping.Implement<TestInterface> (duck);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 var duck2 = DuckTyping.Implement<TestInterface2>(same);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 Assert.AreSame(duck, same);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 int value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 duck.Method(33, out value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 Assert.AreEqual(33, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 Assert.AreEqual(42, duck.Method(40));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 Assert.AreEqual(22, duck.Prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 duck.Event += duck_Event;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 duck.CallEvent();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 Assert.AreEqual(55, eventValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 duck2.I2Method(33, out value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 Assert.AreEqual(33, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 Assert.AreEqual(42, duck2.Method(40));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 int eventValue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 void duck_Event(object sender, EventArgs e)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 eventValue = 55;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 public class Child1 : TestClass
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 public new int Method(int value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 return value + 5;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 public class Child2 : TestClass
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 public new int Method(int value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 return value + 10;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 public void BulkTest()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 var ducks = DuckTyping.Implement<TestInterface,TestClass>(new Child1(), new Child2());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 Assert.IsNotEmpty(ducks);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 Assert.AreEqual(42, ducks[0].Method(40));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 Assert.AreEqual(42, ducks[1].Method(40));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 public void BulkTest2()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 var ducks = DuckTyping.Implement<TestInterface>(new Child1(), new Child2());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 Assert.IsNotEmpty(ducks);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 Assert.AreEqual(45, ducks[0].Method(40));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 Assert.AreEqual(50, ducks[1].Method(40));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 public void InheritanceTest()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 var duck1 = DuckTyping.Implement<TestInterface>(new Child1());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 var duck2 = DuckTyping.Implement<TestInterface>(new Child2());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 Assert.AreNotSame(duck1, duck2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 Assert.AreEqual(45, duck1.Method(40));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 Assert.AreEqual(50, duck2.Method(40));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 public void InheritanceTest2()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 var duck1 = DuckTyping.Implement<TestInterface,TestClass>(new Child1());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 var duck2 = DuckTyping.Implement<TestInterface,TestClass>(new Child2());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 Assert.AreNotSame(duck1, duck2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 Assert.AreEqual(42, duck1.Method(40));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 Assert.AreEqual(42, duck2.Method(40));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 public class StaticClass
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 public static int Method(int value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 return value + 3;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 public void StaticTest()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 DuckTyping.AllowStaticMembers = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 var duck = DuckTyping.Implement<TestInterface,StaticClass>(new StaticClass());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 Assert.AreEqual(43, duck.Method(40));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 public struct TestStruct
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 public int Method(int value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 return value + 3;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 public void StructTest()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 DuckTyping.AllowStaticMembers = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 var duck = DuckTyping.Implement<TestInterface>(new TestStruct());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 Assert.AreEqual(43, duck.Method(40));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 public interface GenericInterface<T>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 T Method(T value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 public class GenericClass<T>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 public T Method(T value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 public void I2Method(int v1, out int v2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 v2 = v1 + 2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 public void GenericInterfaceTest()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 var o = new GenericClass<int>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 var duck = DuckTyping.Implement<GenericInterface<int>>(o);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 var duck2 = DuckTyping.Implement<TestInterface2> (o);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 Assert.AreEqual(40, duck .Method(40));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 Assert.AreEqual(40, duck2.Method(40));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 int value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 duck2.I2Method (33, out value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 Assert.AreEqual(35, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 [Test, ExpectedException(typeof(ArgumentNullException))]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 public void InvalidArgTest1()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 TestInterface o = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 var duck1 = DuckTyping.Implement<TestInterface>(o);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 var duck2 = (TestInterface)DuckTyping.Implement(typeof(TestInterface), o);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 interface NonPublicInterface
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 [Test, ExpectedException(typeof(ArgumentException))]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 public void InvalidArgTest2()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 var duck = (NonPublicInterface)DuckTyping.Implement(typeof(NonPublicInterface), new TestClass());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 [Test, ExpectedException(typeof(ArgumentException))]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 public void InvalidArgTest3()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 var duck = (Child1)DuckTyping.Implement(typeof(Child1), new Child2());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 [Test, ExpectedException(typeof(ArgumentException))]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 public void InvalidArgTest4()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 var duck = (TestInterface)DuckTyping.Implement(typeof(TestInterface), typeof(TestInterface), new TestClass());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 #region Aggregate
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 public interface IAggregatable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 int Method1();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 int Method2();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 public interface IClass1
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 int Method1();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 int Method3();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 public interface IClass2
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 int Method2();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 public class AggregateClass1: IClass1
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 public int Method1() { return 1; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 public int Method3() { return 3; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 public class AggregateClass2: IClass2
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 public int Method2() { return 2; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 public void AggregateTest()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 var duck = DuckTyping.Aggregate<IAggregatable>(new AggregateClass1(), new AggregateClass2());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 Assert.IsNotNull(duck);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 Assert.AreEqual(1, duck.Method1());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 Assert.AreEqual(2, duck.Method2());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 // It is still possible to get access
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 // to an interface of an underlying object.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 var cls2 = DuckTyping.Implement<IClass2>(duck);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 Assert.IsNotNull(cls2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 Assert.AreEqual(2, cls2.Method2());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 // Even to switch from one aggregated object to another
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 var cls1 = DuckTyping.Implement<IClass1>(cls2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 Assert.IsNotNull(cls1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 Assert.AreEqual(1, cls1.Method1());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 Assert.AreEqual(3, cls1.Method3());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 [Test]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 public void MissedMethodsAggregateTest()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 var duck = DuckTyping.Aggregate<IClass1>(new Version(1,0), Guid.NewGuid());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 Assert.That(duck, Is.Not.Null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 // Neither System.Guid nor System.Version will ever have Method1.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 Assert.That(duck.Method1(), Is.EqualTo(0));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 }