1- using System . Collections . Generic ;
1+ using System ;
2+ using System . Collections . Generic ;
23
34using NUnit . Framework ;
45
@@ -43,6 +44,8 @@ public void ClassArray_Should_Be_Cloned()
4344 Assert . That ( cloned . Length , Is . EqualTo ( 2 ) ) ;
4445 Assert . That ( cloned [ 0 ] . X , Is . EqualTo ( 1 ) ) ;
4546 Assert . That ( cloned [ 1 ] . X , Is . EqualTo ( 2 ) ) ;
47+ Assert . That ( cloned [ 0 ] , Is . Not . EqualTo ( arr [ 0 ] ) ) ;
48+ Assert . That ( cloned [ 1 ] , Is . Not . EqualTo ( arr [ 1 ] ) ) ;
4649 }
4750
4851 public struct S1
@@ -57,7 +60,7 @@ public S1(int x)
5760
5861 public struct S2
5962 {
60- public C1 C ;
63+ public C1 C ;
6164 }
6265
6366 [ Test ]
@@ -78,6 +81,8 @@ public void StructArray_With_Class_Should_Be_Cloned()
7881 Assert . That ( cloned . Length , Is . EqualTo ( 2 ) ) ;
7982 Assert . That ( cloned [ 0 ] . C . X , Is . EqualTo ( 1 ) ) ;
8083 Assert . That ( cloned [ 1 ] . C . X , Is . EqualTo ( 2 ) ) ;
84+ Assert . That ( cloned [ 0 ] . C , Is . Not . EqualTo ( arr [ 0 ] . C ) ) ;
85+ Assert . That ( cloned [ 1 ] . C , Is . Not . EqualTo ( arr [ 1 ] . C ) ) ;
8186 }
8287
8388 [ Test ]
@@ -90,6 +95,16 @@ public void NullArray_hould_Be_Cloned()
9095 Assert . That ( cloned [ 1 ] , Is . Null ) ;
9196 }
9297
98+ [ Test ]
99+ public void NullAsArray_hould_Be_Cloned ( )
100+ {
101+ var arr = ( int [ ] ) null ;
102+ // ReSharper disable ExpressionIsAlwaysNull
103+ var cloned = arr . DeepClone ( ) ;
104+ // ReSharper restore ExpressionIsAlwaysNull
105+ Assert . That ( cloned , Is . Null ) ;
106+ }
107+
93108 [ Test ]
94109 public void IntList_Should_Be_Cloned ( )
95110 {
@@ -114,5 +129,110 @@ public void Dictionary_Should_Be_Cloned()
114129 Assert . That ( cloned [ "a" ] , Is . EqualTo ( 1 ) ) ;
115130 Assert . That ( cloned [ "b" ] , Is . EqualTo ( 2 ) ) ;
116131 }
132+
133+ [ Test ]
134+ public void Array_Of_Same_Arrays_Should_Be_Cloned ( )
135+ {
136+ var c1 = new [ ] { 1 , 2 , 3 } ;
137+ var arr = new [ ] { c1 , c1 , c1 } ;
138+ var cloned = arr . DeepClone ( ) ;
139+
140+ Assert . That ( cloned . Length , Is . EqualTo ( 3 ) ) ;
141+ Assert . That ( ReferenceEquals ( arr [ 0 ] , cloned [ 0 ] ) , Is . False ) ;
142+ Assert . That ( ReferenceEquals ( cloned [ 0 ] , cloned [ 1 ] ) , Is . True ) ;
143+ Assert . That ( ReferenceEquals ( cloned [ 1 ] , cloned [ 2 ] ) , Is . True ) ;
144+ }
145+
146+ public class AC
147+ {
148+ public int [ ] A { get ; set ; }
149+
150+ public int [ ] B { get ; set ; }
151+ }
152+
153+ [ Test ]
154+ public void Class_With_Same_Arrays_Should_Be_Cloned ( )
155+ {
156+ var ac = new AC ( ) ;
157+ ac . A = ac . B = new int [ 3 ] ;
158+ var clone = ac . DeepClone ( ) ;
159+ Assert . That ( ReferenceEquals ( ac . A , clone . A ) , Is . False ) ;
160+ Assert . That ( ReferenceEquals ( clone . A , clone . B ) , Is . True ) ;
161+ }
162+
163+ [ Test ]
164+ public void Class_With_Null_Array_hould_Be_Cloned ( )
165+ {
166+ var ac = new AC ( ) ;
167+ var cloned = ac . DeepClone ( ) ;
168+ Assert . That ( cloned . A , Is . Null ) ;
169+ Assert . That ( cloned . B , Is . Null ) ;
170+ }
171+
172+ [ Test ]
173+ public void MultiDim_Array_Should_Be_Cloned ( )
174+ {
175+ var arr = new int [ 2 , 2 ] ;
176+ arr [ 0 , 0 ] = 1 ;
177+ arr [ 0 , 1 ] = 2 ;
178+ arr [ 1 , 0 ] = 3 ;
179+ arr [ 1 , 1 ] = 4 ;
180+ var clone = arr . DeepClone ( ) ;
181+ Assert . That ( clone [ 0 , 0 ] , Is . EqualTo ( 1 ) ) ;
182+ Assert . That ( clone [ 0 , 1 ] , Is . EqualTo ( 2 ) ) ;
183+ Assert . That ( clone [ 1 , 0 ] , Is . EqualTo ( 3 ) ) ;
184+ Assert . That ( clone [ 1 , 1 ] , Is . EqualTo ( 4 ) ) ;
185+ }
186+
187+ [ Test ]
188+ public void MultiDim_Array_Should_Be_Cloned2 ( )
189+ {
190+ var arr = new int [ 2 , 2 , 1 ] ;
191+ arr [ 0 , 0 , 0 ] = 1 ;
192+ arr [ 0 , 1 , 0 ] = 2 ;
193+ arr [ 1 , 0 , 0 ] = 3 ;
194+ arr [ 1 , 1 , 0 ] = 4 ;
195+ var clone = arr . DeepClone ( ) ;
196+ Assert . That ( clone [ 0 , 0 , 0 ] , Is . EqualTo ( 1 ) ) ;
197+ Assert . That ( clone [ 0 , 1 , 0 ] , Is . EqualTo ( 2 ) ) ;
198+ Assert . That ( clone [ 1 , 0 , 0 ] , Is . EqualTo ( 3 ) ) ;
199+ Assert . That ( clone [ 1 , 1 , 0 ] , Is . EqualTo ( 4 ) ) ;
200+ }
201+
202+ [ Test ]
203+ public void MultiDim_Array_Of_Classes_Should_Be_Cloned ( )
204+ {
205+ var arr = new AC [ 2 , 2 ] ;
206+ arr [ 0 , 0 ] = arr [ 1 , 1 ] = new AC ( ) ;
207+ var clone = arr . DeepClone ( ) ;
208+ Assert . That ( clone [ 0 , 0 ] , Is . Not . Null ) ;
209+ Assert . That ( clone [ 1 , 1 ] , Is . Not . Null ) ;
210+ Assert . That ( clone [ 1 , 1 ] , Is . EqualTo ( clone [ 0 , 0 ] ) ) ;
211+ Assert . That ( clone [ 1 , 1 ] , Is . Not . EqualTo ( arr [ 0 , 0 ] ) ) ;
212+ }
213+
214+ [ Test ]
215+ public void NonZero_Based_Array_Should_Be_Cloned ( )
216+ {
217+ var arr = Array . CreateInstance ( typeof ( int ) , new [ ] { 2 } , new [ ] { 1 } ) ;
218+
219+ arr . SetValue ( 1 , 1 ) ;
220+ arr . SetValue ( 2 , 2 ) ;
221+ var clone = arr . DeepClone ( ) ;
222+ Assert . That ( clone . GetValue ( 1 ) , Is . EqualTo ( 1 ) ) ;
223+ Assert . That ( clone . GetValue ( 2 ) , Is . EqualTo ( 2 ) ) ;
224+ }
225+
226+ [ Test ]
227+ public void NonZero_Based_MultiDim_Array_Should_Be_Cloned ( )
228+ {
229+ var arr = Array . CreateInstance ( typeof ( int ) , new [ ] { 2 , 2 } , new [ ] { 1 , 1 } ) ;
230+
231+ arr . SetValue ( 1 , 1 , 1 ) ;
232+ arr . SetValue ( 2 , 2 , 2 ) ;
233+ var clone = arr . DeepClone ( ) ;
234+ Assert . That ( clone . GetValue ( 1 , 1 ) , Is . EqualTo ( 1 ) ) ;
235+ Assert . That ( clone . GetValue ( 2 , 2 ) , Is . EqualTo ( 2 ) ) ;
236+ }
117237 }
118238}
0 commit comments