示例#1
0
        public void CanRunCodeBeforeMethodExecution()
        {
            var options = new TypeToTypeWrapperOptions()
            {
                OnBeforeMethod = (wrapperOptions, type, inst, mi) =>
                {
                    if (mi.Name == "Run")
                    {
                        ((TestClass)inst).AddCount(6);
                    }
                }
            };

            var wrapper = new TypeToTypeWrapper();
            var result  = wrapper.CreateType(typeof(TestClass), options);

            dynamic instance = Activator.CreateInstance(result);

            instance.Run();
            instance.Run();

            var instanceCount = instance.GetCount();

            Assert.Equal(12, instanceCount);
        }
示例#2
0
        public void CanExcludeMethods()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(TestClass),
                                            new TypeToTypeWrapperOptions()
            {
                ExcludeMethod = (options, type, mi) =>
                {
                    var hasOveloads = type.GetMethods().Count(x => string.Equals(x.Name, mi.Name)) > 1;

                    if (hasOveloads == false)
                    {
                        return(true);
                    }

                    var parameters = mi.GetParameters();

                    return(parameters.Length == 0);
                }
            });

            var addCountMethods = result.GetMethods().Where(x => x.Name == nameof(TestClass.AddCount));

            Assert.Single(addCountMethods);
        }
示例#3
0
        public void CanCreateSingleton()
        {
            var inst    = new TestClass();
            var options = new TypeToTypeWrapperOptions()
            {
                Factory = (wrapperOptions, type) => inst
            };

            var wrapper = new TypeToTypeWrapper();
            var result  = wrapper.CreateType(typeof(TestClass), options);

            dynamic instance  = Activator.CreateInstance(result);
            dynamic instance2 = Activator.CreateInstance(result);

            instance.AddCount();
            instance.AddCount();

            instance2.AddCount();
            instance2.AddCount();
            instance2.AddCount();

            var instanceCount = instance.GetCount();

            Assert.Equal(5, instanceCount);

            var instance2Count = instance2.GetCount();

            Assert.Equal(5, instance2Count);
        }
示例#4
0
        public void WrappedTypesAssemblyContainsVersion()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(TestClass));

            var versionInfo = FileVersionInfo.GetVersionInfo(result.Assembly.Location);
            var fileVersion = versionInfo.FileVersion;

            Assert.NotNull(fileVersion);
        }
示例#5
0
        public void CanDisableSourceCodeField()
        {
            var wrapper = new TypeToTypeWrapper();

            Assert.Throws <InvalidOperationException>(() =>
            {
                wrapper.CreateType(typeof(TestClass),
                                   new TypeToTypeWrapperOptions()
                {
                    CustomCodeGenerator = (options, type) => "public string GetCode(){return _source;}", IsSourceCodeIncluded = false
                });
            });
        }
示例#6
0
        public void CanAddAdditionalNamespaces()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(TestClass),
                                            new TypeToTypeWrapperOptions()
            {
                AdditionalNamespaces = new List <string>()
                {
                    "System.Diagnostics"
                },
                OnConstructorCustomCodeGenerator = (options, type) => "Debug.WriteLine(\"Hello\");"
            });
        }
示例#7
0
        public void IncludesAllDeclaredPublicMethodsByDefault()
        {
            var wrapper = new TypeToTypeWrapper();

            var originalType = typeof(TestClass);
            var result       = wrapper.CreateType(originalType);

            // Properties are also skipped by default
            var typeMethods = originalType.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
                              .Where(x => x.IsSpecialName == false).ToArray();
            var generatedMethods = result.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);

            Assert.Equal(typeMethods.Length, generatedMethods.Length);
        }
示例#8
0
        public void CanAddAdditionalReferences()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(TestClass),
                                            new TypeToTypeWrapperOptions()
            {
                AdditionalReferences = new List <Assembly>()
                {
                    typeof(JsonConverter).Assembly
                },
                OnConstructorCustomCodeGenerator = (options, type) => "var arr = new Newtonsoft.Json.Linq.JArray();"
            });
        }
示例#9
0
        public void CanWrapTypeWithConstructor()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(TestClassWithConstructor),
                                            new TypeToTypeWrapperOptions()
            {
                Factory = (options, type) => new TestClassWithConstructor("Hello there")
            });

            dynamic instance = Activator.CreateInstance(result);

            instance.Get();
        }
示例#10
0
        public void CanInherit()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(TestClass),
                                            new TypeToTypeWrapperOptions()
            {
                Inherits = typeof(CustomBaseClass)
            });

            var inherits = typeof(CustomBaseClass).IsAssignableFrom(result);

            Assert.True(inherits);
        }
