3 #if SILICONSTUDIO_PLATFORM_IOS || SILICONSTUDIO_PLATFORM_ANDROID
29 using System.Globalization;
30 using System.Reflection;
33 using NUnit.Framework.Api;
34 using NUnit.Framework.Internal;
35 using System.Collections.Generic;
36 using NUnitLite.Runner;
38 namespace SiliconStudio.
Paradox.Graphics.Regression
44 public class NUnit2XmlOutputWriter : OutputWriter
46 private XmlWriter xmlWriter;
47 private DateTime startTime;
49 private static Dictionary<string, string> resultStates =
new Dictionary<string, string>();
51 static NUnit2XmlOutputWriter()
53 resultStates[
"Passed"] =
"Success";
54 resultStates[
"Failed"] =
"Failure";
55 resultStates[
"Failed:Error"] =
"Error";
56 resultStates[
"Failed:Cancelled"] =
"Cancelled";
57 resultStates[
"Inconclusive"] =
"Inconclusive";
58 resultStates[
"Skipped"] =
"Skipped";
59 resultStates[
"Skipped:Ignored"] =
"Ignored";
60 resultStates[
"Skipped:Invalid"] =
"NotRunnable";
63 public NUnit2XmlOutputWriter(DateTime startTime)
65 this.startTime = startTime;
73 public override void WriteResultFile(ITestResult result,
TextWriter writer)
79 XmlWriter xmlWriter = XmlWriter.Create(writer);
81 XmlTextWriter xmlWriter =
new XmlTextWriter(writer);
82 xmlWriter.Formatting = Formatting.Indented;
87 WriteXmlOutput(result, xmlWriter);
95 private void WriteXmlOutput(ITestResult result, XmlWriter xmlWriter)
97 this.xmlWriter = xmlWriter;
99 InitializeXmlFile(result);
100 WriteResultElement(result);
104 private void InitializeXmlFile(ITestResult result)
106 ResultSummary summaryResults =
new ResultSummary(result);
108 xmlWriter.WriteStartDocument(
false);
109 xmlWriter.WriteComment(
"This file represents the results of running a test suite");
111 xmlWriter.WriteStartElement(
"test-results");
113 xmlWriter.WriteAttributeString(
"name", result.FullName);
114 xmlWriter.WriteAttributeString(
"total", summaryResults.TestCount.ToString());
115 xmlWriter.WriteAttributeString(
"errors", summaryResults.ErrorCount.ToString());
116 xmlWriter.WriteAttributeString(
"failures", summaryResults.FailureCount.ToString());
117 xmlWriter.WriteAttributeString(
"not-run", summaryResults.NotRunCount.ToString());
118 xmlWriter.WriteAttributeString(
"inconclusive", summaryResults.InconclusiveCount.ToString());
119 xmlWriter.WriteAttributeString(
"ignored", summaryResults.IgnoreCount.ToString());
120 xmlWriter.WriteAttributeString(
"skipped", summaryResults.SkipCount.ToString());
121 xmlWriter.WriteAttributeString(
"invalid", summaryResults.InvalidCount.ToString());
123 xmlWriter.WriteAttributeString(
"date", XmlConvert.ToString(startTime,
"yyyy-MM-dd"));
124 xmlWriter.WriteAttributeString(
"time", XmlConvert.ToString(startTime,
"HH:mm:ss"));
129 private void WriteCultureInfo()
131 xmlWriter.WriteStartElement(
"culture-info");
132 xmlWriter.WriteAttributeString(
"current-culture",
133 CultureInfo.CurrentCulture.ToString());
134 xmlWriter.WriteAttributeString(
"current-uiculture",
135 CultureInfo.CurrentUICulture.ToString());
136 xmlWriter.WriteEndElement();
139 private void WriteEnvironment()
141 xmlWriter.WriteStartElement(
"environment");
142 var assemblyName = AssemblyHelper.GetAssemblyName(Assembly.GetExecutingAssembly());
143 xmlWriter.WriteAttributeString(
"nunit-version",
144 assemblyName.Version.ToString());
145 xmlWriter.WriteAttributeString(
"clr-version",
146 Environment.Version.ToString());
147 xmlWriter.WriteAttributeString(
"os-version",
148 Environment.OSVersion.ToString());
149 xmlWriter.WriteAttributeString(
"platform",
150 Environment.OSVersion.Platform.ToString());
152 xmlWriter.WriteAttributeString(
"cwd",
153 Environment.CurrentDirectory);
155 xmlWriter.WriteAttributeString(
"machine-name",
156 Environment.MachineName);
157 xmlWriter.WriteAttributeString(
"user",
158 Environment.UserName);
159 xmlWriter.WriteAttributeString(
"user-domain",
160 Environment.UserDomainName);
163 xmlWriter.WriteEndElement();
166 private void WriteResultElement(ITestResult result)
168 StartTestElement(result);
170 WriteCategories(result);
171 WriteProperties(result);
173 switch (result.ResultState.Status)
175 case TestStatus.Skipped:
176 WriteReasonElement(result.Message);
178 case TestStatus.Failed:
179 WriteFailureElement(result.Message, result.StackTrace);
183 if (result.Test is TestSuite)
184 WriteChildResults(result);
186 xmlWriter.WriteEndElement();
189 private void TerminateXmlFile()
191 xmlWriter.WriteEndElement();
192 xmlWriter.WriteEndDocument();
198 #region Element Creation Helpers
200 private void StartTestElement(ITestResult result)
202 ITest test = result.Test;
203 TestSuite suite = test as TestSuite;
207 xmlWriter.WriteStartElement(
"test-suite");
208 xmlWriter.WriteAttributeString(
"type", suite.TestType);
209 xmlWriter.WriteAttributeString(
"name", suite.TestType ==
"Assembly"
210 ? result.Test.FullName
215 xmlWriter.WriteStartElement(
"test-case");
216 xmlWriter.WriteAttributeString(
"name", result.FullName);
219 if (test.Properties.ContainsKey(PropertyNames.Description))
221 string description = (string)test.Properties.Get(PropertyNames.Description);
222 xmlWriter.WriteAttributeString(
"description", description);
225 TestStatus status = result.ResultState.Status;
226 string translatedResult = resultStates[result.ResultState.ToString()];
228 if (status != TestStatus.Skipped)
230 xmlWriter.WriteAttributeString(
"executed",
"True");
231 xmlWriter.WriteAttributeString(
"result", translatedResult);
232 xmlWriter.WriteAttributeString(
"success", status == TestStatus.Passed ?
"True" :
"False");
233 xmlWriter.WriteAttributeString(
"time", result.Duration.TotalSeconds.ToString(
"0.000", NumberFormatInfo.InvariantInfo));
234 xmlWriter.WriteAttributeString(
"asserts", result.AssertCount.ToString());
238 xmlWriter.WriteAttributeString(
"executed",
"False");
239 xmlWriter.WriteAttributeString(
"result", translatedResult);
243 private void WriteCategories(ITestResult result)
245 IPropertyBag properties = result.Test.Properties;
247 if (properties.ContainsKey(PropertyNames.Category))
249 xmlWriter.WriteStartElement(
"categories");
251 foreach (
string category
in properties[PropertyNames.Category])
253 xmlWriter.WriteStartElement(
"category");
254 xmlWriter.WriteAttributeString(
"name", category);
255 xmlWriter.WriteEndElement();
258 xmlWriter.WriteEndElement();
262 private void WriteProperties(ITestResult result)
264 IPropertyBag properties = result.Test.Properties;
267 foreach (
string key
in properties.Keys)
269 if (key != PropertyNames.Category)
272 xmlWriter.WriteStartElement(
"properties");
274 foreach (
object prop
in properties[key])
276 xmlWriter.WriteStartElement(
"property");
277 xmlWriter.WriteAttributeString(
"name", key);
278 xmlWriter.WriteAttributeString(
"value", prop.ToString());
279 xmlWriter.WriteEndElement();
285 xmlWriter.WriteEndElement();
288 private void WriteReasonElement(
string message)
290 xmlWriter.WriteStartElement(
"reason");
291 xmlWriter.WriteStartElement(
"message");
292 xmlWriter.WriteCData(message);
293 xmlWriter.WriteEndElement();
294 xmlWriter.WriteEndElement();
297 private void WriteFailureElement(
string message,
string stackTrace)
299 xmlWriter.WriteStartElement(
"failure");
300 xmlWriter.WriteStartElement(
"message");
302 xmlWriter.WriteEndElement();
303 xmlWriter.WriteStartElement(
"stack-trace");
304 if (stackTrace != null)
305 WriteCData(stackTrace);
306 xmlWriter.WriteEndElement();
307 xmlWriter.WriteEndElement();
310 private void WriteChildResults(ITestResult result)
312 xmlWriter.WriteStartElement(
"results");
314 foreach (ITestResult childResult
in result.Children)
315 WriteResultElement(childResult);
317 xmlWriter.WriteEndElement();
322 #region Output Helpers
356 private void WriteCData(
string text)
361 int illegal = text.IndexOf(
"]]>", start);
364 xmlWriter.WriteCData(text.Substring(start, illegal - start + 2));
366 if (start >= text.Length)
371 xmlWriter.WriteCData(text.Substring(start));
373 xmlWriter.WriteCData(text);