This patch adds support for running NUnit2 tests with a fileset source for assemblies. This allows you to specify:

<nunit2>
   <test>
       <includesList name="tests.txt" />
   </test>
</nunit2>

to run all of the tests in "test.txt". It still supports the old syntax.

Any objections?

Matt.
? patch.txt
? pathc.txt
Index: NUnit2Task.cs
===================================================================
RCS file: /cvsroot/nant/nant/src/NAnt.NUnitTasks/NUnit2/NUnit2Task.cs,v
retrieving revision 1.5
diff -u -r1.5 NUnit2Task.cs
--- NUnit2Task.cs       25 Feb 2003 23:15:35 -0000      1.5
+++ NUnit2Task.cs       11 Mar 2003 19:29:51 -0000
@@ -26,6 +26,7 @@
 using System.Reflection;
 using System.Resources;
 using System.Collections;
+using System.Collections.Specialized;
 using System.Text;
 using SourceForge.NAnt.Attributes;
 using SourceForge.NAnt.Tasks.NUnit.Formatters;
@@ -44,7 +45,17 @@
     ///   <code>
     /// <![CDATA[
     /// <nunit2>
-    ///     <test assemblyname="MyProject.Tests.dll" outfile="results.xml"/>
+    ///     <test assemblyname="MyProject.Tests.dll"/>
+    /// </nunit2>
+    /// ]]>
+    ///   </code>
+    ///   <para>Run all tests in files listed in the <c>tests.txt</c> file.</para>
+    ///   <code>
+    /// <![CDATA[
+    /// <nunit2>
+    ///     <test>
+    ///         <includesList name="tests.txt" />
+    ///     </test>
     /// </nunit2>
     /// ]]>
     ///   </code>