示例#11
0
        public void CanRunCodeOnConstructorUsingString()
        {
            var options = new TypeToTypeWrapperOptions()
            {
                OnConstructorCustomCodeGenerator = (wrapperOptions, type) => "_instance.AddCount(21);"
            };

            var wrapper = new TypeToTypeWrapper();
            var result  = wrapper.CreateType(typeof(TestClass), options);

            dynamic instance      = Activator.CreateInstance(result);
            var     instanceCount = instance.GetCount();

            Assert.Equal(21, instanceCount);
        }
示例#12
0
        public void AddsSourceCodeIntoPrivateFieldByDefault()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(TestClass),
                                            new TypeToTypeWrapperOptions()
            {
                CustomCodeGenerator = (options, type) => "public string GetCode(){return _source;}"
            });

            dynamic instance = Activator.CreateInstance(result);
            var     source   = instance.GetCode();

            _testOutputHelper.WriteLine(source);
        }
示例#13
0
        public void CanWrapType()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(TestClass));

            dynamic instance = Activator.CreateInstance(result);

            instance.Run();

            var res  = instance.HelloWorld(20, true);
            var res2 = instance.HelloWorld(15, false);

            Assert.Equal("20", res);
            Assert.Equal("Hello 15", res2);
        }
示例#14
0
        public void DerivedPropertiesAreIncluded()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(EntityImpl), new TypeToTypeWrapperOptions()
            {
                IncludedProperties = new List <string>()
                {
                    "*"
                }
            });

            var properties = result.GetProperties();

            Assert.Equal(2, properties.Length);
        }
示例#15
0
        public void CanIncludeAllProperties()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(Product), new TypeToTypeWrapperOptions()
            {
                IncludedProperties = new List <string>()
                {
                    "*"
                }
            });

            var properties = result.GetProperties();

            Assert.Equal(3, properties.Length);
        }
示例#16
0
        public void CanIncludeSpecificMethodsWithMultipleWildCards()
        {
            var wrapper = new TypeToTypeWrapper();

            var options = new TypeToTypeWrapperOptions()
            {
                IncludedMethods = new List <string>()
                {
                    "*llo*", "Ru*"
                }
            };
            var result = wrapper.CreateType(typeof(TestClass), options);

            var allMethods = result.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);

            Assert.Equal(2, allMethods.Length);
        }
示例#17
0
        public void CanAutomaticallyHidePrivateProperty()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(ProductWithPrivateProperty),
                                            new TypeToTypeWrapperOptions()
            {
                IncludedProperties = new List <string>()
                {
                    "*"
                }
            });

            var properties = result.GetProperties();

            Assert.Equal(2, properties.Length);
        }
示例#18
0
        public void CanAddOpenGenericConstructorParameter()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(TestClass),
                                            new TypeToTypeWrapperOptions()
            {
                AdditionalConstructorParameters = new List <AdditionalParameter>()
                {
                    new AdditionalParameter(typeof(List <>), "myGenericParam")
                }
            });

            var constructor = result.GetConstructor(new[] { typeof(List <>).MakeGenericType(result) });

            Assert.NotNull(constructor);
        }
示例#19
0
        public void CanAddConstructorParameters()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(TestClass),
                                            new TypeToTypeWrapperOptions()
            {
                AdditionalConstructorParameters = new List <AdditionalParameter>()
                {
                    new AdditionalParameter(typeof(string), "myParam")
                }
            });

            var constructor = result.GetConstructor(new[] { typeof(string) });

            Assert.NotNull(constructor);
        }
示例#20
0
        public void CanRenameMethod()
        {
            var wrapper = new TypeToTypeWrapper();

            var options = new TypeToTypeWrapperOptions()
            {
                IncludedMethods = new List <string>()
                {
                    "Run"
                }, MethodNameGenerator = (wrapperOptions, type, mInfo) => "CustomMethodName"
            };

            var result = wrapper.CreateType(typeof(TestClass), options);

            dynamic instance = Activator.CreateInstance(result);

            instance.CustomMethodName();
        }
示例#21
0
        public void CanRunCodeOnConstructor()
        {
            var options = new TypeToTypeWrapperOptions()
            {
                OnConstructor = (wrapperOptions, type, inst) =>
                {
                    ((TestClass)inst).AddCount(15);
                }
            };

            var wrapper = new TypeToTypeWrapper();
            var result  = wrapper.CreateType(typeof(TestClass), options);

            dynamic instance      = Activator.CreateInstance(result);
            var     instanceCount = instance.GetCount();

            Assert.Equal(15, instanceCount);
        }
