1
+ namespace AgileObjects . AgileMapper . UnitTests . Configuration
2
+ {
3
+ using System ;
4
+ using Common ;
5
+ using TestClasses ;
6
+ #if ! NET35
7
+ using Xunit ;
8
+ #else
9
+ using Fact = NUnit . Framework . TestAttribute ;
10
+
11
+ [ NUnit . Framework . TestFixture ]
12
+ #endif
13
+ public class WhenConfiguringReverseDataSources
14
+ {
15
+ [ Fact ]
16
+ public void ShouldReverseAConfiguredMemberByGlobalScope ( )
17
+ {
18
+ using ( var mapper = Mapper . CreateNew ( ) )
19
+ {
20
+ mapper . WhenMapping
21
+ . AutoReverseConfiguredDataSources ( )
22
+ . AndWhenMapping
23
+ . From < Person > ( )
24
+ . To < PublicProperty < Guid > > ( )
25
+ . Map ( ctx => ctx . Source . Id )
26
+ . To ( pp => pp . Value ) ;
27
+
28
+ var source = new Person { Id = Guid . NewGuid ( ) } ;
29
+ var result = mapper . Map ( source ) . ToANew < PublicProperty < Guid > > ( ) ;
30
+
31
+ result . Value . ShouldBe ( source . Id ) ;
32
+
33
+ var reverseResult = mapper . Map ( result ) . ToANew < Person > ( ) ;
34
+
35
+ reverseResult . Id . ShouldBe ( source . Id ) ;
36
+ }
37
+ }
38
+
39
+ [ Fact ]
40
+ public void ShouldReverseAConfiguredMemberByMappingScope ( )
41
+ {
42
+ using ( var mapper = Mapper . CreateNew ( ) )
43
+ {
44
+ mapper . WhenMapping
45
+ . From < Person > ( )
46
+ . To < PublicProperty < Guid > > ( )
47
+ . AutoReverseConfiguredDataSources ( )
48
+ . And
49
+ . Map ( ctx => ctx . Source . Id )
50
+ . To ( pp => pp . Value ) ;
51
+
52
+ var source = new Person { Id = Guid . NewGuid ( ) } ;
53
+ var result = mapper . Map ( source ) . ToANew < PublicProperty < Guid > > ( ) ;
54
+
55
+ result . Value . ShouldBe ( source . Id ) ;
56
+
57
+ var reverseResult = mapper . Map ( result ) . ToANew < Person > ( ) ;
58
+
59
+ reverseResult . Id . ShouldBe ( source . Id ) ;
60
+ }
61
+ }
62
+
63
+ [ Fact ]
64
+ public void ShouldReverseAConfiguredMemberByMemberScope ( )
65
+ {
66
+ using ( var mapper = Mapper . CreateNew ( ) )
67
+ {
68
+ mapper . WhenMapping
69
+ . From < Person > ( )
70
+ . To < PublicProperty < Guid > > ( )
71
+ . Map ( ctx => ctx . Source . Id )
72
+ . To ( pp => pp . Value )
73
+ . AndViceVersa ( ) ;
74
+
75
+ var source = new Person { Id = Guid . NewGuid ( ) } ;
76
+ var result = mapper . Map ( source ) . ToANew < PublicProperty < Guid > > ( ) ;
77
+
78
+ result . Value . ShouldBe ( source . Id ) ;
79
+
80
+ var reverseResult = mapper . Map ( result ) . ToANew < Person > ( ) ;
81
+
82
+ reverseResult . Id . ShouldBe ( source . Id ) ;
83
+ }
84
+ }
85
+
86
+ [ Fact ]
87
+ public void ShouldReverseAConfiguredMemberByOptInMemberScope ( )
88
+ {
89
+ using ( var mapper = Mapper . CreateNew ( ) )
90
+ {
91
+ mapper . WhenMapping . AutoReverseConfiguredDataSources ( ) ;
92
+
93
+ mapper . WhenMapping
94
+ . From < Person > ( ) . To < PublicProperty < Guid > > ( )
95
+ . DoNotAutoReverseConfiguredDataSources ( )
96
+ . And
97
+ . Map ( p => p . Id , pp => pp . Value )
98
+ . AndViceVersa ( ) ;
99
+
100
+ var source = new Person { Id = Guid . NewGuid ( ) } ;
101
+ var result = mapper . Map ( source ) . ToANew < PublicProperty < Guid > > ( ) ;
102
+
103
+ result . Value . ShouldBe ( source . Id ) ;
104
+
105
+ var reverseResult = mapper . Map ( result ) . ToANew < Person > ( ) ;
106
+
107
+ reverseResult . Id . ShouldBe ( source . Id ) ;
108
+ }
109
+ }
110
+
111
+ [ Fact ]
112
+ public void ShouldNotReverseAConfiguredMemberIfGlobalScopeOptedOutAtMappingScope ( )
113
+ {
114
+ using ( var mapper = Mapper . CreateNew ( ) )
115
+ {
116
+ mapper . WhenMapping
117
+ . AutoReverseConfiguredDataSources ( )
118
+ . AndWhenMapping
119
+ . From < Person > ( )
120
+ . To < PublicProperty < Guid > > ( )
121
+ . DoNotAutoReverseConfiguredDataSources ( )
122
+ . And
123
+ . Map ( p => p . Id , pp => pp . Value ) ;
124
+
125
+ var source = new Person { Id = Guid . NewGuid ( ) } ;
126
+ var result = mapper . Map ( source ) . ToANew < PublicProperty < Guid > > ( ) ;
127
+
128
+ result . Value . ShouldBe ( source . Id ) ;
129
+
130
+ var reverseResult = mapper . Map ( result ) . ToANew < Person > ( ) ;
131
+
132
+ reverseResult . Id . ShouldBeDefault ( ) ;
133
+ }
134
+ }
135
+
136
+ [ Fact ]
137
+ public void ShouldNotReverseAConfiguredMemberIfGlobalScopeOptedOutAtMemberScope ( )
138
+ {
139
+ using ( var mapper = Mapper . CreateNew ( ) )
140
+ {
141
+ mapper . WhenMapping
142
+ . AutoReverseConfiguredDataSources ( )
143
+ . AndWhenMapping
144
+ . From < Person > ( )
145
+ . To < PublicProperty < Guid > > ( )
146
+ . Map ( ctx => ctx . Source . Id )
147
+ . To ( pp => pp . Value )
148
+ . ButNotViceVersa ( ) ;
149
+
150
+ var source = new Person { Id = Guid . NewGuid ( ) } ;
151
+ var result = mapper . Map ( source ) . ToANew < PublicProperty < Guid > > ( ) ;
152
+
153
+ result . Value . ShouldBe ( source . Id ) ;
154
+
155
+ var reverseResult = mapper . Map ( result ) . ToANew < Person > ( ) ;
156
+
157
+ reverseResult . Id . ShouldBeDefault ( ) ;
158
+ }
159
+ }
160
+
161
+ [ Fact ]
162
+ public void ShouldNotReverseAConfiguredMemberIfMappingScopeOptedOutAtMemberScope ( )
163
+ {
164
+ using ( var mapper = Mapper . CreateNew ( ) )
165
+ {
166
+ mapper . WhenMapping
167
+ . From < Person > ( )
168
+ . To < PublicField < Guid > > ( )
169
+ . AutoReverseConfiguredDataSources ( )
170
+ . And
171
+ . Map ( p => p . Id , pf => pf . Value )
172
+ . ButNotViceVersa ( ) ;
173
+
174
+ var source = new Person { Id = Guid . NewGuid ( ) } ;
175
+ var result = mapper . Map ( source ) . ToANew < PublicField < Guid > > ( ) ;
176
+
177
+ result . Value . ShouldBe ( source . Id ) ;
178
+
179
+ var reverseResult = mapper . Map ( result ) . ToANew < Person > ( ) ;
180
+
181
+ reverseResult . Id . ShouldBeDefault ( ) ;
182
+ }
183
+ }
184
+
185
+ [ Fact ]
186
+ public void ShouldNotReverseAConfiguredConstant ( )
187
+ {
188
+ using ( var mapper = Mapper . CreateNew ( ) )
189
+ {
190
+ const string GUID_VALUE = "21EFCF97-C7CF-42C7-B152-1C072E8C3BEA" ;
191
+
192
+ mapper . WhenMapping
193
+ . AutoReverseConfiguredDataSources ( )
194
+ . AndWhenMapping
195
+ . From < Person > ( )
196
+ . To < PublicField < Guid > > ( )
197
+ . Map ( GUID_VALUE )
198
+ . To ( pf => pf . Value ) ;
199
+
200
+ var source = new Person { Id = Guid . NewGuid ( ) } ;
201
+ var result = mapper . Map ( source ) . ToANew < PublicField < Guid > > ( ) ;
202
+
203
+ result . Value . ShouldBe ( new Guid ( GUID_VALUE ) ) ;
204
+
205
+ var reverseResult = mapper . Map ( result ) . ToANew < Person > ( ) ;
206
+
207
+ reverseResult . Id . ShouldBeDefault ( ) ;
208
+ }
209
+ }
210
+
211
+ [ Fact ]
212
+ public void ShouldNotReverseAConditionalConfiguredMember ( )
213
+ {
214
+ using ( var mapper = Mapper . CreateNew ( ) )
215
+ {
216
+ mapper . WhenMapping
217
+ . AutoReverseConfiguredDataSources ( )
218
+ . AndWhenMapping
219
+ . From < ProductDto > ( )
220
+ . To < PublicProperty < int > > ( )
221
+ . If ( ctx => ctx . Source . Price > 100 )
222
+ . Map ( dto => dto . ProductId , pp => pp . Value ) ;
223
+
224
+ var lowPriceSource = new ProductDto { ProductId = "123" , Price = 99 } ;
225
+ var lowPriceResult = mapper . Map ( lowPriceSource ) . ToANew < PublicProperty < int > > ( ) ;
226
+
227
+ lowPriceResult . Value . ShouldBeDefault ( ) ;
228
+
229
+ var highPriceSource = new ProductDto { ProductId = "456" , Price = 101 } ;
230
+ var highPriceResult = mapper . Map ( highPriceSource ) . ToANew < PublicProperty < int > > ( ) ;
231
+
232
+ highPriceResult . Value . ShouldBe ( 456 ) ;
233
+
234
+ var lowPriceReverseResult = mapper . Map ( lowPriceResult ) . ToANew < ProductDto > ( ) ;
235
+
236
+ lowPriceReverseResult . ProductId . ShouldBeNull ( ) ;
237
+
238
+ var highPriceReverseResult = mapper . Map ( highPriceResult ) . ToANew < ProductDto > ( ) ;
239
+
240
+ highPriceReverseResult . ProductId . ShouldBeNull ( ) ;
241
+ }
242
+ }
243
+
244
+ [ Fact ]
245
+ public void ShouldAllowReplacementOfAutoReversedConfiguredMember ( )
246
+ {
247
+ using ( var mapper = Mapper . CreateNew ( ) )
248
+ {
249
+ mapper . WhenMapping . AutoReverseConfiguredDataSources ( ) ;
250
+
251
+ mapper . WhenMapping
252
+ . From < Person > ( )
253
+ . To < PublicTwoFields < Guid , Guid > > ( )
254
+ . Map ( p => p . Id , ptf => ptf . Value1 ) ;
255
+
256
+ mapper . WhenMapping
257
+ . From < PublicTwoFields < Guid , Guid > > ( )
258
+ . To < Person > ( )
259
+ . Map ( ptf => ptf . Value2 , p => p . Id ) ;
260
+
261
+ var source = new Person { Id = Guid . NewGuid ( ) } ;
262
+ var result = mapper . Map ( source ) . ToANew < PublicTwoFields < Guid , Guid > > ( ) ;
263
+
264
+ result . Value1 . ShouldBe ( source . Id ) ;
265
+ result . Value2 . ShouldBe ( source . Id ) ; // ...from reverse of Value2 -> Id
266
+
267
+ result . Value2 = Guid . NewGuid ( ) ;
268
+
269
+ var reverseResult = mapper . Map ( result ) . ToANew < Person > ( ) ;
270
+
271
+ reverseResult . Id . ShouldBe ( result . Value2 ) ;
272
+ }
273
+ }
274
+
275
+ [ Fact ]
276
+ public void ShouldAllowIgnoreOfAutoReversedConfiguredMember ( )
277
+ {
278
+ using ( var mapper = Mapper . CreateNew ( ) )
279
+ {
280
+ mapper . WhenMapping
281
+ . From < Person > ( )
282
+ . To < PublicTwoFields < Guid , Guid > > ( )
283
+ . AutoReverseConfiguredDataSources ( )
284
+ . And
285
+ . Map ( p => p . Id , ptf => ptf . Value1 ) ;
286
+
287
+ mapper . WhenMapping
288
+ . From < PublicTwoFields < Guid , Guid > > ( )
289
+ . To < Person > ( )
290
+ . Ignore ( p => p . Id ) ;
291
+
292
+ var source = new Person { Id = Guid . NewGuid ( ) } ;
293
+ var result = mapper . Map ( source ) . ToANew < PublicTwoFields < Guid , Guid > > ( ) ;
294
+
295
+ result . Value1 . ShouldBe ( source . Id ) ;
296
+ result . Value2 . ShouldBeDefault ( ) ;
297
+
298
+ var reverseResult = mapper . Map ( result ) . ToANew < Person > ( ) ;
299
+
300
+ reverseResult . Id . ShouldBeDefault ( ) ;
301
+ }
302
+ }
303
+ }
304
+ }
0 commit comments