Browse Source
Extend the text templating addin to allow addins to define their own service providers. Package management addin defines a service provider that can be used in a T4 template to create EnvDTE types such as DTE.pull/28/head
16 changed files with 267 additions and 7 deletions
@ -0,0 +1,16 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
|
||||||
|
using System; |
||||||
|
using Microsoft.VisualStudio.Shell; |
||||||
|
|
||||||
|
namespace ICSharpCode.PackageManagement |
||||||
|
{ |
||||||
|
public class PackageManagementServiceProvider : IServiceProvider |
||||||
|
{ |
||||||
|
public object GetService(Type serviceType) |
||||||
|
{ |
||||||
|
return Package.GetGlobalService(serviceType); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
|
||||||
|
using System; |
||||||
|
using ICSharpCode.PackageManagement; |
||||||
|
using NUnit.Framework; |
||||||
|
|
||||||
|
namespace PackageManagement.Tests |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
public class PackageManagementServiceProviderTests |
||||||
|
{ |
||||||
|
PackageManagementServiceProvider serviceProvider; |
||||||
|
|
||||||
|
public void CreateServiceProvider() |
||||||
|
{ |
||||||
|
serviceProvider = new PackageManagementServiceProvider(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetService_TypeOfDTE_ReturnsDTE() |
||||||
|
{ |
||||||
|
CreateServiceProvider(); |
||||||
|
|
||||||
|
object dte = serviceProvider.GetService(typeof(global::EnvDTE.DTE)) as global::EnvDTE.DTE; |
||||||
|
|
||||||
|
Assert.IsInstanceOf(typeof(global::EnvDTE.DTE), dte); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
|
||||||
|
namespace ICSharpCode.TextTemplating |
||||||
|
{ |
||||||
|
public class CustomServiceTextTemplatingServiceProviders : IServiceProvider |
||||||
|
{ |
||||||
|
public static readonly string AddInPath = "/SharpDevelop/TextTemplating/ServiceProviders"; |
||||||
|
|
||||||
|
List<IServiceProvider> serviceProviders; |
||||||
|
|
||||||
|
public CustomServiceTextTemplatingServiceProviders() |
||||||
|
: this(new TextTemplatingAddInTree()) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public CustomServiceTextTemplatingServiceProviders(IAddInTree addInTree) |
||||||
|
{ |
||||||
|
serviceProviders = addInTree.BuildServiceProviders(AddInPath); |
||||||
|
} |
||||||
|
|
||||||
|
public object GetService(Type serviceType) |
||||||
|
{ |
||||||
|
foreach (IServiceProvider provider in serviceProviders) { |
||||||
|
object service = provider.GetService(serviceType); |
||||||
|
if (service != null) { |
||||||
|
return service; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,85 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
using ICSharpCode.TextTemplating; |
||||||
|
using NUnit.Framework; |
||||||
|
using Rhino.Mocks; |
||||||
|
|
||||||
|
namespace TextTemplating.Tests |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
public class CustomTextTemplatingServiceProvidersTests |
||||||
|
{ |
||||||
|
CustomServiceTextTemplatingServiceProviders customServiceProviders; |
||||||
|
IAddInTree fakeAddInTree; |
||||||
|
List<IServiceProvider> addInTreeServiceProviders; |
||||||
|
|
||||||
|
void CreateFakeAddInTree() |
||||||
|
{ |
||||||
|
fakeAddInTree = MockRepository.GenerateStub<IAddInTree>(); |
||||||
|
addInTreeServiceProviders = new List<IServiceProvider>(); |
||||||
|
fakeAddInTree |
||||||
|
.Stub(tree => tree.BuildServiceProviders(CustomServiceTextTemplatingServiceProviders.AddInPath)) |
||||||
|
.Return(addInTreeServiceProviders); |
||||||
|
} |
||||||
|
|
||||||
|
void CreateCustomTextTemplatingServiceProviders() |
||||||
|
{ |
||||||
|
customServiceProviders = new CustomServiceTextTemplatingServiceProviders(fakeAddInTree); |
||||||
|
} |
||||||
|
|
||||||
|
void AddServiceObjectToReturnFromServiceProvider(IServiceProvider serviceProvider, Type type, object objectToReturn) |
||||||
|
{ |
||||||
|
serviceProvider.Stub(provider => provider.GetService(type)).Return(objectToReturn); |
||||||
|
} |
||||||
|
|
||||||
|
IServiceProvider AddServiceProviderToAddInTree() |
||||||
|
{ |
||||||
|
IServiceProvider serviceProvider = MockRepository.GenerateStub<IServiceProvider>(); |
||||||
|
addInTreeServiceProviders.Add(serviceProvider); |
||||||
|
return serviceProvider; |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetService_AddInTreeDefinesNoServiceProviders_ReturnsNull() |
||||||
|
{ |
||||||
|
CreateFakeAddInTree(); |
||||||
|
CreateCustomTextTemplatingServiceProviders(); |
||||||
|
|
||||||
|
object result = customServiceProviders.GetService(typeof(string)); |
||||||
|
|
||||||
|
Assert.IsNull(result); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetService_AddInTreeDefinesOneServiceProvider_TypeReturnedFromServiceProvider() |
||||||
|
{ |
||||||
|
CreateFakeAddInTree(); |
||||||
|
IServiceProvider serviceProvider = AddServiceProviderToAddInTree(); |
||||||
|
object objectToReturnFromServiceProvider = new object(); |
||||||
|
AddServiceObjectToReturnFromServiceProvider(serviceProvider, typeof(string), objectToReturnFromServiceProvider); |
||||||
|
CreateCustomTextTemplatingServiceProviders(); |
||||||
|
|
||||||
|
object result = customServiceProviders.GetService(typeof(string)); |
||||||
|
|
||||||
|
Assert.AreEqual(objectToReturnFromServiceProvider, result); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetService_AddInTreeDefinesTwoServiceProvidersAndSecondDefinesServiceType_TypeReturnedFromSecondServiceProvider() |
||||||
|
{ |
||||||
|
CreateFakeAddInTree(); |
||||||
|
AddServiceProviderToAddInTree(); |
||||||
|
IServiceProvider serviceProvider = AddServiceProviderToAddInTree(); |
||||||
|
object objectToReturnFromServiceProvider = new object(); |
||||||
|
AddServiceObjectToReturnFromServiceProvider(serviceProvider, typeof(string), objectToReturnFromServiceProvider); |
||||||
|
CreateCustomTextTemplatingServiceProviders(); |
||||||
|
|
||||||
|
object result = customServiceProviders.GetService(typeof(string)); |
||||||
|
|
||||||
|
Assert.AreEqual(objectToReturnFromServiceProvider, result); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue