Example #1
0
        public void ClassAndStructCloning()
        {
            try
            {
                var ilCloner = new IlCloner();

                var rootAsReferenceType = ExampleClass.GenerateExampleObject();
                var rootAsValueType     = ExampleClass.GenerateExampleObject().nestedStruct;

                var clonerRef   = ilCloner.CreateClonerDelegate <ExampleClass>();
                var clonerValue = ilCloner.CreateClonerDelegate <ExampleStruct>();

                var clonedReference = clonerRef(rootAsReferenceType);
                var clonedStruct    = clonerValue(rootAsValueType);

                Assert.IsTrue(rootAsReferenceType.Equals(clonedReference));
                Assert.IsTrue(rootAsValueType.Equals(clonedStruct));

                Assert.IsTrue(rootAsReferenceType.Equals(rootAsReferenceType.Clone()));
            }
            catch (Exception e)
            {
                var j = e + "";

                throw;
            }
        }
Example #2
0
        public void TestSeparateDelegateIsCreatedForNestedOuter()
        {
            var ilCloner = new IlCloner();
            var obj      = new TestCollectionItem
            {
                Contents = new TestCollection
                {
                    new TestCollectionItem {
                        Text = "ZZZ"
                    },
                    new TestCollectionItem {
                        Text = "XXX"
                    },
                    new TestCollectionItem {
                        Text = "YYY"
                    },
                },
                Text = "ZZZZ"
            };

            var cloner = ilCloner.CreateClonerDelegate(obj);

            /*
             * IL_0000: ldarg.1
             * IL_0001: stloc.0
             * IL_0002: ldarg.0
             * IL_0003: call       Int32 get_Count()/System.Collections.CollectionBase
             * IL_0008: stloc.1
             * IL_0009: ldc.i4.0
             * IL_000a: stloc.2
             * IL_000b: br.s       IL_0025
             * IL_000d: ldloc.0
             * IL_000e: ldarg.0
             * IL_000f: ldloc.2
             * IL_0010: callvirt   System.Object get_Item(Int32)/System.Collections.IList
             * IL_0015: ldnull
             *      -- Here is the problem, one extra argument
             *      -- The cached method was the outer one.
             * IL_0016: call       TestCollectionItem DeepClone_TestCollectionItem(TestCollectionItem)/DynGen0000_CloneState_TestCollectionItem
             * IL_001b: callvirt   Int32 Add(System.Object)/System.Collections.IList
             * IL_0020: pop
             * IL_0021: ldloc.2
             * IL_0022: ldc.i4.1
             * IL_0023: add
             * IL_0024: stloc.2
             * IL_0025: ldloc.2
             * IL_0026: ldloc.1
             * IL_0027: blt.s      IL_000d
             * IL_0029: ret
             */
            try
            {
                cloner(obj);
            }
            catch (Exception e)
            {
                var k = e + "";
                var j = 0;
            }
        }
Example #3
0
        public void TestSameNonGenericTypesClonedDifferently()
        {
            var ilCloner = new IlCloner();

            var example = new TestTwoNonGenericMembersSameType()
            {
                ListA = new TestNonGenericList
                {
                    "a", "b", "c", "d"
                },
                ListB = new TestNonGenericList
                {
                    1, 2, 3, 4
                }
            };

            var cloner = ilCloner.CreateClonerDelegate(example);

            var exampleCloned = cloner(example);

            Assert.IsFalse(Object.ReferenceEquals(example, exampleCloned));
            Assert.IsFalse(Object.ReferenceEquals(example.ListA, exampleCloned.ListA));
            Assert.IsFalse(Object.ReferenceEquals(example.ListB, exampleCloned.ListB));

            Assert.IsTrue(example.ListA.Cast <string>().SequenceEqual(exampleCloned.ListA.Cast <string>()));
            Assert.IsTrue(example.ListB.Cast <int>().SequenceEqual(exampleCloned.ListB.Cast <int>()));
        }
Example #4
0
        public void TestDecimalType()
        {
            var cloner = new IlCloner();
            var obj    = new TestClassWithDecimal();
            var del    = cloner.CreateClonerDelegate(obj);

            var cloned = del(obj);

            Assert.IsFalse(Object.ReferenceEquals(obj, cloned));
            Assert.AreEqual(obj.DecimalField, cloned.DecimalField);
            Assert.AreEqual(obj.DecimalProp, cloned.DecimalProp);
        }
Example #5
0
        public void TestTypeWithCustomConstructor()
        {
            var ilCloner = new IlCloner();

            ilCloner.DefineCustomConstructor <TestClassWithoutCtor>(c => TestClassWithoutCtor.Create());

            var obj = TestClassWithoutCtor.Create();

            obj.PropA = "JJJ";

            ilCloner.CreateClonerDelegate <TestClassWithoutCtor>()(obj);
        }
Example #6
0
        public void TestStructCloning()
        {
            var obj = new TestStructOnly
            {
                PropA = "ASDF",
                PropB = 1234
            };

            var cloner = new IlCloner();
            var del    = cloner.CreateClonerDelegate(obj);

            var output = del(obj);

            Assert.AreEqual(obj.PropA, output.PropA);
            Assert.AreEqual(obj.PropB, output.PropB);
        }
