Skip to content

Commit 5126b97

Browse files
committed
fixed some errors for expression tree copying.
1 parent 546a260 commit 5126b97

10 files changed

Lines changed: 2262 additions & 946 deletions

File tree

DeepCloner.Tests/DeepCloner.Tests.csproj

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@
4545
<Reference Include="CloneExtensions">
4646
<HintPath>..\packages\CloneExtensions.1.2\lib\portable-net40+sl50+win+wp80\CloneExtensions.dll</HintPath>
4747
</Reference>
48+
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
49+
<HintPath>..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll</HintPath>
50+
<Private>True</Private>
51+
</Reference>
52+
<Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
53+
<HintPath>..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll</HintPath>
54+
<Private>True</Private>
55+
</Reference>
4856
<Reference Include="FastDeepCloner, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
4957
<HintPath>..\packages\FastDeepCloner.1.0.9\lib\portable-net45+sl4+wp8+win8\FastDeepCloner.dll</HintPath>
5058
<Private>True</Private>
@@ -67,7 +75,9 @@
6775
<HintPath>..\packages\NUnit.3.6.0\lib\net45\nunit.framework.dll</HintPath>
6876
</Reference>
6977
<Reference Include="System" />
78+
<Reference Include="System.ComponentModel.DataAnnotations" />
7079
<Reference Include="System.Core" />
80+
<Reference Include="System.Drawing" />
7181
<Reference Include="System.Xml.Linq" />
7282
<Reference Include="System.Data.DataSetExtensions" />
7383
<Reference Include="Microsoft.CSharp" />
@@ -92,6 +102,7 @@
92102
<Compile Include="Properties\AssemblyInfo.cs" />
93103
<Compile Include="ShallowClonerSpec.cs" />
94104
<Compile Include="SimpleObjectSpec.cs" />
105+
<Compile Include="SpecificScenariosTest.cs" />
95106
<Compile Include="SystemTypesSpec.cs" />
96107
</ItemGroup>
97108
<ItemGroup>

DeepCloner.Tests/GenericsSpec.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,18 @@ public void Tuple_Should_Be_Cloned()
2727
Assert.That(c.Item2, Is.EqualTo(2));
2828
}
2929

30+
[Test]
31+
public void Generic_Should_Be_Cloned()
32+
{
33+
var c = new Generic<int>();
34+
c.Value = 12;
35+
Assert.That(c.DeepClone().Value, Is.EqualTo(12));
36+
37+
var c2 = new Generic<object>();
38+
c2.Value = 12;
39+
Assert.That(c2.DeepClone().Value, Is.EqualTo(12));
40+
}
41+
3042
public class C1
3143
{
3244
public int X { get; set; }
@@ -37,6 +49,11 @@ public class C2 : C1
3749
public int Y { get; set; }
3850
}
3951

