// NAnt - A .NET build tool // Copyright (C) 2001-2002 Gerry Shaw // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // Gerry Shaw (gerry_shaw@yahoo.com) // // TO-DO : replace Console.WriteLine methods with logging method calls using System; using System.IO; using System.Text.RegularExpressions; using NUnit.Framework; namespace NAnt.NUnit1.Types { /// /// Prints information about running tests directly to the build log. /// public class LogFormatter : IResultFormatter { #region Public Instance Constructors public LogFormatter(string prefix, bool verbose) { if (prefix != null) { _prefix = prefix; } else { _prefix = String.Empty; } _verbose = verbose; } #endregion Public Instance Constructors #region Protected Instance Properties protected bool Verbose { get { return _verbose; } } protected string Prefix { get { return _prefix; } } #endregion Protected Instance Properties #region Implementation of IResultFormatter /// Not used, all output goes to Log class. public void SetOutput(TextWriter writer) { } /// Called when the whole test suite has started. public void StartTestSuite(NUnitTestData suite) { if (Verbose) { Console.WriteLine(Prefix + "------------------------------------------"); } } /// Called when the whole test suite has ended. public void EndTestSuite(TestResultExtra result) { if (Verbose) { Console.WriteLine(Prefix + "------------------------------------------"); } if (result.WasSuccessful) { Console.WriteLine(Prefix + "{0} tests: ALL SUCCESSFUL", result.RunCount); } else { Console.WriteLine(Prefix + "{0} tests: FAILURES: {1} ERRORS: {2}", result.RunCount, result.FailureCount, result.ErrorCount); } } #endregion Implementation of IResultFormatter #region Implementation of ITestListener public void AddError(ITest test, Exception e) { Console.WriteLine(Prefix + "ERROR: " + GetTestSummary(test)); Console.WriteLine(FormatError(e.StackTrace, e.Message)); if (Verbose) { Console.WriteLine(e.StackTrace); } } public void AddFailure(ITest test, AssertionFailedError e) { Console.WriteLine(Prefix + "FAILURE: " + GetTestSummary(test)); Console.WriteLine(FormatError(e.StackTrace, e.Message)); if (Verbose) { Console.WriteLine(e.StackTrace); } } public void StartTest(ITest test) { if (Verbose) { Console.WriteLine(Prefix + GetTestSummary(test)); } } public void EndTest(ITest test) { } #endregion Implementation of ITestListener #region Private Static Methods // NOTE: When test.ToString() displays something less stupid than // MethodName(Namespace.ClassName) think about changing to that. As it // is now its impossible to sort the test output. // The workaround is to use this method. private static string GetTestSummary(ITest test) { string nunitInfo = test.ToString(); return test.GetType().Name + "." + nunitInfo.Substring(0, nunitInfo.IndexOf('(')); } /// Convert a stack trace line into something that can be clicked on in an IDE output window. /// The StackTrace string, see . /// The string that gets appended to the end of file(line): portion. private static string FormatError(string trace, string message) { // if we can't find a filename(line#) string, then at least display the message string line = message; string[] lines = trace.Split(new char[] {'\n'}); // search the stack trace for the first filename(linenumber) like string Regex r = new Regex(@"^\s+at (?.+) in (?.+):line (?\d+)$"); foreach (string str in lines) { Match match = r.Match(str); if (match.Success) { line = match.Result("${file}(${line}): ") + message; break; // no need to continue } } return line; } #endregion Private Static Methods #region Private Instance Fields private string _prefix; private bool _verbose; #endregion Private Instance Fields } }