Example #7
0
        public void TestStructWithClassCloning()
        {
            var obj = new TestNestedStruct_IS_CLASS
            {
                StructProp = new TestNestedClass_IS_STRUCT
                {
                    ClassProp = new TestNestedStruct_IS_CLASS
                    {
                        StructProp = new TestNestedClass_IS_STRUCT()
                    }
                }
            };

            var cloner = new IlCloner();

            var clonerStruct = cloner.CreateClonerDelegate(obj.StructProp);
            var clonedStruct = clonerStruct(obj.StructProp);
        }
Example #8
0
        public void TestClassWithStructCloning()
        {
            var obj = new TestNestedStruct_IS_CLASS
            {
                StructProp = new TestNestedClass_IS_STRUCT
                {
                    ClassProp = new TestNestedStruct_IS_CLASS
                    {
                        StructProp = new TestNestedClass_IS_STRUCT()
                    }
                }
            };

            var cloner = new IlCloner();

            var clonerClass = cloner.CreateClonerDelegate(obj);
            var clonedClass = clonerClass(obj);
        }
Example #9
0
        public void TestAbstractMember()
        {
            var cloner = new IlCloner();

            var instance = new TestClassWIthAbstractMember
            {
                PropAbstract = new TestClassImplementingAbstract
                {
                    PropA = "ASDF"
                }
            };

            var del    = cloner.CreateClonerDelegate(instance);
            var output = del(instance);

            Assert.IsFalse(Object.ReferenceEquals(instance, output));
            Assert.IsFalse(Object.ReferenceEquals(instance.PropAbstract, output.PropAbstract));
            Assert.AreEqual(instance.PropAbstract.GetType(), output.PropAbstract.GetType());
            Assert.AreEqual(instance.PropAbstract.PropA, output.PropAbstract.PropA);
        }
Example #10
0
        public void TestInterfaceMember()
        {
            var cloner = new IlCloner();

            var instance = new TestClassWithInterfaceMember
            {
                PropInterface = new TestClassImplementingInterface
                {
                    PropA = "ASDF"
                }
            };

            var del    = cloner.CreateClonerDelegate(instance);
            var output = del(instance);

            Assert.IsFalse(Object.ReferenceEquals(instance, output));
            Assert.IsFalse(Object.ReferenceEquals(instance.PropInterface, output.PropInterface));
            Assert.AreEqual(instance.PropInterface.GetType(), output.PropInterface.GetType());
            Assert.AreEqual(instance.PropInterface.PropA, output.PropInterface.PropA);
        }
Example #11
0
        public void TestNestedStructCloning()
        {
            var obj = new TestStructWithNestedStruct
            {
                Nested = new TestStructOnly
                {
                    PropA = "ASDF",
                    PropB = 1234
                },
                PropC = "ZZZZ"
            };

            var cloner = new IlCloner();
            var del    = cloner.CreateClonerDelegate(obj);

            var output = del(obj);

            Assert.AreEqual(obj.Nested.PropA, output.Nested.PropA);
            Assert.AreEqual(obj.Nested.PropB, output.Nested.PropB);
            Assert.AreEqual(obj.PropC, output.PropC);
        }
Example #12
0
        public void TestThreadSafety()
        {
            var ilCloner = new IlCloner();

            var threadCount    = Math.Max(4, Environment.ProcessorCount - 1);
            var threadsRunning = 0;
            var start          = false;

            var tasks = Enumerable.Range(0, threadCount)
                        .Select(x => Task.Run(() =>
            {
                Interlocked.Increment(ref threadsRunning);
                SpinWait.SpinUntil(() => start);

                ilCloner.CreateClonerDelegate <ExampleClass>();
            }))
                        .ToArray();

            SpinWait.SpinUntil(() => threadsRunning == threadCount);
            start = true;

            Task.WaitAll(tasks);
        }
Example #13
0
        public void TestNonGenericListCloning()
        {
            var ilCloner = new IlCloner();

            var example = new AsList
            {
                "A", "B", "C"
            };

            var cloner = ilCloner.CreateClonerDelegate <AsList>();

            var cloned = cloner(example);

            Assert.IsFalse(Object.ReferenceEquals(example, cloned));
            Assert.IsTrue(example.SequenceEqual(cloned));

            var nonGenList = new ExampleOldSchoolList();

            ((IList)nonGenList).Add(example);
            ((IList)nonGenList).Add(example);
            ((IList)nonGenList).Add(example);
            ((IList)nonGenList).Add(example);
            ((IList)nonGenList).Add(example);
            ((IList)nonGenList).Add(example);

            var clonerNonGen = IlCloner.CreateCloner(nonGenList);
            var clonedNonGen = clonerNonGen(nonGenList);

            Assert.IsFalse(Object.ReferenceEquals(nonGenList, clonedNonGen));
            Assert.IsTrue(example.SequenceEqual(cloned));

            for (var i = 0; i < nonGenList.Count; i++)
            {
                Assert.IsFalse(Object.ReferenceEquals(((IList)nonGenList)[i], ((IList)clonedNonGen)[i]));
            }
        }
Example #14
0
 public Func <T, T> CreateCloner() =>
 _cloner.CreateClonerDelegate <T>();
Example #15
0
        public void TestTypeWithoutConstructor()
        {
            var ilCloner = new IlCloner();

            ilCloner.CreateClonerDelegate <TestClassWithoutCtor>();
        }