Mercurial > pub > bltoolkit
comparison UnitTests/CS/Mapping/ExpressionMapperTest.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f990fcb411a9 |
---|---|
1 using System; | |
2 using System.Collections.Generic; | |
3 using System.Linq; | |
4 using System.Linq.Expressions; | |
5 | |
6 using NUnit.Framework; | |
7 | |
8 using BLToolkit.Common; | |
9 using BLToolkit.Mapping; | |
10 | |
11 namespace Mapping | |
12 { | |
13 [TestFixture] | |
14 public class ExpressionMapperTest | |
15 { | |
16 [Test] | |
17 public void MapIntToString() | |
18 { | |
19 var mapper = Map.GetObjectMapper<int,string>(); | |
20 var dest = mapper(42); | |
21 | |
22 Assert.AreEqual("42", dest); | |
23 } | |
24 | |
25 [Test] | |
26 public void MapStringToInt() | |
27 { | |
28 var mapper = Map.GetObjectMapper<string,int>(); | |
29 var dest = mapper("42"); | |
30 | |
31 Assert.AreEqual(42, dest); | |
32 } | |
33 | |
34 [Test] | |
35 public void MapGenderToString() | |
36 { | |
37 var mapper = Map.GetObjectMapper<Gender,string>(); | |
38 var dest = mapper(Gender.Male); | |
39 | |
40 Assert.AreEqual("M", dest); | |
41 } | |
42 | |
43 [Test] | |
44 public void MapStringToGender() | |
45 { | |
46 var mapper = Map.GetObjectMapper<string,Gender>(); | |
47 var dest = mapper("M"); | |
48 | |
49 Assert.AreEqual(Gender.Male, dest); | |
50 } | |
51 | |
52 public enum Gender | |
53 { | |
54 [MapValue("F")] Female, | |
55 [MapValue("M")] Male, | |
56 [MapValue("U")] Unknown, | |
57 [MapValue("O")] Other | |
58 } | |
59 | |
60 public enum Enum1 | |
61 { | |
62 Value1 = 10, | |
63 Value2, | |
64 Value3, | |
65 Value4, | |
66 } | |
67 | |
68 public enum Enum2 | |
69 { | |
70 Value1, | |
71 Value2 = 10, | |
72 Value3, | |
73 Value4, | |
74 } | |
75 | |
76 public class Dest | |
77 { | |
78 public int Field1; | |
79 [MapField("Field2")] public float Field3; | |
80 public int Field4; | |
81 public int? Field6; | |
82 public int Field7; | |
83 public int Field8; | |
84 public int Field9; | |
85 public string Field10; | |
86 public int Field11; | |
87 [NullValue(12)] public int Field12; | |
88 [NullValue(13)] public int Field13; | |
89 [NullValue(14)] public int Field14; | |
90 public Gender Field15; | |
91 public string Field16; | |
92 public Enum2 Field17; | |
93 } | |
94 | |
95 public class Source | |
96 { | |
97 public int Field1 = 1; | |
98 public int Field2 = 2; | |
99 [MapField("Field4")] public float Field5 = 5; | |
100 public int Field6 = 6; | |
101 public int? Field7 = 7; | |
102 public int? Field8; | |
103 public decimal? Field9 = 9m; | |
104 public int Field10 = 10; | |
105 public string Field11 = "11"; | |
106 public string Field12 { get; set; } | |
107 public int? Field13; | |
108 public decimal? Field14; | |
109 public string Field15 = "F"; | |
110 public Gender Field16 = Gender.Male; | |
111 public Enum1 Field17 = Enum1.Value1; | |
112 } | |
113 | |
114 void Clone(Expression<Func<Source,Dest>> mapper) | |
115 { | |
116 /* | |
117 Expression.Lambda<Func<Source, Dest>>( | |
118 Expression.MemberInit( | |
119 Expression.New((ConstructorInfo) methodof(Dest..ctor), new Expression[0]), | |
120 new MemberBinding[] | |
121 { | |
122 Expression.Bind( | |
123 fieldof(Dest.Field1), | |
124 Expression.Field(CS$0$0000 = Expression.Parameter(typeof(Source), "s"), fieldof(Source.Field1))), | |
125 Expression.Bind( | |
126 fieldof(Dest.Field2), | |
127 Expression.Convert(Expression.Field(CS$0$0000, fieldof(Source.Field2)), typeof(float))) | |
128 }), new ParameterExpression[] { CS$0$0000 }); | |
129 */ | |
130 } | |
131 | |
132 [Test] | |
133 public void MapObjects() | |
134 { | |
135 var c = Convert<float,int>.From; | |
136 | |
137 //Clone(s => new Dest { Field1 = s.Field1, Field10 = s.Field10.ToString() }); | |
138 | |
139 //Map.ObjectToObject(new Source(), typeof(Dest)); | |
140 | |
141 var mapper = Map.GetObjectMapper<Source,Dest>(); | |
142 var src = new Source(); | |
143 var dest = mapper(src); | |
144 | |
145 Assert.AreEqual(1, dest.Field1); | |
146 Assert.AreEqual(2, dest.Field3); | |
147 Assert.AreEqual(src.Field5, dest.Field4); | |
148 Assert.AreEqual(src.Field6, dest.Field6.Value); | |
149 Assert.AreEqual(src.Field7.Value, dest.Field7); | |
150 Assert.AreEqual(src.Field8 ?? 0, dest.Field8); | |
151 Assert.AreEqual(src.Field9 ?? 0, dest.Field9); | |
152 Assert.AreEqual(src.Field10.ToString(), dest.Field10); | |
153 Assert.AreEqual(src.Field11, dest.Field11.ToString()); | |
154 Assert.AreEqual(12, dest.Field12); | |
155 Assert.AreEqual(13, dest.Field13); | |
156 Assert.AreEqual(14, dest.Field14); | |
157 Assert.AreEqual(Gender.Female, dest.Field15); | |
158 Assert.AreEqual("M", dest.Field16); | |
159 Assert.AreEqual(Enum2.Value2, dest.Field17); | |
160 } | |
161 | |
162 [Test] | |
163 public void MapObject() | |
164 { | |
165 var mapper = Map.GetObjectMapper<Source,Source>(); | |
166 var src = new Source(); | |
167 var dest = mapper(src); | |
168 | |
169 Assert.AreNotSame(src, dest); | |
170 Assert.AreEqual (src.Field1, dest.Field1); | |
171 Assert.AreEqual (src.Field2, dest.Field2); | |
172 Assert.AreEqual (src.Field5, dest.Field5); | |
173 Assert.AreEqual (src.Field6, dest.Field6); | |
174 Assert.AreEqual (src.Field7, dest.Field7); | |
175 Assert.AreEqual (src.Field8, dest.Field8); | |
176 Assert.AreEqual (src.Field9, dest.Field9); | |
177 Assert.AreEqual (src.Field10, dest.Field10); | |
178 Assert.AreEqual (src.Field11, dest.Field11); | |
179 Assert.AreEqual (src.Field12, dest.Field12); | |
180 Assert.AreEqual (src.Field13, dest.Field13); | |
181 Assert.AreEqual (src.Field14, dest.Field14); | |
182 Assert.AreEqual (src.Field15, dest.Field15); | |
183 Assert.AreEqual (src.Field16, dest.Field16); | |
184 Assert.AreEqual (src.Field17, dest.Field17); | |
185 } | |
186 | |
187 class Class1 { public int Field = 1; } | |
188 class Class2 { public int Field = 2; } | |
189 class Class3 { public Class1 Class = new Class1(); } | |
190 class Class4 { public Class2 Class = new Class2(); } | |
191 | |
192 [Test] | |
193 public void MapInnerObject1() | |
194 { | |
195 var mapper = Map.GetObjectMapper<Class3,Class4>(); | |
196 var src = new Class3(); | |
197 var dest = mapper(src); | |
198 | |
199 Assert.AreEqual(src.Class.Field, dest.Class.Field); | |
200 } | |
201 | |
202 class Class5 { public Class1 Class1 = new Class1(); public Class1 Class2; } | |
203 class Class6 { public Class2 Class1 = new Class2(); public Class2 Class2 = null; } | |
204 | |
205 [Test] | |
206 public void MapInnerObject2() | |
207 { | |
208 var mapper = Map.GetObjectMapper<Class5,Class6>(); | |
209 var src = new Class5(); | |
210 | |
211 src.Class2 = src.Class1; | |
212 | |
213 var dest = mapper(src); | |
214 | |
215 Assert.IsNotNull(dest.Class1); | |
216 Assert.AreSame(dest.Class1, dest.Class2); | |
217 } | |
218 | |
219 class Class7 { public Class9 Class; } | |
220 class Class8 { public Class10 Class = null; } | |
221 class Class9 { public Class7 Class = new Class7(); } | |
222 class Class10 { public Class8 Class = new Class8(); } | |
223 | |
224 [Test] | |
225 public void SelfReference1() | |
226 { | |
227 var mapper = Map.GetObjectMapper<Class9,Class10>(); | |
228 var src = new Class9(); | |
229 | |
230 src.Class.Class = src; | |
231 | |
232 var dest = mapper(src); | |
233 | |
234 Assert.AreSame(dest, dest.Class.Class); | |
235 } | |
236 | |
237 class Class11 { public Class9 Class = new Class9(); } | |
238 class Class12 { public Class10 Class = new Class10(); } | |
239 | |
240 [Test] | |
241 public void SelfReference2() | |
242 { | |
243 var mapper = Map.GetObjectMapper<Class11,Class12>(); | |
244 var src = new Class11(); | |
245 | |
246 src.Class.Class.Class = src.Class; | |
247 | |
248 var dest = mapper(src); | |
249 | |
250 Assert.AreSame(dest.Class, dest.Class.Class.Class); | |
251 } | |
252 | |
253 class Class13 { public Class1 Class = new Class1(); } | |
254 class Class14 { public Class1 Class = new Class1(); } | |
255 | |
256 [Test] | |
257 public void DeepCopy1() | |
258 { | |
259 var mapper = Map.GetObjectMapper<Class13,Class14>(); | |
260 var src = new Class13(); | |
261 | |
262 var dest = mapper(src); | |
263 | |
264 Assert.AreNotSame(src.Class, dest.Class); | |
265 } | |
266 | |
267 [Test] | |
268 public void DeepCopy2() | |
269 { | |
270 var mapper = Map.GetObjectMapper<Class13,Class14>(false); | |
271 var src = new Class13(); | |
272 | |
273 var dest = mapper(src); | |
274 | |
275 Assert.AreSame(src.Class, dest.Class); | |
276 } | |
277 | |
278 class Class15 { public List<Class1> List = new List<Class1> { new Class1(), new Class1() }; } | |
279 class Class16 { public List<Class2> List = null; } | |
280 | |
281 [Test] | |
282 public void ObjectList() | |
283 { | |
284 var mapper = Map.GetObjectMapper<Class15,Class16>(); | |
285 var src = new Class15(); | |
286 | |
287 src.List.Add(src.List[0]); | |
288 | |
289 var dest = mapper(src); | |
290 | |
291 Assert.AreEqual (3, dest.List.Count); | |
292 Assert.IsNotNull (dest.List[0]); | |
293 Assert.IsNotNull (dest.List[1]); | |
294 Assert.IsNotNull (dest.List[2]); | |
295 Assert.AreNotSame(dest.List[0], dest.List[1]); | |
296 Assert.AreSame (dest.List[0], dest.List[2]); | |
297 } | |
298 | |
299 [Test] | |
300 public void ScalarList() | |
301 { | |
302 var mapper = Map.GetObjectMapper<List<int>,IList<string>>(); | |
303 var dest = mapper(new List<int> { 1, 2, 3}); | |
304 | |
305 Assert.AreEqual("1", dest[0]); | |
306 Assert.AreEqual("2", dest[1]); | |
307 Assert.AreEqual("3", dest[2]); | |
308 } | |
309 | |
310 [Test] | |
311 public void ScalarArray() | |
312 { | |
313 var mapper = Map.GetObjectMapper<int[],string[]>(); | |
314 var dest = mapper(new[] { 1, 2, 3}); | |
315 | |
316 Assert.AreEqual("1", dest[0]); | |
317 Assert.AreEqual("2", dest[1]); | |
318 Assert.AreEqual("3", dest[2]); | |
319 } | |
320 | |
321 class Class17 | |
322 { | |
323 public IEnumerable<Class9> Arr { get { return GetEnumerable(); }} | |
324 | |
325 static IEnumerable<Class9> GetEnumerable() | |
326 { | |
327 var c = new Class9(); | |
328 | |
329 yield return c; | |
330 yield return new Class9(); | |
331 yield return c; | |
332 } | |
333 } | |
334 | |
335 class Class18 { public Class9[] Arr = null; } | |
336 | |
337 [Test] | |
338 public void ObjectArray1() | |
339 { | |
340 var mapper = Map.GetObjectMapper<Class17,Class18>(); | |
341 var dest = mapper(new Class17()); | |
342 | |
343 Assert.AreEqual (3, dest.Arr.Length); | |
344 Assert.IsNotNull (dest.Arr[0]); | |
345 Assert.IsNotNull (dest.Arr[1]); | |
346 Assert.IsNotNull (dest.Arr[2]); | |
347 Assert.AreNotSame(dest.Arr[0], dest.Arr[1]); | |
348 Assert.AreSame (dest.Arr[0], dest.Arr[2]); | |
349 } | |
350 | |
351 class Class19 | |
352 { | |
353 public Class9[] Arr { get { return new Class17().Arr.ToArray(); }} | |
354 } | |
355 | |
356 [Test] | |
357 public void ObjectArray2() | |
358 { | |
359 var mapper = Map.GetObjectMapper<Class19,Class18>(); | |
360 var dest = mapper(new Class19()); | |
361 | |
362 Assert.AreEqual (3, dest.Arr.Length); | |
363 Assert.IsNotNull (dest.Arr[0]); | |
364 Assert.IsNotNull (dest.Arr[1]); | |
365 Assert.IsNotNull (dest.Arr[2]); | |
366 Assert.AreNotSame(dest.Arr[0], dest.Arr[1]); | |
367 Assert.AreSame (dest.Arr[0], dest.Arr[2]); | |
368 } | |
369 | |
370 class Class20 { public Source Class1 = new Source(); public Source Class2; } | |
371 class Class21 { public Dest Class1 = null; public Dest Class2 = null; } | |
372 | |
373 [Test] | |
374 public void NoCrossRef() | |
375 { | |
376 var mapper = new ExpressionMapper<Class20,Class21> { HandleBackReferences = false }.GetMapper(); | |
377 var source = new Class20(); | |
378 | |
379 source.Class2 = source.Class1; | |
380 | |
381 var dest = mapper(source); | |
382 | |
383 Assert.IsNotNull (dest.Class1); | |
384 Assert.IsNotNull (dest.Class2); | |
385 Assert.AreNotSame(dest.Class1, dest.Class2); | |
386 } | |
387 | |
388 class Object1 | |
389 { | |
390 public int Field1; | |
391 [ExpressionMapIgnore] | |
392 public int Field2; | |
393 } | |
394 | |
395 class Object2 | |
396 { | |
397 public int Field1; | |
398 public int Field2; | |
399 } | |
400 | |
401 [Test] | |
402 public void ExpressionMapIgnoreTest() | |
403 { | |
404 var mapper1 = Map.GetObjectMapper<Object1,Object2>(); | |
405 var object2 = mapper1(new Object1 { Field1 = 1, Field2 = 2 }); | |
406 | |
407 Assert.That(object2.Field2, Is.Not.EqualTo(2)); | |
408 | |
409 var mapper2 = Map.GetObjectMapper<Object2,Object1>(); | |
410 var object1 = mapper2(new Object2 { Field1 = 1, Field2 = 2 }); | |
411 | |
412 Assert.That(object1.Field2, Is.Not.EqualTo(2)); | |
413 } | |
414 | |
415 [MapField("SomethingColumnInDB", "MyInnerClass.Something")] | |
416 class MyClass | |
417 { | |
418 public int ID; | |
419 public string Name; | |
420 public MyInnerClass MyInnerClass; | |
421 } | |
422 | |
423 class MyInnerClass | |
424 { | |
425 public string Something; | |
426 } | |
427 | |
428 [Test] | |
429 public void MapFieldTest() | |
430 { | |
431 var entity = new MyClass | |
432 { | |
433 ID = 1, | |
434 Name = "Test", | |
435 MyInnerClass = new MyInnerClass { Something = "Something" } | |
436 }; | |
437 | |
438 var mapper = Map.GetObjectMapper<MyClass,MyClass>(true, true); | |
439 var clone = mapper(entity); | |
440 | |
441 Assert.That(clone.MyInnerClass, Is.Not.Null); | |
442 } | |
443 } | |
444 } |