Changed link from GUID to URL
[mono.git] / mcs / nunit24 / ConsoleRunner / nunit-console / ConsoleUi.cs
1 // ****************************************************************\r
2 // This is free software licensed under the NUnit license. You\r
3 // may obtain a copy of the license as well as information regarding\r
4 // copyright ownership at http://nunit.org/?p=license&r=2.4.\r
5 // ****************************************************************\r
6 \r
7 namespace NUnit.ConsoleRunner\r
8 {\r
9         using System;\r
10         using System.IO;\r
11         using System.Reflection;\r
12         using System.Xml;\r
13         using System.Resources;\r
14         using System.Text;\r
15         using NUnit.Core;\r
16         using NUnit.Core.Filters;\r
17         using NUnit.Util;\r
18         \r
19         /// <summary>\r
20         /// Summary description for ConsoleUi.\r
21         /// </summary>\r
22         public class ConsoleUi\r
23         {\r
24                 public static readonly int OK = 0;\r
25                 public static readonly int INVALID_ARG = -1;\r
26                 public static readonly int FILE_NOT_FOUND = -2;\r
27                 public static readonly int FIXTURE_NOT_FOUND = -3;\r
28                 public static readonly int TRANSFORM_ERROR = -4;\r
29                 public static readonly int UNEXPECTED_ERROR = -100;\r
30 \r
31                 public ConsoleUi()\r
32                 {\r
33                 }\r
34 \r
35                 public int Execute( ConsoleOptions options )\r
36                 {\r
37                         XmlTextReader transformReader = GetTransformReader(options);\r
38                         if(transformReader == null) return FILE_NOT_FOUND;\r
39 \r
40                         TextWriter outWriter = Console.Out;\r
41                         bool redirectOutput = options.output != null && options.output != string.Empty;\r
42                         if ( redirectOutput )\r
43                         {\r
44                                 StreamWriter outStreamWriter = new StreamWriter( options.output );\r
45                                 outStreamWriter.AutoFlush = true;\r
46                                 outWriter = outStreamWriter;\r
47                         }\r
48 \r
49                         TextWriter errorWriter = Console.Error;\r
50                         bool redirectError = options.err != null && options.err != string.Empty;\r
51                         if ( redirectError )\r
52                         {\r
53                                 StreamWriter errorStreamWriter = new StreamWriter( options.err );\r
54                                 errorStreamWriter.AutoFlush = true;\r
55                                 errorWriter = errorStreamWriter;\r
56                         }\r
57 \r
58                         TestRunner testRunner = MakeRunnerFromCommandLine( options );\r
59 \r
60                         try\r
61                         {\r
62                                 if (testRunner.Test == null)\r
63                                 {\r
64                                         testRunner.Unload();\r
65                                         Console.Error.WriteLine("Unable to locate fixture {0}", options.fixture);\r
66                                         return FIXTURE_NOT_FOUND;\r
67                                 }\r
68 \r
69                                 EventCollector collector = new EventCollector( options, outWriter, errorWriter );\r
70 \r
71                                 TestFilter testFilter = TestFilter.Empty;\r
72                                 if ( options.run != null && options.run != string.Empty )\r
73                                 {\r
74                                         Console.WriteLine( "Selected test: " + options.run );\r
75                                         testFilter = new SimpleNameFilter( options.run );\r
76                                 }\r
77 \r
78                                 if ( options.include != null && options.include != string.Empty )\r
79                                 {\r
80                                         Console.WriteLine( "Included categories: " + options.include );\r
81                                         TestFilter includeFilter = new CategoryExpression( options.include ).Filter;\r
82                                         if ( testFilter.IsEmpty )\r
83                                                 testFilter = includeFilter;\r
84                                         else\r
85                                                 testFilter = new AndFilter( testFilter, includeFilter );\r
86                                 }\r
87 \r
88                                 if ( options.exclude != null && options.exclude != string.Empty )\r
89                                 {\r
90                                         Console.WriteLine( "Excluded categories: " + options.exclude );\r
91                                         TestFilter excludeFilter = new NotFilter( new CategoryExpression( options.exclude ).Filter );\r
92                                         if ( testFilter.IsEmpty )\r
93                                                 testFilter = excludeFilter;\r
94                                         else if ( testFilter is AndFilter )\r
95                                                 ((AndFilter)testFilter).Add( excludeFilter );\r
96                                         else\r
97                                                 testFilter = new AndFilter( testFilter, excludeFilter );\r
98                                 }\r
99 \r
100                                 TestResult result = null;\r
101                                 string savedDirectory = Environment.CurrentDirectory;\r
102                                 TextWriter savedOut = Console.Out;\r
103                                 TextWriter savedError = Console.Error;\r
104 \r
105                                 try\r
106                                 {\r
107                                         result = testRunner.Run( collector, testFilter );\r
108                                 }\r
109                                 finally\r
110                                 {\r
111                                         outWriter.Flush();\r
112                                         errorWriter.Flush();\r
113 \r
114                                         if ( redirectOutput )\r
115                                                 outWriter.Close();\r
116                                         if ( redirectError )\r
117                                                 errorWriter.Close();\r
118 \r
119                                         Environment.CurrentDirectory = savedDirectory;\r
120                                         Console.SetOut( savedOut );\r
121                                         Console.SetError( savedError );\r
122                                 }\r
123 \r
124                                 Console.WriteLine();\r
125 \r
126                                 if (result != null) {\r
127                                         string xmlOutput = CreateXmlOutput( result );\r
128 \r
129                                         if (options.xmlConsole)\r
130                                         {\r
131                                                 Console.WriteLine(xmlOutput);\r
132                                         }\r
133                                         else\r
134                                         {\r
135                                                 try\r
136                                                 {\r
137                                                         //CreateSummaryDocument(xmlOutput, transformReader );\r
138                                                         XmlResultTransform xform = new XmlResultTransform( transformReader );\r
139                                                         xform.Transform( new StringReader( xmlOutput ), Console.Out );\r
140                                                 }\r
141                                                 catch( Exception ex )\r
142                                                 {\r
143                                                         Console.WriteLine( "Error: {0}", ex.Message );\r
144                                                         return TRANSFORM_ERROR;\r
145                                                 }\r
146                                         }\r
147 \r
148                                         // Write xml output here\r
149                                         string xmlResultFile = options.xml == null || options.xml == string.Empty\r
150                                                 ? "TestResult.xml" : options.xml;\r
151 \r
152                                         using ( StreamWriter writer = new StreamWriter( xmlResultFile ) )\r
153                                         {\r
154                                                 writer.Write(xmlOutput);\r
155                                         }\r
156                                 }\r
157 \r
158                                 //if ( testRunner != null )\r
159                                 //    testRunner.Unload();\r
160 \r
161                                 if ( collector.HasExceptions )\r
162                                 {\r
163                                         collector.WriteExceptions();\r
164                                         return UNEXPECTED_ERROR;\r
165                                 }\r
166             \r
167                                 if ( !result.IsFailure ) return OK;\r
168 \r
169                                 ResultSummarizer summ = new ResultSummarizer( result );\r
170                                 return summ.FailureCount;\r
171                         }\r
172                         finally\r
173                         {\r
174                                 testRunner.Unload();\r
175                         }\r
176                 }\r
177 \r
178                 #region Helper Methods\r
179                 private static XmlTextReader GetTransformReader(ConsoleOptions parser)\r
180                 {\r
181                         XmlTextReader reader = null;\r
182                         if(parser.transform == null || parser.transform == string.Empty)\r
183                         {\r
184                                 Assembly assembly = Assembly.GetAssembly(typeof(XmlResultVisitor));\r
185                                 ResourceManager resourceManager = new ResourceManager("NUnit.Util.Transform",assembly);\r
186                                 string xmlData = (string)resourceManager.GetObject("Summary.xslt");\r
187 \r
188                                 reader = new XmlTextReader(new StringReader(xmlData));\r
189                         }\r
190                         else\r
191                         {\r
192                                 FileInfo xsltInfo = new FileInfo(parser.transform);\r
193                                 if(!xsltInfo.Exists)\r
194                                 {\r
195                                         Console.Error.WriteLine("Transform file: {0} does not exist", xsltInfo.FullName);\r
196                                         reader = null;\r
197                                 }\r
198                                 else\r
199                                 {\r
200                                         reader = new XmlTextReader(xsltInfo.FullName);\r
201                                 }\r
202                         }\r
203 \r
204                         return reader;\r
205                 }\r
206 \r
207                 private static TestRunner MakeRunnerFromCommandLine( ConsoleOptions options )\r
208                 {\r
209                         TestPackage package;\r
210                         ConsoleOptions.DomainUsage domainUsage = ConsoleOptions.DomainUsage.Default;\r
211 \r
212                         if (options.IsTestProject)\r
213                         {\r
214                                 NUnitProject project = NUnitProject.LoadProject((string)options.Parameters[0]);\r
215                                 string configName = options.config;\r
216                                 if (configName != null)\r
217                                         project.SetActiveConfig(configName);\r
218 \r
219                                 package = project.ActiveConfig.MakeTestPackage();\r
220                                 package.TestName = options.fixture;\r
221 \r
222                                 domainUsage = ConsoleOptions.DomainUsage.Single;\r
223                         }\r
224                         else if (options.Parameters.Count == 1)\r
225                         {\r
226                                 package = new TestPackage((string)options.Parameters[0]);\r
227                                 domainUsage = ConsoleOptions.DomainUsage.Single;\r
228                         }\r
229                         else\r
230                         {\r
231                                 package = new TestPackage("UNNAMED", options.Parameters);\r
232                                 domainUsage = ConsoleOptions.DomainUsage.Multiple;\r
233                         }\r
234 \r
235                         if (options.domain != ConsoleOptions.DomainUsage.Default)\r
236                                 domainUsage = options.domain;\r
237                     \r
238                         TestRunner testRunner = null;\r
239                                 \r
240                         switch( domainUsage )\r
241                         {\r
242                                 case ConsoleOptions.DomainUsage.None:\r
243                                         testRunner = new NUnit.Core.RemoteTestRunner();\r
244                                         // Make sure that addins are available\r
245                                         CoreExtensions.Host.AddinRegistry = Services.AddinRegistry;\r
246                                         break;\r
247 \r
248                                 case ConsoleOptions.DomainUsage.Single:\r
249                                         testRunner = new TestDomain();\r
250                                         break;\r
251 \r
252                                 case ConsoleOptions.DomainUsage.Multiple:\r
253                                         testRunner = new MultipleTestDomainRunner();\r
254                                         break;\r
255                         }\r
256 \r
257                         package.TestName = options.fixture;\r
258                         package.Settings["ShadowCopyFiles"] = !options.noshadow;\r
259                         package.Settings["UseThreadedRunner"] = !options.nothread;\r
260                         testRunner.Load( package );\r
261 \r
262                         return testRunner;\r
263                 }\r
264 \r
265                 private static string CreateXmlOutput( TestResult result )\r
266                 {\r
267                         StringBuilder builder = new StringBuilder();\r
268                         XmlResultVisitor resultVisitor = new XmlResultVisitor(new StringWriter( builder ), result);\r
269                         result.Accept(resultVisitor);\r
270                         resultVisitor.Write();\r
271 \r
272                         return builder.ToString();\r
273                 }\r
274                 #endregion\r
275         }\r
276 }\r
277 \r