Al final siempre que me pongo acabo liandome.
Despues de tener la macro funcionando, me di cuenta de que estaria bien poder
configurar un par de parametros, como la versión de NUnit, o si se quiere usar
el runner GUI o de consola.
Asi que manos a la obra:
el TODO LIST:
1) Mostrar un Formulario desde una Macro
2) Acceder a las propiedades de configuración desde la Macro
3) Pones Nombres a las clases resultantes
4) Ejecutar la Macro desde el Formulario
5) Probar con varios proyectos en una solución.
Solutions
1) Lo más sencillo, crear un Formulario con VB.NET,
copiar y pegar en el proyecto de Macros.
En el punto de entrada de la Macro:
ConfUI = New NUnitProjectConfigUI ConfUI.ShowDialog()
Con esto ya tenemos accesible al form desde la Macro.
Los datos de localización de los binarios de NUNit los dejamos como constantes en un Modulo.
Public Const BASE_PATH As String = "c:\Program Files\NUnit " Public Const NUNIT_FX As String = "\bin\nunit.framework.dll" Public Const REF_ID As String = "nunit.framework" Public Const CONSOLE_RUNNER As String = "\bin\nunit-console.exe" Public Const GUI_RUNNER As String = "\bin\nunit-gui.exe"
2) Definimos las propiedas publicas que necesitamos desde la Macro
Public WriteOnly Property CurrentProject() As String Public ReadOnly Property NUnitFxPath() As String Public ReadOnly Property CurrentRunner() As String Public ReadOnly Property StartArgsPrefix() As String
La implementación de estas propiedades se basa en los controles seleccionados en
el Formulario (para más detalle ver fichero adjunto).
3) Ahora que ya tenemos unas cuantas clases es el momento de pensar de nuevo
los nombres (suelo cambiar el nombre de las clases, funciones y parametros tres
o cuatro veces antes de encontrar la definitiva)
Public Module NUnitProjectEnabler
Public Module NUnitConstants
Friend Class NUnitProjectConfigUI
Inherits System.Windows.Forms.Form
4) Ejecutar una función en NUnitProjectEnabler
desde el formulario NUnitProjectConfigUI implicaba tener una referencia
a la macro desde el UI, esto es crear un Dependecia entre el Form y la
macro, cosa poco recomendable.
Para evitar esta dependencia se han definido dos delegates de forma
que el módulo NUnitProjectEnabler, despues de instanciar el formulario NUnitProjectConfigUI
decide que función se debe ejecutar en respuesta a un click del usuario.
Friend Delegate Sub ConfigureProjectDelegate() 'NUnitProjectConfigUI Public ConfHandler As ConfigureProjectDelegate Public ResetHandler As ConfigureProjectDelegateNUnitProjectEnabler
ConfUI.ConfHandler = New ConfigureProjectDelegate(AddressOf EnableProject)
ConfUI.ResetHandler = New ConfigureProjectDelegate(AddressOf ResetProject)
5) Este punto es donde me he quedado, todavia no he entendido muy bien el modelo
de objetos de EnvDTE, asi que de momento se queda en la lista, y se usara el proyecto
seleccionado antes de ejecutar la macro.
De gustibus non est disputandum - There's no accounting for taste
Fide, non armis - By faith, not arms
Qui scribit bis legit - He who writes reads twice
Ventis secundis, tene cursum - Go with the flow
Vale, lacerte! - See you later, alligator!
Nullius in verba - (Rely) on the words on no one (Horace)
Sequens mirabitur aetas - The following age will be amazed
Tetigisti acu - You have hit the nail on the head. (Plautus)
Nil Sine Numine - Nothing without providence
Ab imo pectore - From the bottom of the chest (from the heart)
Risu inepto res ineptior nulla est - There is nothing more foolish than a foolish laugh. (Catullus)