示例#22
0
        public void CanSetAndGetProperties()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(Product), new TypeToTypeWrapperOptions()
            {
                IncludedProperties = new List <string>()
                {
                    "Name"
                }
            });

            dynamic wrappedProduct = Activator.CreateInstance(result);

            wrappedProduct.Name = "Hello";

            Assert.Equal("Hello", wrappedProduct.Name);
        }
示例#23
0
        public void CanRunCodeAfterMethodExecutionUsingString()
        {
            var options = new TypeToTypeWrapperOptions()
            {
                OnAfterMethodCustomCodeGenerator = (wrapperOptions, type, mi) => "_instance.AddCount(18);"
            };

            var wrapper = new TypeToTypeWrapper();
            var result  = wrapper.CreateType(typeof(TestClass), options);

            dynamic instance = Activator.CreateInstance(result);

            instance.Run();
            instance.Run();

            var instanceCount = instance.GetCount();

            Assert.Equal(36, instanceCount);
        }
示例#24
0
        public void CanIncludeSpecificMethodsWithWildCard()
        {
            var wrapper = new TypeToTypeWrapper();

            var options = new TypeToTypeWrapperOptions()
            {
                IncludedMethods = new List <string>()
                {
                    "Hello*"
                }
            };

            var originalType = typeof(TestClass);
            var result       = wrapper.CreateType(originalType, options);

            var allMethods = result.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);

            Assert.Single(allMethods);
        }
示例#25
0
        public void CanInheritAndImplement()
        {
            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(TestClass),
                                            new TypeToTypeWrapperOptions()
            {
                Inherits = typeof(TestClass), Implements = new List <Type>()
                {
                    typeof(ITestInterface1), typeof(ITestInterface2)
                }
            });

            var implements1 = typeof(ITestInterface1).IsAssignableFrom(result);

            Assert.True(implements1);
            var implements2 = typeof(ITestInterface2).IsAssignableFrom(result);

            Assert.True(implements2);
        }
示例#26
0
        public void CanAddAttributesToType()
        {
            throw new NotImplementedException();

            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(typeof(TestClass), new TypeToTypeWrapperOptions()
            {
                TypeAttributesGenerator = (options, type) =>
                {
                    var typeAttributes = new List <Attribute> {
                        new DisplayNameAttribute("Hello There")
                    };

                    return(typeAttributes);
                }
            });

            Assert.Single(result.GetCustomAttributes(typeof(DisplayNameAttribute), true));
        }
示例#27
0
        public void CanAddCustomCode()
        {
            var customCode = @"public void RunThings()
                       {
                           var y = 0;
                           var a = 1;
           
                           a = y + 10;
                       }";

            var options = new TypeToTypeWrapperOptions()
            {
                CustomCodeGenerator = (wrapperOptions, type) => customCode
            };

            var wrapper = new TypeToTypeWrapper();
            var result  = wrapper.CreateType(typeof(TestClass), options);

            dynamic instance = Activator.CreateInstance(result);

            instance.RunThings();
        }
示例#28
0
        public void CanWrapGeneratedType()
        {
            var code = @"namespace MyTest {
                   public class MyClass
                   {
                       public void RunThings()
                       {
                           var y = 0;
                           var a = 1;
           
                           a = y + 10;
                       }
                   }}";

            var generator = new CodeToAssemblyGenerator();
            var assembly  = generator.GenerateAssembly(code);

            var type = assembly.GetExportedTypes().Single();

            var wrapper = new TypeToTypeWrapper();

            var result = wrapper.CreateType(type,
                                            new TypeToTypeWrapperOptions()
            {
                IncludedProperties = new List <string>()
                {
                    "*"
                }, TypeName          = "WrappedType",
                AdditionalNamespaces = new List <string>()
                {
                    type.Namespace
                },
                AssemblyGenerator = generator
            });

            dynamic inst = Activator.CreateInstance(result);

            inst.RunThings();
        }
示例#29
0
        public void ByDefaultEachInstanceIsTransient()
        {
            var wrapper = new TypeToTypeWrapper();
            var result  = wrapper.CreateType(typeof(TestClass));

            dynamic instance  = Activator.CreateInstance(result);
            dynamic instance2 = Activator.CreateInstance(result);

            instance.AddCount();
            instance.AddCount();

            instance2.AddCount();
            instance2.AddCount();
            instance2.AddCount();

            var instanceCount = instance.GetCount();

            Assert.Equal(2, instanceCount);

            var instance2Count = instance2.GetCount();

            Assert.Equal(3, instance2Count);
        }