@@ -53,14 +64,14 @@
     public class NUnit2Task : Task {
         private bool _haltOnFailure;
         private ArrayList tests = new ArrayList();
-               
+        
         /// <summary>Stop the build process if a test fails.</summary>
         [TaskAttribute("haltonfailure")]
         [BooleanValidator()]
         public bool HaltOnFailure       { get { return _haltOnFailure; } set { 
_haltOnFailure = value; }}
-           
+        
         FormatterElementCollection _formatterElements = new 
FormatterElementCollection();
-           
+        
         protected override void InitializeTask(XmlNode taskNode) {
             foreach (XmlNode testNode in taskNode) {
                 if(testNode.Name.Equals("test")) {
@@ -70,7 +81,7 @@
                     tests.Add(test);
                 }
             }
-                       
+            
             // now get formatters
             foreach (XmlNode formatterNode in taskNode) {
                 if(formatterNode.Name.Equals("formatter")) {
@@ -91,63 +102,77 @@
         protected override void ExecuteTask() {
             foreach (NUnit2Test test in tests) {
                 EventListener listener = new NullListener();
-                TestResult result = RunRemoteTest(test, listener);
-                               
-                string xmlResultFile = test.AssemblyName + "-results.xml";            
                 
-                                                       
-                XmlResultVisitor resultVisitor = new XmlResultVisitor(xmlResultFile, 
result);
-                result.Accept(resultVisitor);
-                resultVisitor.Write(); 
-                               
-                foreach (FormatterElement formatter in _formatterElements) {
-                    if (formatter.Type == FormatterType.Xml) {
-                        if (!formatter.UseFile) {
-                            using (StreamReader reader = new 
StreamReader(xmlResultFile)) {
-                                // strip off the xml header
-                                reader.ReadLine();
-                                StringBuilder builder = new StringBuilder();
-                                while (reader.Peek() > -1)
-                                    
builder.Append(reader.ReadLine().Trim()).Append("\n");
-                                Log.WriteLine(builder.ToString());
+                TestResult[] results = RunRemoteTest(test, listener);
+                StringCollection assemblies = GetTestAssemblies(test);
+                for ( int i = 0; i < results.Length; i++ ) {
+                        
+                    string assemblyFile = assemblies[ i ];
+                    TestResult result = results[ i ];
+
+                    string xmlResultFile = assemblyFile + "-results.xml";             
       
+                                
+                    XmlResultVisitor resultVisitor = new 
XmlResultVisitor(xmlResultFile, result);
+                    result.Accept(resultVisitor);
+                    resultVisitor.Write();    
+                    
+                    foreach (FormatterElement formatter in _formatterElements) {
+                        if (formatter.Type == FormatterType.Xml) {
+                            if (!formatter.UseFile) {
+                                using (StreamReader reader = new 
StreamReader(xmlResultFile)) {
+                                    // strip off the xml header
+                                    reader.ReadLine();
+                                    StringBuilder builder = new StringBuilder();
+                                    while (reader.Peek() > -1)
+                                        
builder.Append(reader.ReadLine().Trim()).Append("\n");
+                                    Log.WriteLine(builder.ToString());
+                                }
                             }
+                        } else if (formatter.Type == FormatterType.Plain) {
+                            TextWriter writer;
+                            if (formatter.UseFile) {
+                                writer = new StreamWriter(assemblyFile + "-results" + 
formatter.Extension);
+                            } else {
+                                writer = new LogWriter();
+                            }
+                            CreateSummaryDocument(xmlResultFile, writer, test);
+                            writer.Close();
                         }
-                    } else if (formatter.Type == FormatterType.Plain) {
-                        TextWriter writer;
-                        if (formatter.UseFile) {
-                            writer = new StreamWriter(test.AssemblyName + "-results" 
+ formatter.Extension);
-                        } else {
-                            writer = new LogWriter();
-                        }
-                        CreateSummaryDocument(xmlResultFile, writer, test);
-                        writer.Close();
                     }
+                    if (result.IsFailure && (test.HaltOnFailure || HaltOnFailure)) {
+                        throw new BuildException("Tests Failed");
+                    }        
                 }
-                if (result.IsFailure && (test.HaltOnFailure || HaltOnFailure)) {
-                    throw new BuildException("Tests Failed");
-                }              
             }
         }
-           
-        private TestResult RunRemoteTest(NUnit2Test test, EventListener listener) {
+        
+        private StringCollection GetTestAssemblies(NUnit2Test test) {
+            StringCollection files = new StringCollection();
+
+            if ( test.AssemblyName != null )
+                files.Add( test.AssemblyName );
+            else
+                files = test.Assemblies.FileNames;
+
+            return files;
+        }
+
+        private TestResult[] RunRemoteTest(NUnit2Test test, EventListener listener) {
             LogWriter writer = new LogWriter();
             NUnit2TestDomain domain = new NUnit2TestDomain(writer, writer);
-            if ( test.TestName != null ) {
-                return domain.RunTest(test.TestName, test.AssemblyName, 
test.AppConfigFile, listener);
-            } else {
-                return domain.Run(test.AssemblyName, test.AppConfigFile, listener);
-            }
+
+            return domain.RunTest(test.TestName, GetTestAssemblies(test), 
test.AppConfigFile, listener);
         }
-           
+        
         private void CreateSummaryDocument(string resultFile, TextWriter writer, 
NUnit2Test test) {
             XPathDocument originalXPathDocument = new XPathDocument (resultFile);
             XslTransform summaryXslTransform = new XslTransform();
             XmlTextReader transformReader = GetTransformReader(test);
             summaryXslTransform.Load(transformReader);
-                       
+            
             summaryXslTransform.Transform(originalXPathDocument,null,writer);
         }
-               
-               
+        
+        
         private XmlTextReader GetTransformReader(NUnit2Test test) {
             XmlTextReader transformReader;
             if(test.TransformFile == null) {
@@ -165,26 +190,26 @@
 
                 transformReader = new XmlTextReader(xsltInfo.FullName);
             }
-                       
+            
             return transformReader;
         }
-               
+        
         private class LogWriter : TextWriter {
-                       
+            
             public override Encoding Encoding { get { return Encoding.UTF8; } }
-                       
-                       
+            
+            
             public override void Write(char[] chars) {
                 Log.WriteLine(new String(chars, 0, chars.Length -1));
             }
-                       
+            
             public override void WriteLine(string line) {
                 Log.WriteLine(line);
             }
-                       
+            
             public override void WriteLine(string line, params object[] args) {
                 Log.WriteLine(line, args);
-            }                          
+            }                
         }
     }
 }
Index: NUnit2Test.cs
===================================================================
RCS file: /cvsroot/nant/nant/src/NAnt.NUnitTasks/NUnit2/NUnit2Test.cs,v
retrieving revision 1.2
diff -u -r1.2 NUnit2Test.cs
--- NUnit2Test.cs       15 Dec 2002 21:23:13 -0000      1.2
+++ NUnit2Test.cs       11 Mar 2003 19:29:51 -0000
@@ -24,33 +24,38 @@
 
 namespace SourceForge.NAnt.Tasks.NUnit2 
 {
-       [ElementName("test")]
-       public class NUnit2Test : Element 
-       {                  
-               private string _assemblyName = null;               
-               private string _testname = null;
-               private bool _haltOnFailure = true;
-               private string _transformFile;
-      string _appConfigFile = null;
+    [ElementName("test")]
+    public class NUnit2Test : Element 
+    {                  
+        private string _assemblyName = null;               
+        private string _testname = null;
+        private bool _haltOnFailure = true;
+        private string _transformFile;
+        private FileSet _assemblies = new FileSet();
+        string _appConfigFile = null;
 
-               /// <summary>Name of the assembly to search for tests.</summary>
-               [TaskAttribute("assemblyname", Required=true)]
-               public string AssemblyName { get { return _assemblyName; } set 
{_assemblyName = value;} }
+        /// <summary>Name of the assembly to search for tests.</summary>
+        [TaskAttribute("assemblyname")]
+        public string AssemblyName { get { return _assemblyName; } set {_assemblyName 
= value;} }
         
-               /// <summary>Name of a specific test to run. If Not specified then all 
tests in the assembly are run.</summary>
-               [TaskAttribute("testname")]
-               public string TestName { get { return _testname; } set {_testname = 
value;} }
+        /// <summary>Name of a specific test to run. If Not specified then all tests 
in the assembly are run.</summary>
+        [TaskAttribute("testname")]
+        public string TestName { get { return _testname; } set {_testname = value;} }
         
-               /// <summary>Build fails on failure</summary>
-               [TaskAttribute("haltonfailure")]
-               [BooleanValidator()]
-               public bool HaltOnFailure { get { return _haltOnFailure; } set { 
_haltOnFailure = value; } }
+        /// <summary>Assemblies to include in test.</summary>
+        [FileSet("assemblies")]
+        public FileSet Assemblies { get { return _assemblies; } set {_assemblies = 
value;} }
+
+        /// <summary>Build fails on failure</summary>
+        [TaskAttribute("haltonfailure")]
+        [BooleanValidator()]
+        public bool HaltOnFailure { get { return _haltOnFailure; } set { 
_haltOnFailure = value; } }
         
         /// <summary>XSLT transform file to use when using the Xml formatter</summary>
-               [TaskAttribute("transformfile")]
-               public string TransformFile { get { return _transformFile; } set { 
_transformFile = value; } }
+        [TaskAttribute("transformfile")]
+        public string TransformFile { get { return _transformFile; } set { 
_transformFile = value; } }
 
-               [TaskAttribute("appconfig")]
+        [TaskAttribute("appconfig")]
       public string AppConfigFile {
          get { return _appConfigFile; }
          set { _appConfigFile = value; }
Index: NUnit2TestDomain.cs
===================================================================
RCS file: /cvsroot/nant/nant/src/NAnt.NUnitTasks/NUnit2/NUnit2TestDomain.cs,v
retrieving revision 1.2
diff -u -r1.2 NUnit2TestDomain.cs
--- NUnit2TestDomain.cs 26 Feb 2003 02:54:43 -0000      1.2
+++ NUnit2TestDomain.cs 11 Mar 2003 19:29:51 -0000
@@ -22,6 +22,8 @@
 using System.IO;
 using System.Reflection;
 using System.Runtime.Remoting;
+using System.Collections;
+using System.Collections.Specialized;
 using System.Xml;
 using NUnit.Framework;
 using NUnit.Core;
@@ -46,65 +48,45 @@
          _errorStream = errorStream;
       }
 
-
       /// <summary>
-      /// Create a testsuite and run it from an assembly
+      /// Run a single testcase
       /// </summary>
-      /// <param name="assemblyFile"></param>
+      /// <param name="testcase">The test to run, or null if running all tests</param>
+      /// <param name="assemblyFiles"></param>
       /// <param name="configFilePath"></param>
       /// <param name="listener"></param>
-      /// <returns></returns>
-      public TestResult Run ( 
-                  string assemblyFile, 
+      /// <returns>The results of the test</returns>
+      public TestResult[] RunTest ( 
+                  string testcase, 
+                  StringCollection assemblyFiles,
                   string configFilePath, 
                   EventListener listener
                )
       {
-         AppDomain domain = 
-            CreateDomain(Path.GetDirectoryName(assemblyFile), configFilePath);
-         try 
-         {
-            RemoteTestRunner runner = CreateTestRunner(domain);
-
-            runner.Initialize(assemblyFile);
-            domain.DoCallBack(new CrossAppDomainDelegate(runner.BuildSuite));
-            return runner.Run(listener, _outStream, _errorStream);
-
-         } finally {
-            AppDomain.Unload(domain);
-         }
-      }
-
-      /// <summary>
-      /// Run a single testcase
-      /// </summary>
-      /// <param name="testcase"></param>
-      /// <param name="assemblyFile"></param>
-      /// <param name="configFilePath"></param>
-      /// <param name="listener"></param>
-      /// <returns></returns>
-      public TestResult RunTest ( 
-                  string testcase, string assemblyFile,
-                  string configFilePath, EventListener listener
-               )
-      {
-         string assemblyDir = Path.GetDirectoryName(assemblyFile);
-         AppDomain domain = CreateDomain(assemblyDir, configFilePath);
-
-         string currentDir = Directory.GetCurrentDirectory();
-         Directory.SetCurrentDirectory(assemblyDir);
+         ArrayList results = new ArrayList();
+         foreach ( string assemblyFile in assemblyFiles ) {
+            string assemblyDir = Path.GetFullPath( 
Path.GetDirectoryName(assemblyFile) );
+            AppDomain domain = CreateDomain(assemblyDir, configFilePath);
+
+            string currentDir = Directory.GetCurrentDirectory();
+            Directory.SetCurrentDirectory(assemblyDir);
+
+            try {
+                RemoteTestRunner runner = CreateTestRunner(domain);
+                if (testcase != null)
+                    runner.Initialize(testcase, assemblyFile);
+                else
+                    runner.Initialize(assemblyFile);
+                domain.DoCallBack(new CrossAppDomainDelegate(runner.BuildSuite));
+                results.Add( runner.Run(listener, _outStream, _errorStream) );
+
+            } finally {
+                Directory.SetCurrentDirectory(currentDir);
+                AppDomain.Unload(domain);
+            }
+        }
 
-         try 
-         {
-            RemoteTestRunner runner = CreateTestRunner(domain);
-            runner.Initialize(testcase, assemblyFile);
-            domain.DoCallBack(new CrossAppDomainDelegate(runner.BuildSuite));
-            return runner.Run(listener, _outStream, _errorStream);
-
-         } finally {
-            Directory.SetCurrentDirectory(currentDir);
-            AppDomain.Unload(domain);
-         }
+        return ( TestResult[] )results.ToArray( typeof( TestResult ) );
       }
 
       private AppDomain CreateDomain(string basedir, string configFilePath)

Reply via email to