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); }
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); }
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); }
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); }
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 }); }); }
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\");" }); }
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); }
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();" }); }
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(); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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(); }
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); }
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); }
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); }
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); }
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); }
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)); }
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(); }
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(); }
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); }