1010using System . Globalization ;
1111using System . Linq ;
1212using System . Runtime . InteropServices ;
13-
1413using NUnit . Framework ;
1514
1615namespace Force . DeepCloner . Tests
@@ -48,9 +47,27 @@ public void Test_ExpressionTree_OrderBy2()
4847 [ Test ( Description = "Tests works on local SQL Server with AdventureWorks database" ) ]
4948 public void Clone_EfQuery1 ( )
5049 {
51- var q = new AdventureContext ( ) . Currencies . Where ( x => x . CurrencyCode == "AUD" ) ;
50+ var at = new AdventureContext ( ) ;
51+ // var at2 = at.DeepClone();
52+ // Console.WriteLine(at.ChangeTracker);
53+ // Console.WriteLine(at.ChangeTracker);
54+ var q = at . Currencies . Where ( x => x . CurrencyCode == "AUD" ) ;
5255 var q2 = q . DeepClone ( ) ;
53- Assert . That ( q . ToArray ( ) . Length , Is . EqualTo ( 1 ) ) ;
56+ #if NETCORE
57+ // Console.WriteLine(Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions
58+ // .GetRequiredService<Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IChangeTrackerFactory>(
59+ // ((Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<IServiceProvider>) at).Instance));
60+ /* Console.WriteLine(((Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<IServiceProvider>) at).Instance);
61+ var serviceProvider = ((Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<IServiceProvider>) at.DeepClone()).Instance;
62+ Console.WriteLine(serviceProvider);
63+ Console.WriteLine(serviceProvider.GetService(typeof(Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IChangeTrackerFactory)));
64+ Console.WriteLine(Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions
65+ .GetRequiredService<Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IChangeTrackerFactory>(
66+ serviceProvider));*/
67+ #endif
68+ // var q2 = q.DeepClone();
69+ // Console.WriteLine(q2.);
70+ // Assert.That(q.ToArray().Length, Is.EqualTo(1));
5471 Assert . That ( q2 . ToArray ( ) . Length , Is . EqualTo ( 1 ) ) ;
5572 }
5673
@@ -59,7 +76,7 @@ public void Clone_EfQuery2()
5976 {
6077 var q = new AdventureContext ( ) . Currencies . OrderBy ( x => x . Name ) ;
6178 var q2 = q . DeepClone ( ) ;
62- var cnt = q2 . Count ( ) ;
79+ var cnt = q . Count ( ) ;
6380 Assert . That ( q2 . Count ( ) , Is . EqualTo ( cnt ) ) ;
6481 }
6582
@@ -70,11 +87,11 @@ public void Clone_ComObject1()
7087// ReSharper disable SuspiciousTypeConversion.Global
7188 var manager = ( KnownFolders . IKnownFolderManager ) new KnownFolders . KnownFolderManager ( ) ;
7289// ReSharper restore SuspiciousTypeConversion.Global
73- Guid knownFolderID1 ;
74- Guid knownFolderID2 ;
75- manager . FolderIdFromCsidl ( 0 , out knownFolderID1 ) ;
76- manager . DeepClone ( ) . FolderIdFromCsidl ( 0 , out knownFolderID2 ) ;
77- Assert . That ( knownFolderID1 , Is . EqualTo ( knownFolderID2 ) ) ;
90+ Guid knownFolderId1 ;
91+ Guid knownFolderId2 ;
92+ manager . FolderIdFromCsidl ( 0 , out knownFolderId1 ) ;
93+ manager . DeepClone ( ) . FolderIdFromCsidl ( 0 , out knownFolderId2 ) ;
94+ Assert . That ( knownFolderId1 , Is . EqualTo ( knownFolderId2 ) ) ;
7895#endif
7996 }
8097
@@ -88,6 +105,28 @@ public void Clone_ComObject2()
88105#endif
89106 }
90107
108+ [ Test ]
109+ public void Lazy_Clone ( )
110+ {
111+ var lazy = new LazyClass ( ) ;
112+ var clone = lazy . DeepClone ( ) ;
113+ var v = LazyClass . Counter ;
114+ Assert . That ( clone . GetValue ( ) , Is . EqualTo ( ( v + 1 ) . ToString ( CultureInfo . InvariantCulture ) ) ) ;
115+ Assert . That ( lazy . GetValue ( ) , Is . EqualTo ( ( v + 2 ) . ToString ( CultureInfo . InvariantCulture ) ) ) ;
116+ }
117+
118+ public class LazyClass
119+ {
120+ public static int Counter ;
121+
122+ private readonly LazyRef < object > _lazyValue = new LazyRef < object > ( ( ) => ( object ) ( ++ Counter ) . ToString ( CultureInfo . InvariantCulture ) ) ;
123+
124+ public string GetValue ( )
125+ {
126+ return _lazyValue . Value . ToString ( ) ;
127+ }
128+ }
129+
91130 [ Table ( "Currency" , Schema = "Sales" ) ]
92131 public class Currency
93132 {
@@ -124,6 +163,17 @@ public void GenericComparer_Clone()
124163 comparer . DeepClone ( ) ;
125164 }
126165
166+ [ Test ]
167+ public void Closure_Clone ( )
168+ {
169+ int a = 0 ;
170+ Func < int > f = ( ) => ++ a ;
171+ var fCopy = f . DeepClone ( ) ;
172+ Assert . That ( f ( ) , Is . EqualTo ( 1 ) ) ;
173+ Assert . That ( fCopy ( ) , Is . EqualTo ( 1 ) ) ;
174+ Assert . That ( a , Is . EqualTo ( 1 ) ) ;
175+ }
176+
127177 private class TestComparer : Comparer < int >
128178 {
129179 // make object unsafe to work
@@ -158,5 +208,37 @@ internal class KnownFolderManager
158208 }
159209 }
160210#endif
211+ public sealed class LazyRef < T >
212+ {
213+ private Func < T > _initializer ;
214+ private T _value ;
215+
216+ /// <summary>
217+ /// This API supports the Entity Framework Core infrastructure and is not intended to be used
218+ /// directly from your code. This API may change or be removed in future releases.
219+ /// </summary>
220+ public T Value
221+ {
222+ get
223+ {
224+ if ( _initializer != null )
225+ {
226+ _value = _initializer ( ) ;
227+ _initializer = null ;
228+ }
229+ return _value ;
230+ }
231+ set
232+ {
233+ _value = value ;
234+ _initializer = null ;
235+ }
236+ }
237+
238+ public LazyRef ( Func < T > initializer )
239+ {
240+ _initializer = initializer ;
241+ }
242+ }
161243 }
162244}
0 commit comments