52+
public class Generic<T>
53+
{
54+
public T Value { get; set; }
55+
}
56+
4057
[Test]
4158
public void Tuple_Should_Be_Cloned_With_Inheritance_And_Same_Object()
4259
{
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.ComponentModel.DataAnnotations;
4+
using System.ComponentModel.DataAnnotations.Schema;
5+
#if !NETCORE
6+
using System.Data.Entity;
7+
#else
8+
using Microsoft.EntityFrameworkCore;
9+
#endif
10+
using System.Globalization;
11+
using System.Linq;
12+
using System.Runtime.InteropServices;
13+
14+
using NUnit.Framework;
15+
16+
namespace Force.DeepCloner.Tests
17+
{
18+
#if !NETCORE
19+
[TestFixture(false)]
20+
#endif
21+
[TestFixture(true)]
22+
public class SpecificScenariosTest : BaseTest
23+
{
24+
public SpecificScenariosTest(bool isSafeInit)
25+
: base(isSafeInit)
26+
{
27+
}
28+
29+
[Test]
30+
public void Test_ExpressionTree_OrderBy1()
31+
{
32+
var q = Enumerable.Range(1, 5).Reverse().AsQueryable().OrderBy(x => x);
33+
var q2 = q.DeepClone();
34+
Assert.That(q2.ToArray()[0], Is.EqualTo(1));
35+
Assert.That(q.ToArray().Length, Is.EqualTo(5));
36+
}
37+
38+
[Test]
39+
public void Test_ExpressionTree_OrderBy2()
40+
{
41+
var l = new List<int> { 2, 1, 3, 4, 5 }.Select(y => new Tuple<int, string>(y, y.ToString(CultureInfo.InvariantCulture)));
42+
var q = l.AsQueryable().OrderBy(x => x.Item1);
43+
var q2 = q.DeepClone();
44+
Assert.That(q2.ToArray()[0].Item1, Is.EqualTo(1));
45+
Assert.That(q.ToArray().Length, Is.EqualTo(5));
46+
}
47+
48+
[Test(Description = "Tests works on local SQL Server with AdventureWorks database")]
49+
public void Clone_EfQuery1()
50+
{
51+
var q = new AdventureContext().Currencies.Where(x => x.CurrencyCode == "AUD");
52+
var q2 = q.DeepClone();
53+
Assert.That(q.ToArray().Length, Is.EqualTo(1));
54+
Assert.That(q2.ToArray().Length, Is.EqualTo(1));
55+
}
56+
57+
[Test(Description = "Tests works on local SQL Server with AdventureWorks database")]
58+
public void Clone_EfQuery2()
59+
{
60+
var q = new AdventureContext().Currencies.OrderBy(x => x.Name);
61+
var q2 = q.DeepClone();
62+
var cnt = q2.Count();
63+
Assert.That(q2.Count(), Is.EqualTo(cnt));
64+
}
65+
66+
[Test]
67+
public void Clone_ComObject1()
68+
{
69+
#if !NETCORE
70+
// ReSharper disable SuspiciousTypeConversion.Global
71+
var manager = (KnownFolders.IKnownFolderManager)new KnownFolders.KnownFolderManager();
72+
// 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));
78+
#endif
79+
}
80+
81+
[Test]
82+
public void Clone_ComObject2()
83+
{
84+
#if !NETCORE
85+
Type t = Type.GetTypeFromProgID("SAPI.SpVoice");
86+
var obj = Activator.CreateInstance(t);
87+
obj.DeepClone();
88+
#endif
89+
}
90+
91+
[Table("Currency", Schema = "Sales")]
92+
public class Currency
93+
{
94+
[Key]
95+
public string CurrencyCode { get; set; }
96+
97+
[Column]
98+
public string Name { get; set; }
99+
}
100+
101+
public class AdventureContext : DbContext
102+
{
103+
public AdventureContext()
104+
#if !NETCORE
105+
: base("Server=.;Integrated Security=SSPI;Database=AdventureWorks")
106+
#endif
107+
{
108+
}
109+
110+
public DbSet<Currency> Currencies { get; set; }
111+
112+
#if NETCORE
113+
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
114+
{
115+
optionsBuilder.UseSqlServer(@"Server=.;Database=AdventureWorks;Trusted_Connection=true;MultipleActiveResultSets=true");
116+
}
117+
#endif
118+
}
119+
120+
[Test]
121+
public void GenericComparer_Clone()
122+
{
123+
var comparer = new TestComparer();
124+
comparer.DeepClone();
125+
}
126+
127+
private class TestComparer : Comparer<int>
128+
{
129+
// make object unsafe to work
130+
private object _fieldX = new object();
131+
132+
public override int Compare(int x, int y)
133+
{
134+
return x.CompareTo(y);
135+
}
136+
}
137+
138+
#if !NETCORE
139+
public class KnownFolders
140+
{
141+
[Guid("8BE2D872-86AA-4d47-B776-32CCA40C7018"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
142+
internal interface IKnownFolderManager
143+
{
144+
void FolderIdFromCsidl(int csidl, [Out] out Guid knownFolderID);
145+
146+
void FolderIdToCsidl([In] [MarshalAs(UnmanagedType.LPStruct)] Guid id, [Out] out int csidl);
147+
148+
void GetFolderIds();
149+
}
150+
151+
[ComImport, Guid("4df0c730-df9d-4ae3-9153-aa6b82e9795a")]
152+
internal class KnownFolderManager
153+
{
154+
// make object unsafe to work
155+
#pragma warning disable 169
156+
private object _fieldX;
157+
#pragma warning restore 169
158+
}
159+
}
160+
#endif
161+
}
162+
}

DeepCloner.Tests/packages.config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<package id="Clone.Behave" version="1.0.1" targetFramework="net40" />
44
<package id="CloneExtensions" version="1.2" targetFramework="net40" />
55
<package id="DesertOctopus" version="0.1.1" targetFramework="net452" />
6+
<package id="EntityFramework" version="6.1.3" targetFramework="net461" />
67
<package id="FastDeepCloner" version="1.0.9" targetFramework="net461" />
78
<package id="fasterflect" version="2.1.3" targetFramework="net40" />
89
<package id="GeorgeCloney" version="1.1.1.17" targetFramework="net40" />

DeepCloner.Tests/project.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@
2020
"NClone": "1.1.1",
2121
"Nuclex.Cloning": "1.0.0",
2222
"FastDeepCloner": "1.0.9",
23-
"DesertOctopus": "0.1.1"
23+
"DesertOctopus": "0.1.1",
24+
"EntityFramework": "6.1.3"
25+
},
26+
"frameworkAssemblies": {
27+
"System.ComponentModel.DataAnnotations": "4.0.0"
2428
}
2529
},
2630
"netcoreapp1.0": {
@@ -29,6 +33,8 @@
2933
"define": ["NETCORE"]
3034
},
3135
"dependencies": {
36+
"NETStandard.Library": "1.6.1",
37+
"Microsoft.EntityFrameworkCore.SqlServer": "1.1.2",
3238
"dotnet-test-nunit": "3.4.0-beta-3",
3339
"Microsoft.NETCore.App": {
3440
"version": "1.1.0-*",

0 commit comments

Comments
 (0)