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