24a0b570d32fb5df6693e08c762f14b316a3cb71
[mono.git] / 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                                 testFilter = BabysitterSupport.AddBabysitterFilter(testFilter);\r
101 \r
102                                 TestResult result = null;\r
103                                 string savedDirectory = Environment.CurrentDirectory;\r
104                                 TextWriter savedOut = Console.Out;\r
105                                 TextWriter savedError = Console.Error;\r
106 \r
107                                 try\r
108                                 {\r
109                                         result = testRunner.Run( collector, testFilter );\r
110                                 }\r
111                                 finally\r
112                                 {\r
113                                         outWriter.Flush();\r
114                                         errorWriter.Flush();\r
115 \r
116                                         if ( redirectOutput )\r
117                                                 outWriter.Close();\r
118                                         if ( redirectError )\r
119                                                 errorWriter.Close();\r
120 \r
121                                         Environment.CurrentDirectory = savedDirectory;\r
122                                         Console.SetOut( savedOut );\r
123                                         Console.SetError( savedError );\r
124                                 }\r
125 \r
126                                 Console.WriteLine();\r
127 \r
128                                 if (result != null) {\r
129                                         string xmlOutput = CreateXmlOutput( result );\r
130 \r
131                                         if (options.xmlConsole)\r
132                                         {\r
133                                                 Console.WriteLine(xmlOutput);\r
134                                         }\r
135                                         else\r
136                                         {\r
137                                                 try\r
138                                                 {\r
139                                                         //CreateSummaryDocument(xmlOutput, transformReader );\r
140                                                         XmlResultTransform xform = new XmlResultTransform( transformReader );\r
141                                                         xform.Transform( new StringReader( xmlOutput ), Console.Out );\r
142                                                 }\r
143                                                 catch( Exception ex )\r
144                                                 {\r
145                                                         Console.WriteLine( "Error: {0}", ex.Message );\r
146                                                         return TRANSFORM_ERROR;\r
147                                                 }\r
148                                         }\r
149 \r
150                                         // Write xml output here\r
151                                         string xmlResultFile = options.xml == null || options.xml == string.Empty\r
152                                                 ? "TestResult.xml" : options.xml;\r
153 \r
154                                         using ( StreamWriter writer = new StreamWriter( xmlResultFile ) )\r
155                                         {\r
156                                                 writer.Write(xmlOutput);\r
157                                         }\r
158                                 }\r
159 \r
160                                 //if ( testRunner != null )\r
161                                 //    testRunner.Unload();\r
162 \r
163                                 if ( result == null || collector.HasExceptions )\r
164                                 {\r
165                                         collector.WriteExceptions();\r
166                                         return UNEXPECTED_ERROR;\r
167                                 }\r
168             \r
169                                 if ( !result.IsFailure ) return OK;\r
170 \r
171                                 ResultSummarizer summ = new ResultSummarizer( result );\r
172                                 return summ.FailureCount;\r
173                         }\r
174                         finally\r
175                         {\r
176                                 testRunner.Unload();\r
177                         }\r
178                 }\r
179 \r
180                 #region Helper Methods\r
181                 private static XmlTextReader GetTransformReader(ConsoleOptions parser)\r
182                 {\r
183                         XmlTextReader reader = null;\r
184                         if(parser.transform == null || parser.transform == string.Empty)\r
185                         {\r
186                                 Assembly assembly = Assembly.GetAssembly(typeof(XmlResultVisitor));\r
187                                 ResourceManager resourceManager = new ResourceManager("NUnit.Util.Transform",assembly);\r
188                                 string xmlData = (string)resourceManager.GetObject("Summary.xslt");\r
189 \r
190                                 reader = new XmlTextReader(new StringReader(xmlData));\r
191                         }\r
192                         else\r
193                         {\r
194                                 FileInfo xsltInfo = new FileInfo(parser.transform);\r
195                                 if(!xsltInfo.Exists)\r
196                                 {\r
197                                         Console.Error.WriteLine("Transform file: {0} does not exist", xsltInfo.FullName);\r
198                                         reader = null;\r
199                                 }\r
200                                 else\r
201                                 {\r
202                                         reader = new XmlTextReader(xsltInfo.FullName);\r
203                                 }\r
204                         }\r
205 \r
206                         return reader;\r
207                 }\r
208 \r
209                 private static TestRunner MakeRunnerFromCommandLine( ConsoleOptions options )\r
210                 {\r
211                         TestPackage package;\r
212                         ConsoleOptions.DomainUsage domainUsage = ConsoleOptions.DomainUsage.Default;\r
213 \r
214                         if (options.IsTestProject)\r
215                         {\r
216                                 NUnitProject project = NUnitProject.LoadProject((string)options.Parameters[0]);\r
217                                 string configName = options.config;\r
218                                 if (configName != null)\r
219                                         project.SetActiveConfig(configName);\r
220 \r
221                                 package = project.ActiveConfig.MakeTestPackage();\r
222                                 package.TestName = options.fixture;\r
223 \r
224                                 domainUsage = ConsoleOptions.DomainUsage.Single;\r
225                         }\r
226                         else if (options.Parameters.Count == 1)\r
227                         {\r
228                                 package = new TestPackage((string)options.Parameters[0]);\r
229                                 domainUsage = ConsoleOptions.DomainUsage.Single;\r
230                         }\r
231                         else\r
232                         {\r
233                                 package = new TestPackage("UNNAMED", options.Parameters);\r
234                                 domainUsage = ConsoleOptions.DomainUsage.Multiple;\r
235                         }\r
236 \r
237                         if (options.domain != ConsoleOptions.DomainUsage.Default)\r
238                                 domainUsage = options.domain;\r
239                     \r
240                         TestRunner testRunner = null;\r
241                                 \r
242                         switch( domainUsage )\r
243                         {\r
244                                 case ConsoleOptions.DomainUsage.None:\r
245                                         testRunner = new NUnit.Core.RemoteTestRunner();\r
246                                         // Make sure that addins are available\r
247                                         CoreExtensions.Host.AddinRegistry = Services.AddinRegistry;\r
248                                         break;\r
249 \r
250                                 case ConsoleOptions.DomainUsage.Single:\r
251                                         testRunner = new TestDomain();\r
252                                         break;\r
253 \r
254                                 case ConsoleOptions.DomainUsage.Multiple:\r
255                                         testRunner = new MultipleTestDomainRunner();\r
256                                         break;\r
257                         }\r
258 \r
259                         package.TestName = options.fixture;\r
260                         package.Settings["ShadowCopyFiles"] = !options.noshadow;\r
261                         package.Settings["UseThreadedRunner"] = !options.nothread;\r
262                         testRunner.Load( package );\r
263 \r
264                         return testRunner;\r
265                 }\r
266 \r
267                 private static string CreateXmlOutput( TestResult result )\r
268                 {\r
269                         StringBuilder builder = new StringBuilder();\r
270                         XmlResultVisitor resultVisitor = new XmlResultVisitor(new StringWriter( builder ), result);\r
271                         result.Accept(resultVisitor);\r
272                         resultVisitor.Write();\r
273 \r
274                         return builder.ToString();\r
275                 }\r
276                 #endregion\r
277         }\r
278 }\r
279 \r