pschelpdesk/Vendor/Prise.Tests/Activation/DefaultPluginActivationContextProviderTests.cs
2024-11-04 20:45:34 +01:00

321 lines
14 KiB
C#

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using Prise.Activation;
using Prise.AssemblyLoading;
using Prise.AssemblyScanning;
using Prise.Plugin;
using Prise.Tests.Plugins;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace Prise.Tests.Activation
{
[TestClass]
public class DefaultPluginActivationContextProviderTests : TestBase
{
[TestMethod]
public void Ctor_Works()
{
Assert.IsNotNull(new DefaultPluginActivationContextProvider());
}
//TODO More Tests
private Type GetContract()
{
return TestableTypeBuilder.New()
.WithName("IMyTestType")
.WithNamespace("Test.Type")
.Build();
}
private CustomAttributeData GetPluginAttributeForContract(Type contract)
{
return TestableAttributeBuilder.New()
.WithAttributeType(typeof(Prise.Plugin.PluginAttribute))
.WithNamedAgrument("PluginType", contract)
.Build();
}
[TestMethod]
public void ProvideActivationContext_Works()
{
var assemblyShim = this.mockRepository.Create<IAssemblyShim>();
var contract = GetContract();
var pluginAttribute = GetPluginAttributeForContract(contract);
var typeName = "MyTestType";
var testableType = TestableTypeBuilder.New()
.WithCustomAttributes(pluginAttribute)
.WithName(typeName)
.WithNamespace("Test.Type")
.Build();
// NO factory method
// NO activated method
// NO bootstrapper
// NO services
assemblyShim.Setup(a => a.Types).Returns(new[] { testableType });
var sut = new DefaultPluginActivationContextProvider();
var result = sut.ProvideActivationContext(testableType, assemblyShim.Object);
Assert.IsNotNull(result);
Assert.IsNull(result.PluginActivatedMethod);
Assert.IsNull(result.PluginFactoryMethod);
Assert.AreEqual(0, result.PluginServices.Count());
Assert.AreEqual(typeName, result.PluginType.Name);
}
[TestMethod]
public void ProvideActivationContext_WithFactoryMethod_Works()
{
var assemblyShim = this.mockRepository.Create<IAssemblyShim>();
var contract = GetContract();
var pluginAttribute = GetPluginAttributeForContract(contract);
// Factory method
var factoryMethodName = "This_Is_The_Factory_Method";
var factoryMethod = TestableMethodInfoBuilder.New()
.WithName(factoryMethodName)
.WithAttribute(TestableAttributeBuilder.New()
.WithAttributeType(typeof(Prise.Plugin.PluginFactoryAttribute)).Build())
.Build();
var typeName = "MyTestType";
var testableType = TestableTypeBuilder.New()
.WithCustomAttributes(pluginAttribute)
.WithName(typeName)
.WithNamespace("Test.Type")
.WithMethods(factoryMethod)
.Build();
// NO activated method
// NO bootstrapper
// NO services
assemblyShim.Setup(a => a.Types).Returns(new[] { testableType });
var sut = new DefaultPluginActivationContextProvider();
var result = sut.ProvideActivationContext(testableType, assemblyShim.Object);
Assert.IsNotNull(result);
Assert.IsNull(result.PluginActivatedMethod);
Assert.IsNotNull(result.PluginFactoryMethod);
Assert.AreEqual(factoryMethodName, result.PluginFactoryMethod.Name);
Assert.AreEqual(0, result.PluginServices.Count());
Assert.AreEqual(typeName, result.PluginType.Name);
}
[TestMethod]
public void ProvideActivationContext_WithActivatedMethod_Works()
{
var assemblyShim = this.mockRepository.Create<IAssemblyShim>();
var contract = GetContract();
var pluginAttribute = GetPluginAttributeForContract(contract);
// Factory method
var factoryMethodName = "This_Is_The_Factory_Method";
var factoryMethod = TestableMethodInfoBuilder.New()
.WithName(factoryMethodName)
.WithAttribute(TestableAttributeBuilder.New()
.WithAttributeType(typeof(Prise.Plugin.PluginFactoryAttribute)).Build())
.Build();
// Activated method
var activatedMethodName = "This_Is_The_Activation_Method";
var activatedMethod = TestableMethodInfoBuilder.New()
.WithName(activatedMethodName)
.WithAttribute(TestableAttributeBuilder.New()
.WithAttributeType(typeof(Prise.Plugin.PluginActivatedAttribute)).Build())
.Build();
var typeName = "MyTestType";
var testableType = TestableTypeBuilder.New()
.WithCustomAttributes(pluginAttribute)
.WithName(typeName)
.WithNamespace("Test.Type")
.WithMethods(new[] { factoryMethod, activatedMethod })
.Build();
// NO bootstrapper
// NO services
assemblyShim.Setup(a => a.Types).Returns(new[] { testableType });
var sut = new DefaultPluginActivationContextProvider();
var result = sut.ProvideActivationContext(testableType, assemblyShim.Object);
Assert.IsNotNull(result);
Assert.IsNotNull(result.PluginActivatedMethod);
Assert.AreEqual(activatedMethodName, result.PluginActivatedMethod.Name);
Assert.IsNotNull(result.PluginFactoryMethod);
Assert.AreEqual(factoryMethodName, result.PluginFactoryMethod.Name);
Assert.AreEqual(0, result.PluginServices.Count());
Assert.AreEqual(typeName, result.PluginType.Name);
}
[TestMethod]
public void ProvideActivationContext_WithPluginServices_Works()
{
var assemblyShim = this.mockRepository.Create<IAssemblyShim>();
var contract = GetContract();
var pluginAttribute = GetPluginAttributeForContract(contract);
// Factory method
var factoryMethodName = "This_Is_The_Factory_Method";
var factoryMethod = TestableMethodInfoBuilder.New()
.WithName(factoryMethodName)
.WithAttribute(TestableAttributeBuilder.New()
.WithAttributeType(typeof(Prise.Plugin.PluginFactoryAttribute)).Build())
.Build();
// Activated method
var activatedMethodName = "This_Is_The_Activation_Method";
var activatedMethod = TestableMethodInfoBuilder.New()
.WithName(activatedMethodName)
.WithAttribute(TestableAttributeBuilder.New()
.WithAttributeType(typeof(Prise.Plugin.PluginActivatedAttribute)).Build())
.Build();
var serviceTypeName1 = "IMyService1";
var serviceType1 = TestableTypeBuilder.New()
.WithName(serviceTypeName1)
.WithNamespace("Test.Type")
.Build();
var pluginService1 = "pluginService";
var serviceField1 = TestableFieldBuilder.New()
.WithName(pluginService1)
.WithAttribute(TestableAttributeBuilder.New()
.WithAttributeType(typeof(Prise.Plugin.PluginServiceAttribute))
.WithNamedAgrument("ServiceType", serviceType1)
.WithNamedAgrument("ProvidedBy", ProvidedBy.Plugin)
.Build())
.Build();
var proxyTypeName = "IProxyType";
var proxyType = TestableTypeBuilder.New()
.WithName(proxyTypeName)
.WithNamespace("Test.Type")
.Build();
var pluginService2 = "hostService";
var serviceField2 = TestableFieldBuilder.New()
.WithName(pluginService2)
.WithAttribute(TestableAttributeBuilder.New()
.WithAttributeType(typeof(Prise.Plugin.PluginServiceAttribute))
.WithNamedAgrument("ServiceType", serviceType1)
.WithNamedAgrument("ProvidedBy", ProvidedBy.Host)
.WithNamedAgrument("ProxyType", proxyType)
.Build())
.Build();
var typeName = "MyTestType";
var testableType = TestableTypeBuilder.New()
.WithCustomAttributes(pluginAttribute)
.WithName(typeName)
.WithNamespace("Test.Type")
.WithMethods(new[] { factoryMethod, activatedMethod })
.WithFields(new[] { serviceField1, serviceField2 })
.Build();
// NO bootstrapper
assemblyShim.Setup(a => a.Types).Returns(new[] { testableType });
var sut = new DefaultPluginActivationContextProvider();
var result = sut.ProvideActivationContext(testableType, assemblyShim.Object);
Assert.IsNotNull(result);
Assert.IsNotNull(result.PluginActivatedMethod);
Assert.AreEqual(activatedMethodName, result.PluginActivatedMethod.Name);
Assert.IsNotNull(result.PluginFactoryMethod);
Assert.AreEqual(factoryMethodName, result.PluginFactoryMethod.Name);
Assert.AreEqual(2, result.PluginServices.Count());
Assert.AreEqual(pluginService1, result.PluginServices.ElementAt(0).FieldName);
Assert.AreEqual(pluginService2, result.PluginServices.ElementAt(1).FieldName);
Assert.AreEqual(ProvidedBy.Plugin, result.PluginServices.ElementAt(0).ProvidedBy);
Assert.AreEqual(ProvidedBy.Host, result.PluginServices.ElementAt(1).ProvidedBy);
Assert.IsNull(result.PluginServices.ElementAt(0).ProxyType);
Assert.IsNotNull(result.PluginServices.ElementAt(1).ProxyType);
Assert.AreEqual(proxyTypeName, result.PluginServices.ElementAt(1).ProxyType.Name);
Assert.AreEqual(serviceTypeName1, result.PluginServices.ElementAt(0).ServiceType.Name);
Assert.AreEqual(serviceTypeName1, result.PluginServices.ElementAt(1).ServiceType.Name);
Assert.AreEqual(typeName, result.PluginType.Name);
}
[TestMethod]
public void ProvideActivationContext_WithBootstrapper_Works()
{
var assemblyShim = this.mockRepository.Create<IAssemblyShim>();
var contract = GetContract();
var pluginAttribute = GetPluginAttributeForContract(contract);
var serviceTypeName = "IMyService1";
var serviceType = TestableTypeBuilder.New()
.WithName(serviceTypeName)
.WithNamespace("Test.Type")
.Build();
var proxyTypeName = "BootstrapperService";
var proxyType = TestableTypeBuilder.New()
.WithName(proxyTypeName)
.WithNamespace("Test.Type")
.Build();
var bootstrapperServiceFieldName = "bootstrapperService";
var bootstrapperServiceField = TestableFieldBuilder.New()
.WithName(bootstrapperServiceFieldName)
.WithAttribute(TestableAttributeBuilder.New()
.WithAttributeType(typeof(Prise.Plugin.BootstrapperServiceAttribute))
.WithNamedAgrument("ServiceType", serviceType)
.WithNamedAgrument("ProxyType", proxyType)
.Build())
.Build();
var typeName = "MyTestType";
var testableType = TestableTypeBuilder.New()
.WithCustomAttributes(pluginAttribute)
.WithName(typeName)
.WithNamespace("Test.Type")
.Build();
var bootstrapperAttribute = TestableAttributeBuilder.New()
.WithAttributeType(typeof(Prise.Plugin.PluginBootstrapperAttribute))
.WithNamedAgrument("PluginType", testableType)
.Build();
var bootstrapperName = "MyTestTypeBootstrapper";
var bootstrapperType = TestableTypeBuilder.New()
.WithCustomAttributes(bootstrapperAttribute)
.WithName(bootstrapperName)
.WithNamespace("Test.Type")
.WithFields(new[] { bootstrapperServiceField })
.Build();
assemblyShim.Setup(a => a.Types).Returns(new[] { testableType, bootstrapperType });
var sut = new DefaultPluginActivationContextProvider();
var result = sut.ProvideActivationContext(testableType, assemblyShim.Object);
Assert.IsNotNull(result);
Assert.IsNull(result.PluginActivatedMethod);
Assert.IsNull(result.PluginFactoryMethod);
Assert.AreEqual(0, result.PluginServices.Count());
Assert.AreEqual(bootstrapperServiceFieldName, result.BootstrapperServices.ElementAt(0).FieldName);
Assert.AreEqual(proxyTypeName, result.BootstrapperServices.ElementAt(0).ProxyType.Name);
Assert.AreEqual(serviceTypeName, result.BootstrapperServices.ElementAt(0).ServiceType.Name);
Assert.AreEqual(typeName, result.PluginType.Name);
Assert.AreEqual(bootstrapperName, result.PluginBootstrapperType.Name);
}
}
}