From c0cf2dde87aa4c72fb8fa246a467f6e4e2c85b38 Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Tue, 25 Apr 2017 09:05:18 -0700 Subject: [PATCH 01/47] Organize API for multi-printer support Update test cases for status report --- ...PrinterTests.cs => RelianceStatusTests.cs} | 85 +++--- RelianceTalk.Test/RelianceTalk.Test.csproj | 2 +- RelianceTalk/{ => Common}/FontEffects.cs | 1 + RelianceTalk/Common/FontScalar.cs | 26 ++ RelianceTalk/{ => Common}/ReturnCode.cs | 9 + RelianceTalk/{ => Helpers}/RawPrintHelper.cs | 0 RelianceTalk/IPrinter.cs | 58 +++++ RelianceTalk/ISerialConnection.cs | 34 ++- RelianceTalk/{ => Reliance}/RealTimeStatus.cs | 0 RelianceTalk/Reliance/RelianceConnection.cs | 241 ++++++++++++++++++ .../{ => Reliance}/ReliancePrinter.cs | 181 ++++--------- RelianceTalk/RelianceTalk.csproj | 14 +- 12 files changed, 466 insertions(+), 185 deletions(-) rename RelianceTalk.Test/{ReliancePrinterTests.cs => RelianceStatusTests.cs} (75%) rename RelianceTalk/{ => Common}/FontEffects.cs (98%) create mode 100644 RelianceTalk/Common/FontScalar.cs rename RelianceTalk/{ => Common}/ReturnCode.cs (88%) rename RelianceTalk/{ => Helpers}/RawPrintHelper.cs (100%) create mode 100644 RelianceTalk/IPrinter.cs rename RelianceTalk/{ => Reliance}/RealTimeStatus.cs (100%) create mode 100644 RelianceTalk/Reliance/RelianceConnection.cs rename RelianceTalk/{ => Reliance}/ReliancePrinter.cs (60%) diff --git a/RelianceTalk.Test/ReliancePrinterTests.cs b/RelianceTalk.Test/RelianceStatusTests.cs similarity index 75% rename from RelianceTalk.Test/ReliancePrinterTests.cs rename to RelianceTalk.Test/RelianceStatusTests.cs index 7718c68..ea90ddf 100644 --- a/RelianceTalk.Test/ReliancePrinterTests.cs +++ b/RelianceTalk.Test/RelianceStatusTests.cs @@ -10,6 +10,7 @@ namespace RelianceTalk.Tests [TestFixture()] public class ReliancePrinterTests { + private const string TEST_PORT = "COM1"; [Test()] public void ReliancePrinterTest() @@ -17,48 +18,19 @@ public void ReliancePrinterTest() // Test ctor var printer = new ReliancePrinter("test"); Assert.IsNotNull(printer); - } [Test()] - public void GetStatusBidiTest() - { - var printer = new ReliancePrinter("Reliance"); - var status = printer.GetStatus(StatusRequests.FullStatus); - - // Only these should be set - Assert.IsNotNull(status.IsPaperPresent); - Assert.IsNotNull(status.IsPaperLevelOkay); - Assert.IsNotNull(status.IsTicketPresentAtOutput); - Assert.IsNotNull(status.IsCoverClosed); - Assert.IsNotNull(status.IsPaperMotorOff); - Assert.IsNotNull(status.IsDiagButtonReleased); - Assert.IsNotNull(status.IsHeadTemperatureOkay); - Assert.IsNotNull(status.IsCommsOkay); - Assert.IsNotNull(status.IsPowerSupplyVoltageOkay); - Assert.IsNotNull(status.IsPaperPathClear); - Assert.IsNotNull(status.IsCutterOkay); - - // All the rest must be null - Assert.IsNull(status.IsOnline); - Assert.IsNull(status.IsNormalFeed); - Assert.IsNull(status.HasError); - Assert.IsNull(status.HasFatalError); - Assert.IsNull(status.HasRecoverableError); - } - - [Test()] - public void GetStatusTest() + public void GetStatusTest_Status() { // Tests may run in parallel and since we are using a serial port // we should just run all queries in one test to avoid access issues. - var printer = new ReliancePrinter("Reliance", "COM25"); - - - + var printer = new ReliancePrinter("Reliance", TEST_PORT); var status = printer.GetStatus(StatusRequests.Status); + Assert.IsNotNull(status); + // Only IsOnline should be set Assert.IsNotNull(status.IsOnline); @@ -79,10 +51,16 @@ public void GetStatusTest() Assert.IsNull(status.HasFatalError); Assert.IsNull(status.HasRecoverableError); + } + [Test()] + public void GetStatusTest_OffLineStatus() + { + // Tests may run in parallel and since we are using a serial port + // we should just run all queries in one test to avoid access issues. + var printer = new ReliancePrinter("Reliance", TEST_PORT); - - status = printer.GetStatus(StatusRequests.OffLineStatus); + var status = printer.GetStatus(StatusRequests.OffLineStatus); // Only these should be set Assert.IsNotNull(status.IsCoverClosed); @@ -105,9 +83,16 @@ public void GetStatusTest() Assert.IsNull(status.HasRecoverableError); + } + [Test()] + public void GetStatusTest_ErrorStatus() + { + // Tests may run in parallel and since we are using a serial port + // we should just run all queries in one test to avoid access issues. + var printer = new ReliancePrinter("Reliance", TEST_PORT); - status = printer.GetStatus(StatusRequests.ErrorStatus); + var status = printer.GetStatus(StatusRequests.ErrorStatus); // Only these should be set Assert.IsNotNull(status.IsCutterOkay); @@ -130,8 +115,16 @@ public void GetStatusTest() Assert.IsNull(status.HasError); + } + + [Test()] + public void GetStatusTest_PaperRollStatus() + { + // Tests may run in parallel and since we are using a serial port + // we should just run all queries in one test to avoid access issues. + var printer = new ReliancePrinter("Reliance", TEST_PORT); - status = printer.GetStatus(StatusRequests.PaperRollStatus); + var status = printer.GetStatus(StatusRequests.PaperRollStatus); // Only these should be set Assert.IsNotNull(status.IsPaperLevelOkay); @@ -153,9 +146,16 @@ public void GetStatusTest() Assert.IsNull(status.HasFatalError); Assert.IsNull(status.HasRecoverableError); + } + [Test()] + public void GetStatusTest_PrintStatus() + { + // Tests may run in parallel and since we are using a serial port + // we should just run all queries in one test to avoid access issues. + var printer = new ReliancePrinter("Reliance", TEST_PORT); - status = printer.GetStatus(StatusRequests.PrintStatus); + var status = printer.GetStatus(StatusRequests.PrintStatus); // Only these should be set Assert.IsNotNull(status.IsPaperMotorOff); @@ -177,9 +177,16 @@ public void GetStatusTest() Assert.IsNull(status.HasFatalError); Assert.IsNull(status.HasRecoverableError); + } + [Test()] + public void GetStatusTest_FullStatus() + { + // Tests may run in parallel and since we are using a serial port + // we should just run all queries in one test to avoid access issues. + var printer = new ReliancePrinter("Reliance", TEST_PORT); - status = printer.GetStatus(StatusRequests.FullStatus); + var status = printer.GetStatus(StatusRequests.FullStatus); // Only these should be set Assert.IsNotNull(status.IsPaperPresent); diff --git a/RelianceTalk.Test/RelianceTalk.Test.csproj b/RelianceTalk.Test/RelianceTalk.Test.csproj index 7cf5142..ce78ce9 100644 --- a/RelianceTalk.Test/RelianceTalk.Test.csproj +++ b/RelianceTalk.Test/RelianceTalk.Test.csproj @@ -38,7 +38,7 @@ - + diff --git a/RelianceTalk/FontEffects.cs b/RelianceTalk/Common/FontEffects.cs similarity index 98% rename from RelianceTalk/FontEffects.cs rename to RelianceTalk/Common/FontEffects.cs index 7d3843a..3fda20e 100644 --- a/RelianceTalk/FontEffects.cs +++ b/RelianceTalk/Common/FontEffects.cs @@ -24,6 +24,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE namespace RelianceTalk { + [System.Flags] public enum FontEffects { Bold, diff --git a/RelianceTalk/Common/FontScalar.cs b/RelianceTalk/Common/FontScalar.cs new file mode 100644 index 0000000..28a7078 --- /dev/null +++ b/RelianceTalk/Common/FontScalar.cs @@ -0,0 +1,26 @@ +namespace RelianceTalk +{ + public enum FontWidthScalar + { + w1 = 1, + w2, + w3, + w4, + w5, + w6, + w7, + w8, + } + + public enum FontHeighScalar + { + h1 = 1, + h2, + h3, + h4, + h5, + h6, + h7, + h8, + } +} diff --git a/RelianceTalk/ReturnCode.cs b/RelianceTalk/Common/ReturnCode.cs similarity index 88% rename from RelianceTalk/ReturnCode.cs rename to RelianceTalk/Common/ReturnCode.cs index 6382184..9d55abd 100644 --- a/RelianceTalk/ReturnCode.cs +++ b/RelianceTalk/Common/ReturnCode.cs @@ -23,12 +23,21 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE */ namespace RelianceTalk { + + [System.Flags] public enum ReturnCode { Success = 0, + + // Connection issues + ConnectionAlreadyOpen, + ConnectionNotFound, + + // Syntax issues UnsupportedCommand, InvalidArgument, + // General failures ExecutionFailure, } } diff --git a/RelianceTalk/RawPrintHelper.cs b/RelianceTalk/Helpers/RawPrintHelper.cs similarity index 100% rename from RelianceTalk/RawPrintHelper.cs rename to RelianceTalk/Helpers/RawPrintHelper.cs diff --git a/RelianceTalk/IPrinter.cs b/RelianceTalk/IPrinter.cs new file mode 100644 index 0000000..b7d3ffd --- /dev/null +++ b/RelianceTalk/IPrinter.cs @@ -0,0 +1,58 @@ +namespace RelianceTalk +{ + interface IPrinter + { + /// + /// Gets or Sets the serial connection to use with this printer + /// + ISerialConnection Connection { get; set; } + + /// + /// Activates effect for next print. This effect + /// may be bitwise OR'd to apply multiple effects at + /// one time. If there are any conflicting effects, the + /// printer has final say on the defined behavior. + /// + /// Font effect to apply + void AddEffect(FontEffects effect); + + /// + /// Remove effect from the active effect list. If effect + /// is not currently in the list of active effects, nothing + /// will happen. + /// + /// Effect to remove + void RemoveEffect(FontEffects effect); + + /// + /// Remove all effects immediately. Only applies + /// to data that has not yet been transmitted. + /// + void ClearAllEffects(); + + /// + /// Apply a font width and height scalar + /// + /// Width scalar as multiplier + /// Heigh scalar as multiplier + void SetFontScalar(FontWidthScalar w, FontHeighScalar h); + + /// + /// Print str as ASCII text. + /// + /// + void PrintASCIIString(string str); + + /// + /// Emit one newline character and return print + /// position to start of line. + /// + void PrintNewline(); + + /// + /// Send raw buffer to target printer. + /// + /// + void SendRaw(byte[] raw); + } +} diff --git a/RelianceTalk/ISerialConnection.cs b/RelianceTalk/ISerialConnection.cs index 97dae3f..19e1d6e 100644 --- a/RelianceTalk/ISerialConnection.cs +++ b/RelianceTalk/ISerialConnection.cs @@ -26,7 +26,7 @@ namespace RelianceTalk /// /// Contract for all serialized connection types /// - public interface ISerialConnection + public interface ISerialConnection : System.IDisposable { /// /// Attempts to open serial device for communication. Returns @@ -46,15 +46,35 @@ public interface ISerialConnection /// Gets or Sets the name that uniquely identifies this serial /// device to the system /// - string Name { get; set; } + string Name { get; } /// - /// Transmits payload and returns response. The implementation - /// of this class is responsible for any payload packaging, - /// checksums, etc. + /// Gets or Sets the read timeout in milliseconds + /// + int ReadTimeoutMS { get; set; } + + /// + /// Gets or Sets the write timeout in milliseconds + /// + int WriteTimeoutMS { get; set; } + + /// + /// Transmits payload to targets and returns count of + /// bytes that were written. The write operation will return + /// once all bytes or written or if the period defined by + /// WriteTimeoutMS expires. /// /// Data to send - /// 0 or more bytes response data - byte[] Write(byte[] payload); + /// Count of bytes written + int Write(byte[] payload); + + /// + /// Read and return n count of bytes. This function + /// will return once n bytes are received or ReadTimeoutMS + /// has expired. + /// + /// count of bytes to read + /// bytes read + byte[] Read(int n); } } diff --git a/RelianceTalk/RealTimeStatus.cs b/RelianceTalk/Reliance/RealTimeStatus.cs similarity index 100% rename from RelianceTalk/RealTimeStatus.cs rename to RelianceTalk/Reliance/RealTimeStatus.cs diff --git a/RelianceTalk/Reliance/RelianceConnection.cs b/RelianceTalk/Reliance/RelianceConnection.cs new file mode 100644 index 0000000..817ee8b --- /dev/null +++ b/RelianceTalk/Reliance/RelianceConnection.cs @@ -0,0 +1,241 @@ +namespace RelianceTalk +{ + using System; + using System.IO.Ports; + using System.Runtime.InteropServices; + + /// + /// Reliance serial port implementation + /// + class RelianceConnection : ISerialConnection + { + #region Default SerialPort Params + const int DefaultBaudRate = 19200; + const int DefaultDatabits = 8; + const Parity DefaultParity = Parity.None; + const StopBits DefaultStopbits = StopBits.One; + const Handshake DefaultHandshake = Handshake.None; + #endregion + + #region Fields + private readonly SerialPort _mPort; + private int _mReadTimeout; + private int _mWriteTimeout; + #endregion + + #region Constructor + public RelianceConnection(string portName) + : this(portName, DefaultBaudRate) + { } + + public RelianceConnection(string portName, int baud) + : this(portName, baud, DefaultDatabits, DefaultParity, DefaultStopbits, DefaultHandshake) + { } + + public RelianceConnection(string portName, + int baud, + int databits, + Parity parity, + StopBits stopbits, + Handshake handshake) + { + Name = portName; + + _mPort = new SerialPort(portName, baud, parity, databits, stopbits); + _mPort.Encoding = System.Text.Encoding.GetEncoding("Windows-1252"); + _mPort.Handshake = handshake; + _mPort.WriteTimeout = _mWriteTimeout = 500; + _mPort.ReadTimeout = _mReadTimeout = 500; + } + #endregion + + #region Properties + /// + /// Gets the serial port name for this connection + /// + public string Name { get; private set; } + + /// + /// Gets or Sets the read timeout in milliseconds + /// + public int ReadTimeoutMS + { + get { return _mReadTimeout; } + set + { + _mReadTimeout = value; + _mPort.ReadTimeout = value; + } + } + + /// + /// Gets or Sets the write timeout in milliseconds + /// + public int WriteTimeoutMS + { + get { return _mWriteTimeout; } + set + { + _mWriteTimeout = value; + _mPort.WriteTimeout = value; + } + } + + #endregion + + public ReturnCode Open() + { + if (_mPort.IsOpen) return ReturnCode.Success; + + try + { + _mPort.Open(); + return ReturnCode.Success; + } + catch(System.IO.IOException) + { + return ReturnCode.ConnectionNotFound; + } + catch(System.AccessViolationException) + { + return ReturnCode.ConnectionAlreadyOpen; + } + } + + public ReturnCode Close() + { + if (!_mPort.IsOpen) return ReturnCode.Success; + + try + { + _mPort.Close(); + return ReturnCode.Success; + } + catch + { + return ReturnCode.ExecutionFailure; + } + } + + + public int Write(byte[] payload) + { + return WritePort(payload); + } + + public byte[] Read(int n) + { + return ReadPort(n); + } + + public void Dispose() + { + if(_mPort != null) + { + Close(); + _mPort.Dispose(); + } + } + + + /// + /// Write raw data to printer through its Windows print handle + /// + /// buffer to send + /// Return code + public static ReturnCode WritePrinter(string printerName, byte[] data) + { + // Gotta get a pointer on the local heap. Fun fact, the naming suggests that + // this would be on the stack but it isn't. Windows no longer has a global heap + // per se so these naming conventions are legacy cruft. + IntPtr ptr = Marshal.AllocHGlobal(data.Length); + Marshal.Copy(data, 0, ptr, data.Length); + + + bool result = RawPrinterHelper.SendBytesToPrinter(printerName, ptr, data.Length); + + Marshal.FreeHGlobal(ptr); + + return result ? ReturnCode.Success : ReturnCode.ExecutionFailure; + } + /// + /// Reads count bytes from printer + /// + /// Win32 printer name + /// Count of bytes to read + /// Response data + public static byte[] ReadPrinter(string printerName, int count) + { + Int32 dwCount = count; + IntPtr pBytes = new IntPtr(dwCount); + + byte[] returnbytes = new byte[dwCount]; + pBytes = Marshal.AllocCoTaskMem(dwCount); + bool success = RawPrinterHelper.ReadFromPrinter(printerName, pBytes, dwCount); + if (success) + { + Marshal.Copy(returnbytes, 0, pBytes, dwCount); + } + else + { + returnbytes = new byte[0]; + } + + return returnbytes; + } + + #region Private + /// + /// Writes data to the printer serial port + /// + /// Data to send + /// Number of bytes written + private int WritePort(byte[] data) + { + try + { + _mPort.Write(data, 0, data.Length); + + return data.Length; + } + catch + { + return 0; + } + } + + /// + /// Reads count bytes from serial port. If count bytes are unavailable, this + /// function will block until the read times out. If there is an exception or + /// not all expected data is received, an empty buffer will be returned. + /// + /// Number of bytes to read from port. + /// Bytes read from port. + private byte[] ReadPort(int count) + { + + byte[] buff = new byte[count]; + + try + { + + // Attempt to read count bytes + var read = _mPort.Read(buff, 0, count); + + // If we don't get enough, reset buffer to 0 length + if (read != count) + { + buff = new byte[0]; + } + + } + catch + { + buff = new byte[0]; + } + + return buff; + } + #endregion + } +} diff --git a/RelianceTalk/ReliancePrinter.cs b/RelianceTalk/Reliance/ReliancePrinter.cs similarity index 60% rename from RelianceTalk/ReliancePrinter.cs rename to RelianceTalk/Reliance/ReliancePrinter.cs index a7e1e05..42a9b58 100644 --- a/RelianceTalk/ReliancePrinter.cs +++ b/RelianceTalk/Reliance/ReliancePrinter.cs @@ -35,15 +35,12 @@ namespace RelianceTalk /// /// Reliance Printer is the primary handle for accessing the printer API /// - public class ReliancePrinter + public class ReliancePrinter : IPrinter { - const int DefaultReadTimeout = 2000; /// ms + const int DefaultReadTimeout = 1000; /// ms const int DefaultBaudRate = 19200; - - private readonly SerialPort mSerialPort; - /// /// Constructs a new instance of ReliancePrinter. This printer /// acts as a handle to all features and functions @@ -69,10 +66,9 @@ public ReliancePrinter(string printerName, string serialPortName) { PrintSerialReadTimeout = DefaultReadTimeout; PrintSerialBaudRate = DefaultBaudRate; - PrintSerialPortName = serialPortName; - mSerialPort = MakePort(PrintSerialPortName, PrintSerialBaudRate, PrintSerialReadTimeout); - mSerialPort.Open(); + Connection = new RelianceConnection(serialPortName, PrintSerialBaudRate); + Connection.ReadTimeoutMS = DefaultReadTimeout; } } @@ -81,23 +77,20 @@ public ReliancePrinter(string printerName, string serialPortName) /// ~ReliancePrinter() { - if (mSerialPort != null) + if (Connection != null) { - mSerialPort.Close(); - mSerialPort.Dispose(); + Connection.Dispose(); } } + + public ISerialConnection Connection { get; set; } + /// /// Gets or replaces the name this printer was constructed with /// public string PrinterName { get; set; } - /// - /// Gets or sets the serial port associated with this printer. - /// - public string PrintSerialPortName { get; set; } - /// /// Gets or sets the read timeout in milliseconds /// @@ -114,38 +107,45 @@ public ReliancePrinter(string printerName, string serialPortName) /// If there is no response or an invalid response, all fields of RealTimeStatus will be null. /// /// StatusRequest type - /// Instance of RealTimeStatus. Unset fields will be null + /// Instance of RealTimeStatus,m null on failure, Unset fields will be null public RealTimeStatus GetStatus(StatusRequests r) { // Result stored here - var rts = new RealTimeStatus(); + RealTimeStatus rts = null; // Send the real time status command, r is the argument var command = new byte[] { 0x10, 0x04, (byte)r }; int respLen = (r == StatusRequests.FullStatus) ? 6 : 1; var data = new byte[0]; - if (mSerialPort == null) - { - WritePrinter(command); - data = ReadPrinter(respLen); - } - else + try { - var written = WritePort(command); + Connection.Open(); - // Collect the response - data = ReadPort(respLen); - } + var written = Connection.Write(command); + System.Threading.Thread.Sleep(250); + // Collect the response + data = Connection.Read(respLen); + + } + catch + { } + finally + { + Connection.Close(); + } + // Invalid response if(data.Length != respLen) { return rts; } + rts = new RealTimeStatus(); + switch(r) { case StatusRequests.Status: @@ -224,128 +224,43 @@ public RealTimeStatus GetStatus(StatusRequests r) return rts; } - /// - /// Common print hanlder for printing raw data bytes - /// - /// - private void WritePrinter(byte[] data) - { - // Gotta get a pointer on the local heap. Fun fact, the naming suggests that - // this would be on the stack but it isn't. Windows no longer has a global heap - // per se so these naming conventions are legacy cruft. - IntPtr ptr = Marshal.AllocHGlobal(data.Length); - Marshal.Copy(data, 0, ptr, data.Length); - RawPrinterHelper.SendBytesToPrinter(PrinterName, ptr, data.Length); + - Marshal.FreeHGlobal(ptr); + public void AddEffect(FontEffects effect) + { + throw new NotImplementedException(); } - private byte[] ReadPrinter(int count) + public void RemoveEffect(FontEffects effect) { - Int32 dwCount = count; - IntPtr pBytes = new IntPtr(dwCount); - - byte[] returnbytes = new byte[dwCount]; - pBytes = Marshal.AllocCoTaskMem(dwCount); - bool success = RawPrinterHelper.ReadFromPrinter(PrinterName, pBytes, dwCount); - if (success) - { - Marshal.Copy(returnbytes, 0, pBytes, dwCount); - } - else - { - returnbytes = new byte[0]; - } - - return returnbytes; + throw new NotImplementedException(); } - /// - /// Writes data to the printer serial port - /// - /// Data to send - /// Number of bytes written - private int WritePort(byte[] data) + public void ClearAllEffects() { - try - { - // Dump anything not already processed - mSerialPort.DiscardInBuffer(); - mSerialPort.DiscardOutBuffer(); - - mSerialPort.Write(data, 0, data.Length); - return data.Length; - } - catch - { } - - - return 0; + throw new NotImplementedException(); } - /// - /// Reads count bytes from serial port. If count bytes are unavailable, this - /// function will block until the read times out. If there is an exception or - /// not all expected data is received, an empty buffer will be returned. - /// - /// Number of bytes to read from port. - /// Bytes read from port. - private byte[] ReadPort(int count) + public void SetFontScalar(FontWidthScalar w, FontHeighScalar h) { - - var buff = new byte[count]; - - try - { - // Give a slight delay to allow the buffer time to more fully fill up - System.Threading.Thread.Sleep(100); - - // Attempt to read count bytes - var read = mSerialPort.Read(buff, 0, count); - - // If we don't get enough, reset buffer to 0 length - if (read != count) - { - buff = new byte[0]; - } - } - catch - { - buff = new byte[0]; - } + throw new NotImplementedException(); + } - return buff; + public void PrintASCIIString(string str) + { + throw new NotImplementedException(); } - /// - /// Create a new serial port using 8 databits, no parity, 1 stop bit. - /// - /// OS name of port - /// Valid baud rate - /// Time in milliseconds to await buffer to contain data - /// - private static SerialPort MakePort(string portName, int baudrate, int readTimeout) + public void PrintNewline() { + throw new NotImplementedException(); + } - System.Text.Encoding W1252 = System.Text.Encoding.GetEncoding("Windows-1252"); - - var port = new SerialPort(); - port.BaudRate = baudrate; - port.Parity = Parity.None; - port.DataBits = 8; - port.StopBits = StopBits.One; - port.Handshake = Handshake.None; - port.ReadTimeout = readTimeout; - port.WriteTimeout = 500; - port.Encoding = W1252; - port.DtrEnable = true; - port.RtsEnable = true; - port.DiscardNull = false; - port.PortName = portName; - - return port; + public void SendRaw(byte[] raw) + { + throw new NotImplementedException(); } } } diff --git a/RelianceTalk/RelianceTalk.csproj b/RelianceTalk/RelianceTalk.csproj index 07a4b9d..44bf5cc 100644 --- a/RelianceTalk/RelianceTalk.csproj +++ b/RelianceTalk/RelianceTalk.csproj @@ -36,14 +36,18 @@ - + + + - - + + + + - - + + + + + + + + + diff --git a/ThermalConsole/Program.cs b/ThermalConsole/Program.cs new file mode 100644 index 0000000..5f86956 --- /dev/null +++ b/ThermalConsole/Program.cs @@ -0,0 +1,57 @@ + +using System; +using System.IO; +using System.Threading; +using ThermalTalk; +using ThermalTalk.Imaging; + +namespace ThermalConsole +{ + class Program + { + static void Main(string[] args) + { + const string commport = "COM1"; + const string imgpath = @"C:\temp\security_sample.png"; + const string imgescbin = @"C:\temp\security_sample.bin"; + + const int captureRate = 10; // number of seconds between capture + + Console.WriteLine("Starting Security Cam Sample"); + + int count = 1; + while (true) + { + using (var printer = new ReliancePrinter(commport)) + using(var image = ThermalTalk.Imaging.Webcam.GrabPicture()) + { + image.Save(imgpath); + Console.WriteLine("Image #{0} taken at {1}", count, DateTime.Now); + + using(var logo = new BasePrintLogo(imgpath, 640, 480)) + { + logo.ApplyDithering(Algorithms.JarvisJudiceNinke, 128); + logo.ExportLogoEscPos(imgescbin); + + logo.ExportLogo(@"C:\temp\dither.png"); + + var raw = File.ReadAllBytes(imgescbin); + + printer.PrintASCIIString(string.Format("Capture #{0}", count++)); + printer.PrintNewline(); + + Thread.Sleep(5); + + printer.SendRaw(raw); + printer.FormFeed(); + + + Thread.Sleep(captureRate * 1000); + } + } + + + } + } + } +} diff --git a/ThermalConsole/Properties/AssemblyInfo.cs b/ThermalConsole/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..3f86537 --- /dev/null +++ b/ThermalConsole/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ThermalConsole")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ThermalConsole")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("eb1a65da-d6c1-4bd7-99d3-1ef1c2a4ff58")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ThermalConsole/ThermalConsole.csproj b/ThermalConsole/ThermalConsole.csproj new file mode 100644 index 0000000..64d6230 --- /dev/null +++ b/ThermalConsole/ThermalConsole.csproj @@ -0,0 +1,127 @@ + + + + + + Debug + AnyCPU + {CCB36955-595F-4003-81CB-D7A3121B67D9} + Exe + Properties + ThermalConsole + ThermalConsole + v4.5 + 512 + ea0fca84 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + prompt + MinimumRecommendedRules.ruleset + true + true + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + prompt + MinimumRecommendedRules.ruleset + true + + + + ..\packages\EmguCV.3.1.0.1\lib\net30\Emgu.CV.UI.dll + True + + + ..\packages\EmguCV.3.1.0.1\lib\net30\Emgu.CV.UI.GL.dll + True + + + ..\packages\EmguCV.3.1.0.1\lib\net30\Emgu.CV.World.dll + True + + + ..\packages\OpenTK.1.1.2225.0\lib\net20\OpenTK.dll + True + + + ..\packages\OpenTK.GLControl.1.1.2225.0\lib\net20\OpenTK.GLControl.dll + True + + + + + + + + + + + + ..\packages\ZedGraph.5.1.5\lib\ZedGraph.dll + True + + + + + + + + + + + + + + {5440263f-5089-4050-9689-b2060192707e} + ThermalTalk.Imaging + + + {1c8b96d3-e723-4b9c-8884-3449c26384fb} + ThermalTalk + + + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + \ No newline at end of file diff --git a/ThermalConsole/packages.config b/ThermalConsole/packages.config new file mode 100644 index 0000000..af5879b --- /dev/null +++ b/ThermalConsole/packages.config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/ThermalTalk.Imaging.Test/Properties/AssemblyInfo.cs b/ThermalTalk.Imaging.Test/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..acf030e --- /dev/null +++ b/ThermalTalk.Imaging.Test/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ThermalTalk.Imaging.Test")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("nunit.tests")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ThermalTalk.Imaging.Test/TestClass.cs b/ThermalTalk.Imaging.Test/TestClass.cs new file mode 100644 index 0000000..54c90ed --- /dev/null +++ b/ThermalTalk.Imaging.Test/TestClass.cs @@ -0,0 +1,14 @@ +using NUnit.Framework; + +namespace ThermalTalk.Imaging.Test +{ + [TestFixture] + public class TestClass + { + [Test] + public void TestMethod() + { + + } + } +} diff --git a/ThermalTalk.Imaging.Test/ThermalTalk.Imaging.Test.csproj b/ThermalTalk.Imaging.Test/ThermalTalk.Imaging.Test.csproj new file mode 100644 index 0000000..d28066c --- /dev/null +++ b/ThermalTalk.Imaging.Test/ThermalTalk.Imaging.Test.csproj @@ -0,0 +1,82 @@ + + + + + Debug + AnyCPU + {56E7C431-933E-409E-AA4A-156C3790C6B5} + Library + Properties + ThermalTalk.Imaging.Test + ThermalTalk.Imaging.Test + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + prompt + MinimumRecommendedRules.ruleset + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + prompt + MinimumRecommendedRules.ruleset + + + + ..\packages\NUnit.3.6.1\lib\net45\nunit.framework.dll + True + + + + + + + + + + + + + + {5440263f-5089-4050-9689-b2060192707e} + ThermalTalk.Imaging + + + + + + + + \ No newline at end of file diff --git a/ThermalTalk.Imaging.Test/packages.config b/ThermalTalk.Imaging.Test/packages.config new file mode 100644 index 0000000..8e3be78 --- /dev/null +++ b/ThermalTalk.Imaging.Test/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ThermalTalk.Imaging/Algorithms.cs b/ThermalTalk.Imaging/Algorithms.cs new file mode 100644 index 0000000..cb794e8 --- /dev/null +++ b/ThermalTalk.Imaging/Algorithms.cs @@ -0,0 +1,19 @@ +namespace ThermalTalk.Imaging +{ + /// + /// List of available dithering algorithms + /// + public enum Algorithms + { + JarvisJudiceNinke, + FloydSteinberg, + Atkinson, + Stucki, + None, + FloydSteinbergFalse, + Sierra, + Sierra2, + SierraLite, + Burkes, + } +} diff --git a/ThermalTalk.Imaging/BasePrintLogo.cs b/ThermalTalk.Imaging/BasePrintLogo.cs new file mode 100644 index 0000000..8c8a932 --- /dev/null +++ b/ThermalTalk.Imaging/BasePrintLogo.cs @@ -0,0 +1,338 @@ +namespace ThermalTalk.Imaging +{ + using System; + using System.Collections.Generic; + using System.Drawing; + using System.Drawing.Imaging; + using System.IO; + using System.Windows.Media.Imaging; + + public class BasePrintLogo : IDisposable, ThermalTalk.Imaging.IPrintLogo + { + /// + /// Construct a new logo from source image and scale to ratio. + /// Set maxWidthPixels to 0 for full size (no change). + /// + /// String path to file. Supports all image formats. + /// Maximum width in pixels to enforce. 0 to ignore. + /// Maximum height in pixels to engore. 0 to ignore. + public BasePrintLogo(string sourcePath, int maxWidth = 0, int maxHeight = 0, int forceWidth = 0) + { + if (string.IsNullOrEmpty(sourcePath)) + { + throw new ArgumentException("sourcePath must be a non-empty string."); + } + + // MaxWidth must always be byte aligned (units are in pixels) + MaxWidth = maxWidth.RoundUp(8); + MaxHeight = maxHeight; + ForceWidth = forceWidth; + + SetImageData(sourcePath); + } + + #region Properties + /// + /// Temporary path for this logo that is used to avoid heap allocating + /// a buffer just to pass into libcore. + /// + public string TransmitPath { get; set; } + + /// + /// CRC of logo in transmit mode + /// + public uint TransmitCRC { get; set; } + + /// + /// Gets the raw image data + /// + /// Private access, use SetImageData + public BitmapImage ImageData { get; private set; } + + /// + /// Gets the dimensions for the current state of the image + /// + public LogoSize Dimensions { get; private set; } + + /// + /// Gets the ideal width of this image. The ideal + /// width is the scaled width set at instantiation time. + /// + public int IdealWidth { get; private set; } + + /// + /// Gets the ideal height of this image. The ideal + /// height is the scaled height set at instantiation time. + /// + public int IdealHeight { get; private set; } + + /// + /// Gets the enforced max width. Set to 0 to ignore. + /// + public int MaxHeight { get; private set; } + + /// + /// Gets the enforced max height. Set to 0 to ignore. + /// + public int MaxWidth { get; private set; } + + /// + /// Gets the width to force. Image will be scaled up or down to meet + /// this requirement. 0 to ignore. + /// + public int ForceWidth { get; private set; } + + /// + /// Returns true if this image is inverted + /// + public bool IsInverted { get; private set; } + #endregion + + public void ApplyDithering(Algorithms algorithm, byte threshhold) + { + // Create an instance of the specified dithering algorithm + var algo = (Algorithms)algorithm; + var halftoneProcessor = DitherFactory.GetDitherer(algo, threshhold); + + var bitmap = ImageData.ToBitmap(); + + // The big grind + var dithered = halftoneProcessor.GenerateDithered(bitmap); + + // Update ImageData with dithered result + SetImageData(dithered); + + // For Phoenix we don't care about size of logo in flash. Everything is static. + Dimensions.SizeInBytes = dithered.ToLogoBuffer().Length; + Dimensions.SizeInBytesOnFlash = Dimensions.SizeInBytes; + } + + /// + /// Apply color inversion to this image. Inversion is relative to the source + /// image. The image begins in the non-inverted state. Calling ApplyColorInversion + /// once wil put this image in the reverted state. Calling it twice will return it to + /// the non-inverted state, etc. + /// + public void ApplyColorInversion() + { + IsInverted = !IsInverted; + var bitmap = ImageData.ToBitmap(); + bitmap.InvertColorChannels(); + SetImageData(bitmap); + } + + /// + /// Save the current state of this logo as a bitmap at the specified path + /// + /// Output path + public void ExportLogo(string outpath) + { + ImageData.ToBitmap().Save(outpath); + } + + /// + /// Export the current state of this logo as a binary file at the specific path + /// + /// Outpuat path + public void ExportLogoBin(string outpath) + { + // Append the bitmap data as a packed dot logo + var bmpData = ImageData.ToBitmap().ToLogoBuffer(); + + // Write to file + File.WriteAllBytes(outpath, bmpData); + } + + /// + /// Export the current state of this logo as a binary file, wrapped in the 1D 76 + /// ESC/POS bitmap command. + /// + /// + public void ExportLogoEscPos(string outpath) + { + // Build up the ESC/POS 1D 76 30 command + var buffer = new List(); + buffer.Add(0x1D); + buffer.Add(0x76); + buffer.Add(0x30); + + // Normal width for now + buffer.Add(0x00); + + // Get correct dimensions + var w = Dimensions.WidthBytes; + var h = Dimensions.Height; + + // https://goo.gl/FFdiZl + // Calculate xL and xH + var xH = (byte)(w / 256); + var xL = (byte)(w - (xH * 256)); + + // Calculate yL and yH + var yH = (byte)(h / 256); + var yL = (byte)(h - (yH * 256)); + + // Pack up these dimensions + buffer.Add(xL); + buffer.Add(xH); + buffer.Add(yL); + buffer.Add(yH); + + // Append the bitmap data as a packed dot logo + var bmpData = ImageData.ToBitmap().ToLogoBuffer(); + buffer.AddRange(bmpData); + + // Write to file + File.WriteAllBytes(outpath, buffer.ToArray()); + } + + /// + /// Returns this logo encoded as a bitmap + /// + /// + public string AsBase64String() + { + using(var bitmap = ImageData.ToBitmap()) + { + return bitmap.ToBase64String(); + } + } + + /// + /// Set the bitmap data from an encoded base64 string + /// + /// Base64 encoded string + public void FromBase64String(string base64) + { + using(Bitmap bitmap = ImageExt.FromBase64String(base64)) + { + SetImageData(bitmap); + } + } + + /// + /// Opens image located at sourcepath. Scales image down to MaxWidth if required. + /// Images smaller than MaxWidth will not be scaled up. Result is stored in ImageData field. + /// Final result CRC is calculated and assigned to CRC32 field. + /// + /// String path to source image + private void SetImageData(string sourcePath) + { + + using (Bitmap bitmap = (Bitmap)Image.FromFile(sourcePath)) + { + // extract dimensions + var actualWidth = bitmap.Width; + var actualHeight = bitmap.Height; + + + // Adjust width if needed + if(ForceWidth != 0 && actualWidth != ForceWidth) + { + IdealWidth = ForceWidth; + } + else if (MaxWidth != 0 && MaxWidth < actualWidth) + { + IdealWidth = MaxWidth; + } + else + { + IdealWidth = actualWidth; + } + + + // Limit height if needed + if (MaxHeight != 0 && MaxHeight < actualHeight) + { + IdealHeight = MaxHeight; + } + else + { + IdealHeight = actualHeight; + } + + // First, scale width to ideal size + if (actualWidth > IdealWidth) + { + // Scale down + float factor = (float)IdealWidth / (float)actualWidth; + actualWidth = (int)(factor * actualWidth); + actualHeight = (int)(factor * actualHeight); + } + else if (actualWidth < IdealWidth) + { + // Scale up + float factor = (float)IdealWidth / (float)actualWidth; + actualWidth = (int)(factor * actualWidth); + actualHeight = (int)(factor * actualHeight); + } + else + { + // Width need not be scaled + } + + + // Second scale height -- down only + // and don't touch the width, just cut it off + if (actualHeight > IdealHeight) + { + // Scale down + float factor = (float)IdealHeight / (float)actualHeight; + actualHeight = (int)(factor * actualHeight); + } + + + // Ensure that whatever width we have is byte aligned + if (actualWidth % 8 != 0) + { + actualWidth = actualWidth.RoundUp(8); + } + + // Ensure that our width property matches the final scaled width + IdealWidth = actualWidth; + IdealHeight = actualHeight; + + using (Bitmap resized = new Bitmap(bitmap, new Size(IdealWidth, IdealHeight))) + { + SetImageData(resized); + } + } + } + + /// + /// Opens image located at sourcepath. Scales image down to MaxWidth if required. + /// Images smaller than MaxWidth will not be scaled up. Result is stored in ImageData field. + /// + /// String path to source image> + private void SetImageData(Bitmap bitmap) + { + // Extract dimension info + Dimensions = new LogoSize(); + Dimensions.Height = bitmap.Height; + Dimensions.WidthDots = bitmap.Width; + Dimensions.WidthBytes = (int)Math.Ceiling((double)Dimensions.WidthDots / 8); + Dimensions.SizeInBytes = bitmap.Height * bitmap.Width; + Dimensions.SizeInBytesOnFlash = Dimensions.SizeInBytes; + + using (var memory = new MemoryStream()) + { + bitmap.Save(memory, ImageFormat.Png); + memory.Position = 0; + + ImageData = new BitmapImage(); + ImageData.BeginInit(); + ImageData.StreamSource = memory; + ImageData.CacheOption = BitmapCacheOption.OnLoad; + ImageData.EndInit(); + } + } + + public void Dispose() + { + if(ImageData != null) + { + ImageData.StreamSource.Close(); + } + } + } +} diff --git a/ThermalTalk.Imaging/Constants.cs b/ThermalTalk.Imaging/Constants.cs new file mode 100644 index 0000000..8fe0fa3 --- /dev/null +++ b/ThermalTalk.Imaging/Constants.cs @@ -0,0 +1,16 @@ +namespace ThermalTalk.Imaging +{ + public static class Constants + { + /// + /// File filter for every support image type + /// + public static readonly string ImageFileFilter = "All Images (*.emf;*.wmf;*.jpg;*.jpeg;*.jfif;*.jpe;*.png;*.bmp;*.dib;*" + + ".rle;*.gif;*.tif;*.tiff)|*.emf;*.wmf;*.jpg;*.jpeg;*.jfif;*.jpe;*.png;" + + "*.bmp;*.dib;*.rle;*.gif;*.tif;*.tiff|Windows Enhanced Metafile (*.emf)|" + + "*.emf|Windows Metafile (*.wmf)|*.wmf|JPEG File Interchange Format (*.jpg;" + + "*.jpeg;*.jfif;*.jpe)|*.jpg;*.jpeg;*.jfif;*.jpe|Portable Networks Graphic (*.png)|" + + "*.png|Windows Bitmap (*.bmp;*.dib;*.rle)|*.bmp;*.dib;*.rle|Graphics Interchange Format (*.gif)|" + + "*.gif|Tagged Image File Format (*.tif;*.tiff)|*.tif;*.tiff|All files (*.*)|*.*"; + } +} diff --git a/ThermalTalk.Imaging/Dither.cs b/ThermalTalk.Imaging/Dither.cs new file mode 100644 index 0000000..1e03c0d --- /dev/null +++ b/ThermalTalk.Imaging/Dither.cs @@ -0,0 +1,295 @@ +namespace ThermalTalk.Imaging +{ + using System; + using System.Collections.Generic; + using System.Drawing; + using System.Drawing.Imaging; + using System.Runtime.InteropServices; + + public interface IDitherable + { + /// + /// Number of rows in algorithm matrix + /// + int RowCount { get; } + + /// + /// Numbers of columns in algorithm matrix + /// + int ColCount { get; } + + /// + /// Algorithm's divisor + /// + int Divisor { get; } + + /// + /// Black or white threshold limit + /// + byte Threshold { get; } + + /// + /// Generates a new, dithered version of the input bitmap using the configured + /// algorithm parameters. + /// + /// Input bitmap + /// + Bitmap GenerateDithered(Bitmap input); + } + + /// + /// Base dithering class + /// + internal class Dither : IDitherable + { + // + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", + "CA1814:PreferJaggedArraysOverMultidimensional", MessageId = "Member")] + private readonly byte[,] _mMatrixPattern; + private readonly bool _mCanShift; + private readonly int _mMatrixOffset; + + /// + /// Creates an instance of this dithering class + /// + /// algorithm in matrix form + /// algorithm divisor + /// threshhold threshold at which a pixel is considered 'black' + public Dither(byte[,] matrixPattern, int divisor, byte threshold, bool shift=false) + { + if (matrixPattern == null) + throw new ArgumentNullException("matrixPattern must not be null"); + + if (divisor == 0) + throw new ArgumentException("divisor must be non-zero"); + + _mMatrixPattern = matrixPattern; + RowCount = matrixPattern.GetUpperBound(0) + 1; + ColCount = matrixPattern.GetUpperBound(1) + 1; + + Divisor = divisor; + Threshold = threshold; + + _mCanShift = shift; + + // Find first non-zero coefficient column in matrix. This value must + // always be in the first row of the matrix + for (int i = 0; i < ColCount; i++) + { + if (matrixPattern[0, i] != 0) + { + _mMatrixOffset = (byte)(i - 1); + break; + } + } + } + + /// + /// Number of rows in algorithm matrix + /// + public int RowCount { get; private set; } + + /// + /// Numbers of columns in algorithm matrix + /// + public int ColCount { get; private set; } + + /// + /// Algorithm's divisor + /// + public int Divisor { get; private set; } + + /// + /// Black or white threshold limit + /// + public byte Threshold { get; private set; } + + /// + /// Create a copy of this bitmap with a dithering algorithm applied + /// + /// Input bitmap + /// New, dithered bitmap + public virtual Bitmap GenerateDithered(Bitmap bitmap) + { + var bmpBuff = bitmap.ToBuffer(); + var pixels = new List(); + + // Convert all bytes into pixels + foreach(var pix in bmpBuff.Split(4)) + { + pixels.Add(new Pixel(pix)); + } + + // Dither away + for (int x = 0; x < bitmap.Height; x++) + { + for (int y = 0; y < bitmap.Width; y++) + { + var index = x * bitmap.Width + y; + var colored = pixels[index]; + var grayed = ApplyGrayscale(colored); + pixels[index] = grayed; + + ApplySmoothing(pixels, colored, grayed, y, x, bitmap.Width, bitmap.Height); + } + } + + // Dump results into output + var output = new byte[pixels.Count << 2]; + var j = 0; + for (var i = 0; i < pixels.Count; i++) + { + var p = pixels[i]; + output[j++] = p.B; + output[j++] = p.G; + output[j++] = p.R; + + // RT-15 - force alpha to be 0xFF because in optimized mode, + // the .NET client may send strange bitmap data. + output[j++] = 0xFF; + } + + return output.AsBitmap(bitmap.Width, bitmap.Height); + } + + /// + /// Apply grayscale to this pixel and return result + /// + /// Pixel to transform + /// color reduced (grayscale) pixel + protected virtual Pixel ApplyGrayscale(Pixel pix) + { + // Magic numbers for converting RGB to monochrome space. These achieve a balanced grayscale + byte grayPoint = (byte)(0.299 * pix.R + 0.587 * pix.G + 0.114 * pix.B); + + // Do not alter the alpha channel, otherwise the entire image may go opaque + Pixel grayed; + grayed.A = pix.A; + + if (grayPoint < Threshold) + { + grayed.R = grayed.G = grayed.B = 0; + } + else + { + grayed.R = grayed.G = grayed.B = 255; + } + + return grayed; + } + + /// + /// Apply Dithering algorithm + /// + /// image in row-major order to dither against + /// Pixel source + /// Pixel source + /// column position of Pixel + /// y row position of Pixel + /// width of imageData + /// height of imageData + protected virtual void ApplySmoothing( + IList imageData, + Pixel colored, + Pixel grayed, + int x, + int y, + int width, + int height) + { + int redError = colored.R - grayed.R; + int blueError = colored.G - grayed.G; + int greenError = colored.B - grayed.B; + + for (int row = 0; row < RowCount; row++) + { + // Convert row to row-major index + int ypos = y + row; + + for (int col = 0; col < ColCount; col++) + { + int coefficient = _mMatrixPattern[row, col]; + + // Convert col to row-major index + int xpos = x + (col - _mMatrixOffset); + + // Do not process outside of image, 1st row/col, or if pixel is 0 + if (coefficient != 0 && + xpos > 0 && + xpos < width && + ypos > 0 && + ypos < height) + { + int offset = ypos * width + xpos; + Pixel dithered = imageData[offset]; + + int newR, newG, newB; + + // Calculate the dither effect on each color channel + if (_mCanShift) + { + newR = (redError * coefficient) >> Divisor; + newG = (greenError * coefficient) >> Divisor; + newB = (blueError * coefficient) >> Divisor; + } + else + { + newR = (redError * coefficient) / Divisor; + newG = (greenError * coefficient) / Divisor; + newB = (blueError * coefficient) / Divisor; + } + + // Be sure not to overflow + dithered.R = safe_tobyte(dithered.R + newR); + dithered.G = safe_tobyte(dithered.G + newG); + dithered.B = safe_tobyte(dithered.B + newB); + + // Apply new color + imageData[offset] = dithered; + } + } + } + } + + /// + /// Returns a integer as a byte and handle any over/underflow + /// + /// int + /// byte + private static byte safe_tobyte(int val) + { + if (val < 0) + { + val = 0; + } + else if (val > 255) + { + val = 255; + } + return (byte)val; + } + } + + /// + /// One bpp converts the image to a 1 bit per pixel image + /// + internal class OneBPP : Dither + { + public OneBPP(byte threshold) + : base(new byte[,] { { 0 }}, 1, threshold) + { } + + /// + /// Override returns a 1bpp copy of the input bitmap + /// + /// + /// + public override Bitmap GenerateDithered(Bitmap bitmap) + { + var rectangle = new Rectangle(0, 0, bitmap.Width, bitmap.Height); + return bitmap.Clone(rectangle, PixelFormat.Format1bppIndexed); + } + } + + +} diff --git a/ThermalTalk.Imaging/DitherFactory.cs b/ThermalTalk.Imaging/DitherFactory.cs new file mode 100644 index 0000000..0a0e26e --- /dev/null +++ b/ThermalTalk.Imaging/DitherFactory.cs @@ -0,0 +1,86 @@ +namespace ThermalTalk.Imaging +{ + public static class DitherFactory + { + // We do not use jagged arrays because I feel that syntax of multi-dimensional + // arrays is easier to work with + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", + "CA1814:PreferJaggedArraysOverMultidimensional", MessageId = "Body")] + public static IDitherable GetDitherer(Algorithms algorithm, byte threshold = 128) + { + switch(algorithm) + { + case Algorithms.Atkinson: + // 0,0,1,1,1,1,1,0,0,1,0,0 + return new Dither(new byte[,] { + {0,0,1,1}, + {1,1,1,0}, + {0,1,0,0} + }, 3, threshold, true); + + case Algorithms.Burkes: + // 0,0,0,8,4,2,4,8,4,2 + return new Dither(new byte[,] { + {0,0,0,8,4}, + {2,4,8,4,2}, + }, 5, threshold, true); + + case Algorithms.FloydSteinberg: + // 0,0,7,3,5,1 + return new Dither(new byte[,] { + {0,0,7}, + {3,5,1}, + }, 4, threshold, true); + + case Algorithms.FloydSteinbergFalse: + // 0,3,3,2 + return new Dither(new byte[,] { + {0,3}, + {3,2}, + }, 3, threshold, true); + + case Algorithms.JarvisJudiceNinke: + // 0,0,0,7,5,3,5,7,5,3,1,3,5,3,1 + return new Dither(new byte[,] { + {0,0,0,7,5}, + {3,5,7,5,3}, + {1,3,5,3,1} + }, 48, threshold); + + case Algorithms.Sierra: + // 0,0,0,5,3,2,4,5,4,2,0,2,3,2,0 + return new Dither(new byte[,] { + {0,0,0,5,3}, + {2,4,5,4,2}, + {0,2,3,2,0}, + }, 5, threshold, true); + + case Algorithms.Sierra2: + // 0,0,0,4,3,1,2,3,2,1 + return new Dither(new byte[,] { + {0,0,0,4,3}, + {1,2,3,2,1}, + }, 4, threshold, true); + + case Algorithms.SierraLite: + // 0,0,2,1,1,0 + return new Dither(new byte[,] { + {0,0,2}, + {1,1,0}, + }, 2, threshold, true); + + case Algorithms.Stucki: + // 0,0,0,8,4,2,4,8,4,2,1,2,4,2,1 + return new Dither(new byte[,] { + {0,0,0,8,4}, + {2,4,8,4,2}, + {1,2,4,2,1}, + }, 42, threshold); + + default: + // We need to at least make it 1bpp bitmap otherwise phoenix will have garbage. + return new OneBPP(threshold); + } + } + } +} diff --git a/ThermalTalk.Imaging/Extensions.cs b/ThermalTalk.Imaging/Extensions.cs new file mode 100644 index 0000000..d47dcf9 --- /dev/null +++ b/ThermalTalk.Imaging/Extensions.cs @@ -0,0 +1,89 @@ + +namespace ThermalTalk.Imaging +{ + using System; + using System.Collections.Generic; + + static class Extensions + { + /// + /// Split the given array into x number of smaller arrays, each of length len + /// + /// + /// + /// + /// + public static T[][] Split(this T[] arrayIn, int len) + { + bool even = arrayIn.Length % len == 0; + int totalLength = arrayIn.Length / len; + if (!even) + totalLength++; + + T[][] newArray = new T[totalLength][]; + for (int i = 0; i < totalLength; ++i) + { + int allocLength = len; + if (!even && i == totalLength - 1) + allocLength = arrayIn.Length % len; + + newArray[i] = new T[allocLength]; + Array.Copy(arrayIn, i * len, newArray[i], 0, allocLength); + } + + return newArray; + } + + /// + /// Rounds this integer to the nearest positive multiple of N + /// + /// + /// + public static int RoundUp(this int i, int N) + { + return (int)RoundUp(i, (uint)N); + } + + /// + /// Rounds this integer to the nearest positive multiple of N + /// + /// + /// + public static long RoundUp(this long i, int N) + { + return RoundUp(i, (uint)N); + } + + /// + /// Rounds this integer to the nearest positive multiple of N + /// + /// + /// + public static uint RoundUp(this uint i, int N) + { + return (uint)RoundUp(i, (uint)N); + } + + + + /// + /// Rounds this integer to the nearest positive multiple of N + /// + /// + /// + private static long RoundUp(long i, uint N) + { + if (N == 0) + { + return 0; + } + + if (i == 0) + { + return N; + } + + return (long)(Math.Ceiling(Math.Abs(i) / (double)N) * N); + } + } +} diff --git a/ThermalTalk.Imaging/IPrintLogo.cs b/ThermalTalk.Imaging/IPrintLogo.cs new file mode 100644 index 0000000..1cb2bd1 --- /dev/null +++ b/ThermalTalk.Imaging/IPrintLogo.cs @@ -0,0 +1,22 @@ +namespace ThermalTalk.Imaging +{ + using System; + + public interface IPrintLogo + { + void ApplyColorInversion(); + void ApplyDithering(Algorithms algorithm, byte threshhold); + string AsBase64String(); + LogoSize Dimensions { get; } + void Dispose(); + int ForceWidth { get; } + int IdealHeight { get; } + int IdealWidth { get; } + System.Windows.Media.Imaging.BitmapImage ImageData { get; } + bool IsInverted { get; } + int MaxHeight { get; } + int MaxWidth { get; } + uint TransmitCRC { get; set; } + string TransmitPath { get; set; } + } +} diff --git a/ThermalTalk.Imaging/ImageExt.cs b/ThermalTalk.Imaging/ImageExt.cs new file mode 100644 index 0000000..e00ac9c --- /dev/null +++ b/ThermalTalk.Imaging/ImageExt.cs @@ -0,0 +1,295 @@ +namespace ThermalTalk.Imaging +{ + using System; + using System.Collections.Generic; + using System.Drawing; + using System.Drawing.Imaging; + using System.IO; + using System.Runtime.InteropServices; + using System.Windows.Media.Imaging; + + public static class ImageExt + { + /// + /// Converts into a row-major byte array. If there is no image data + /// or the image is empty, the resulting array will be empty (zero length). + /// + /// byte[] + public static byte[] ToBuffer(this Bitmap bitmap) + { + if (bitmap == null || bitmap.Size.IsEmpty) + { + return new byte[0]; + } + + BitmapData bitmapData = null; + + // This rectangle selects the entirety of the source bitmap for locking bits into memory + var rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height); + + try + { + // Acquire a lock on the image data so we can extra into our own byte stream + // Note: Currently only supports data as 32bit, 4 channel 8-bit color + bitmapData = bitmap.LockBits( + rect, + ImageLockMode.ReadOnly, + PixelFormat.Format32bppPArgb); + + // Create the output buffer + int length = Math.Abs(bitmapData.Stride) * bitmapData.Height; + byte[] results = new byte[length]; + + // Copy from unmanaged to managed memory + IntPtr ptr = bitmapData.Scan0; + Marshal.Copy(ptr, results, 0, length); + + return results; + + } + finally + { + if (bitmapData != null) + bitmap.UnlockBits(bitmapData); + } + } + + /// + /// Converts this buffer into a 32bpp ARGB bitmap. The width and + /// height parameters must be the sum product of the imageData length. + /// You specifcy a buffer of length 1000, and a width of 10, the height + /// must be 100. + /// + /// + /// Width of resulting bitmap in bytes + /// Height of resulting bitmap in bytes + /// Bitmap instance. Be sure to dispose of it when you're done. + public static Bitmap AsBitmap(this byte[] imageData, int width, int height) + { + + Bitmap result = new Bitmap(width, height, PixelFormat.Format32bppArgb); + + // Lock the entire bitmap + BitmapData bitmapData = result.LockBits( + new Rectangle(0, 0, width, height), + ImageLockMode.ReadWrite, + PixelFormat.Format32bppArgb); + + // Since our data is provided in byte-expanded pixel mode, adjust the width to 4x + width = result.Width << 2; + +#if SAFE + +#error Safe mode not implemented + +#else + unsafe + { + // Get a pointer to the beginning of the pixel data region + // The upper-left corner + int* pixelPtr = (int*)bitmapData.Scan0; + + // Iterate through rows and columns + for (int row = 0; row < height; row++) + { + for (int col = 0; col < width; col += 4) + { + int index = row * width + col; + int color = imageData[index++] | + imageData[index++] << 8 | + imageData[index++] << 16 | + imageData[index++] << 24; + + // Set the pixel (fast!) + *pixelPtr = color; + + // Update the pointer + pixelPtr++; + } + } + } +#endif + + // Unlock the bitmap + result.UnlockBits(bitmapData); + + return result; + + } + + /// + /// Convert to a Bitmap in memory + /// + /// BitmapImage + /// Bitmap + public static Bitmap ToBitmap(this BitmapImage data) + { + using (MemoryStream outStream = new MemoryStream()) + { + BitmapEncoder enc = new BmpBitmapEncoder(); + enc.Frames.Add(BitmapFrame.Create(data)); + enc.Save(outStream); + System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream); + + return new Bitmap(bitmap); + } + } + + /// + /// Inverts the pixels of this bitmap in place. Ignores alpha channel. + /// + /// + public static void InvertColorChannels(this Bitmap bitmapImage) + { + var rect = new Rectangle(0, 0, bitmapImage.Width, bitmapImage.Height); + + var bmpRO = bitmapImage.LockBits( + rect, + ImageLockMode.ReadOnly, + PixelFormat.Format32bppPArgb); + + var bmpLen = bmpRO.Stride * bmpRO.Height; + var bitmapBGRA = new byte[bmpLen]; + Marshal.Copy(bmpRO.Scan0, bitmapBGRA, 0, bmpLen); + bitmapImage.UnlockBits(bmpRO); + + // Copy ONLY the color channels and invert - black->white, white->black + for (int i = 0; i < bmpLen; i += 4) + { + bitmapBGRA[i] = (byte)(255 - bitmapBGRA[i]); + bitmapBGRA[i + 1] = (byte)(255 - bitmapBGRA[i + 1]); + bitmapBGRA[i + 2] = (byte)(255 - bitmapBGRA[i + 2]); + } + + var bmpWO = bitmapImage.LockBits( + rect, + ImageLockMode.WriteOnly, + PixelFormat.Format32bppPArgb); + + Marshal.Copy(bitmapBGRA, 0, bmpWO.Scan0, bmpLen); + bitmapImage.UnlockBits(bmpWO); + } + + + private const string LogoDelimiter = "||||"; + + /// + /// Converts this image into a base64 encoded string. + /// + /// Source image + /// string + public static string ToBase64String(this Bitmap bitmap) + { + // Do not encode null or empty image + if (bitmap == null || (bitmap.Width == 0 && bitmap.Height == 0)) + { + return string.Empty; + } + + // Extract bitmap image into bitmap and save to memory + using (MemoryStream m = new MemoryStream()) + { + bitmap.Save(m, ImageFormat.Bmp); + var imageBytes = m.ToArray(); + + return Convert.ToBase64String(imageBytes); + } + } + + /// + /// Converts base64 encoded string to bitmap. + /// + /// string to convert + /// Bitmap or null on error + public static Bitmap FromBase64String(string content) + { + try + { + var raw = Convert.FromBase64String(content); + + // Do not dispose of stream. Bitmap now owns it and will close it when disposed. + var ms = new MemoryStream(raw, 0, raw.Length); + return Bitmap.FromStream(ms, true) as Bitmap; + } + catch + { + return null; + } + } + + /// + /// Creates an MSB ordered, bit-reversed buffer of the logo data located in this bitmap. + /// The input data's pixels are reduced into an 8bpp image. That means that 8 PC bitmap + /// pixels are reduced into 8 bits in the resulting buffer. These bits are delivered in + /// reverse order (0x80: 0b10000000 -> 0x00000001). + /// If ANY of the pixel's RGB values are non-zero, the corresponding bit index will be set + /// in the output buffer. The alpha channel has no effect on the output buffer. + /// The bitmap is read from the top left of the bitmap to the bottom right. + /// + /// Bitmap + /// MSB ordered, bit-reversed Buffer + public static byte[] ToLogoBuffer(this Bitmap bitmapImage) + { + // Define an area in which the bitmap bits will be locked in managed memory + var rect = new Rectangle(0, 0, bitmapImage.Width, bitmapImage.Height); + var bmpReadOnly = bitmapImage.LockBits( + rect, + ImageLockMode.ReadOnly, + PixelFormat.Format32bppPArgb); + + + var bmpLen = bmpReadOnly.Stride * bmpReadOnly.Height; + var bmpChannels = new byte[bmpLen]; + Marshal.Copy(bmpReadOnly.Scan0, bmpChannels, 0, bmpLen); + bitmapImage.UnlockBits(bmpReadOnly); + + + // Split into bitmap into N number of rows where each row is + // as wide as the input bitmap's pixel count. + var rowWidth = bmpReadOnly.Width; + var pixels = bmpChannels.Split(bmpReadOnly.Stride); + var byteWidth = (int)Math.Ceiling((double)rowWidth / 8); + var tmpBuff = new List(); + + // Result buffer - Use array because we use | operator in byte reversal + var outBuffer = new byte[byteWidth * bmpReadOnly.Height]; + var outIndex = 0; + + // Read 1 row (aka stride) or 4-byte pixels at a time + foreach (var row in pixels) + { + // Read 1st of every 4 bytes from source[colorIndex] in order into temp buffer + foreach (var pix in row.Split(4)) + { + tmpBuff.Add(new Pixel(pix)); + } + + // Reverse the pixel byte, 0b10000010 -> 0x01000001 + for (var set = 0; set < byteWidth; set++) + { + // Max bit tells us what bit to start shifting from + var maxBit = Math.Min(7, rowWidth - (set * 8) - 1); + + // Read up to 8 bytes at a time in LSB->MSB so they are transmitted MSB->LSB to printer + // set offset groups into bytes + for (int b = maxBit, bb = 0; b >= 0; b--, bb++) + { + // Read rows right to left + var px = tmpBuff[b + (set * 8)]; + + // Firmware black == 1, White == 0 + outBuffer[outIndex] |= (byte)((px.IsNotWhite() ? 1 : 0) << bb); + } + + // Increments after every byte + outIndex++; + } + + tmpBuff.Clear(); + } + + + return outBuffer; + } + } +} diff --git a/ThermalTalk.Imaging/LogoSize.cs b/ThermalTalk.Imaging/LogoSize.cs new file mode 100644 index 0000000..3b31dec --- /dev/null +++ b/ThermalTalk.Imaging/LogoSize.cs @@ -0,0 +1,43 @@ +namespace ThermalTalk.Imaging +{ + /// + /// Encapsulates a bitmap's dimensions + /// + public class LogoSize + { + /// + /// Width of image in bytes + /// + public int WidthBytes { get; set; } + + /// + /// Width of image in thermal printer dots (def. 203 DPI) + /// + public int WidthDots { get; set; } + + /// + /// Height of image in dots (and bytes, they're the same metric here) + /// + public int Height { get; set; } + + /// + /// Gets or sets the size in bytes for this logo + /// + public int SizeInBytes { get; set; } + + /// + /// Gets or sets the size of the logo stored in flash. + /// This will always be greater than or equal to SizeInBytes + /// + public int SizeInBytesOnFlash { get; set; } + + /// + /// Returns dimension string as WidthxHeight + /// + /// + public object GetBitmapSizeString() + { + return string.Format("{0}x{1}", WidthDots, Height); + } + } +} diff --git a/ThermalTalk.Imaging/OpenTK.dll.config b/ThermalTalk.Imaging/OpenTK.dll.config new file mode 100644 index 0000000..7098d39 --- /dev/null +++ b/ThermalTalk.Imaging/OpenTK.dll.config @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ThermalTalk.Imaging/Pixel.cs b/ThermalTalk.Imaging/Pixel.cs new file mode 100644 index 0000000..d17858f --- /dev/null +++ b/ThermalTalk.Imaging/Pixel.cs @@ -0,0 +1,58 @@ +namespace ThermalTalk.Imaging +{ + using System; + + internal struct Pixel + { + public byte B; //< Blue + public byte G; //< Green + public byte R; //< Red + public byte A; //< Alpha + + /// + /// Unchecked constructor expects a 4-byte input buffer + /// Order: ARGB + /// + /// + internal Pixel(byte[] slice4) + : this(slice4[3], slice4[2], slice4[1], slice4[0]) + { } + + /// + /// Ordered constructor: ARGB + /// + /// Alpha + /// Red + /// Green + /// Blue + public Pixel(int a, int r, int g, int b) + : this((byte)a, (byte)r, (byte)g, (byte)b) + {} + + /// + /// Ordered constructor: ARGB + /// + /// Alpha + /// Red + /// Green + /// Blue + public Pixel(byte a, byte r, byte g, byte b) + { + A = a; + R = r; + G = g; + B = b; + } + + /// + /// White is defined as 255,255,255 on the RGB pallete. Returns + /// true if any RGB value is not 255. + /// + /// True if this pixel is non-white + internal bool IsNotWhite() + { + var m = (A + R + G) / 3; + return m != 255; + } + } +} diff --git a/ThermalTalk.Imaging/Properties/AssemblyInfo.cs b/ThermalTalk.Imaging/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..03f20a5 --- /dev/null +++ b/ThermalTalk.Imaging/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ThermalTalk.Imaging")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ThermalTalk.Imaging")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("281e064e-25ef-4c3f-9423-a70fd7042116")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ThermalTalk.Imaging/ThermalTalk.Imaging.csproj b/ThermalTalk.Imaging/ThermalTalk.Imaging.csproj new file mode 100644 index 0000000..d7d23f7 --- /dev/null +++ b/ThermalTalk.Imaging/ThermalTalk.Imaging.csproj @@ -0,0 +1,130 @@ + + + + + + Debug + AnyCPU + {5440263F-5089-4050-9689-B2060192707E} + Library + Properties + ThermalTalk.Imaging + ThermalTalk.Imaging + v4.5 + 512 + 6611d21a + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + x64 + true + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + prompt + MinimumRecommendedRules.ruleset + true + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + prompt + MinimumRecommendedRules.ruleset + + + + ..\packages\EmguCV.3.1.0.1\lib\net30\Emgu.CV.UI.dll + True + + + ..\packages\EmguCV.3.1.0.1\lib\net30\Emgu.CV.UI.GL.dll + True + + + ..\packages\EmguCV.3.1.0.1\lib\net30\Emgu.CV.World.dll + True + + + ..\packages\OpenTK.1.1.2225.0\lib\net20\OpenTK.dll + True + + + ..\packages\OpenTK.GLControl.1.1.2225.0\lib\net20\OpenTK.GLControl.dll + True + + + + + + + + + + + + + + + + + ..\packages\ZedGraph.5.1.5\lib\ZedGraph.dll + True + + + + + + + + + + + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + \ No newline at end of file diff --git a/ThermalTalk.Imaging/Webcam.cs b/ThermalTalk.Imaging/Webcam.cs new file mode 100644 index 0000000..7cfa2c5 --- /dev/null +++ b/ThermalTalk.Imaging/Webcam.cs @@ -0,0 +1,17 @@ +namespace ThermalTalk.Imaging +{ + using Emgu.CV; + using Emgu.CV.CvEnum; + using System.Drawing; + + public static class Webcam + { + public static Bitmap GrabPicture() + { + Capture capture = new Capture(0); + Bitmap image = capture.QueryFrame().Bitmap; //take a picture + + return image; + } + } +} diff --git a/ThermalTalk.Imaging/packages.config b/ThermalTalk.Imaging/packages.config new file mode 100644 index 0000000..af5879b --- /dev/null +++ b/ThermalTalk.Imaging/packages.config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/ThermalTalk.Imaging/readme.md b/ThermalTalk.Imaging/readme.md new file mode 100644 index 0000000..118c56f --- /dev/null +++ b/ThermalTalk.Imaging/readme.md @@ -0,0 +1,44 @@ +# Imaging Module + +This module provides a collection of image manipulations algorithms and functions. The primary features are: + +* Image dithering +* Quick Bitmap to buffer and buffer to Bitmap conversions +* Lossless Resize +* Generate packet-ready data streams for serial transmission + + +## Examples + +All example require the following using statement + + using ThermalTalk.Imaging; + + +### Dithering +Dithering is the process of converting a high-resolution image into a low-res image +without loosing too much fidelity. There are a number of algorithms available and +they each provide difference balances between quality and performance. My favorite +is JarvisJudiceNinke because it looks good and runs quickly. + + var bitmap = @"C:\path\to\my\image.jpg" // Accepts all common image file types + var parser = DitherFactory.GetDitherer(Algorithms.JarvisJudiceNinke); // Use default gray threshold + var dithered = parser.GenerateDithered(bitmap); + + + +### Phoenix Logo Generation +Here is a sample specific to Phoenix. Given an image, generate a byte[] than is ready to be +packaged in a packet protocol and transmitted to a physical device. + + var bitmap = @"C:\some_image.png"; + var logoBuff = bitmap.ToLogoBuffer(); + + +### Converting a buffer into a bitmap +Sometimes we want to manipulate a bitmap in memory or visual a buffer as a bitmap. + + var my buff = new byte[] {....} // Your data + var width = 200; // Bitmap width in bytes + var height = 200; // Bitmap height in bytes + var bitmap = buff.AsBitmap(width, height); diff --git a/ThermalTalk.sln b/ThermalTalk.sln index d181004..e292609 100644 --- a/ThermalTalk.sln +++ b/ThermalTalk.sln @@ -3,24 +3,84 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.40629.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThermalTalk", "RelianceTalk\ThermalTalk.csproj", "{1C8B96D3-E723-4B9C-8884-3449C26384FB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThermalTalk", "ThermalTalk\ThermalTalk.csproj", "{1C8B96D3-E723-4B9C-8884-3449C26384FB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThermalTalk.Test", "RelianceTalk.Test\ThermalTalk.Test.csproj", "{8EDF4429-251A-416D-BB68-93F227191BCF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThermalTalk.Test", "ThermalTalk.Test\ThermalTalk.Test.csproj", "{8EDF4429-251A-416D-BB68-93F227191BCF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThermalTalk.Imaging", "ThermalTalk.Imaging\ThermalTalk.Imaging.csproj", "{5440263F-5089-4050-9689-B2060192707E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThermalTalk.Imaging.Test", "ThermalTalk.Imaging.Test\ThermalTalk.Imaging.Test.csproj", "{56E7C431-933E-409E-AA4A-156C3790C6B5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThermalConsole", "ThermalConsole\ThermalConsole.csproj", "{CCB36955-595F-4003-81CB-D7A3121B67D9}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x64 = Debug|x64 Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1C8B96D3-E723-4B9C-8884-3449C26384FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1C8B96D3-E723-4B9C-8884-3449C26384FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1C8B96D3-E723-4B9C-8884-3449C26384FB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {1C8B96D3-E723-4B9C-8884-3449C26384FB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {1C8B96D3-E723-4B9C-8884-3449C26384FB}.Debug|x64.ActiveCfg = Debug|x64 + {1C8B96D3-E723-4B9C-8884-3449C26384FB}.Debug|x64.Build.0 = Debug|x64 {1C8B96D3-E723-4B9C-8884-3449C26384FB}.Release|Any CPU.ActiveCfg = Release|Any CPU {1C8B96D3-E723-4B9C-8884-3449C26384FB}.Release|Any CPU.Build.0 = Release|Any CPU + {1C8B96D3-E723-4B9C-8884-3449C26384FB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {1C8B96D3-E723-4B9C-8884-3449C26384FB}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {1C8B96D3-E723-4B9C-8884-3449C26384FB}.Release|x64.ActiveCfg = Release|x64 + {1C8B96D3-E723-4B9C-8884-3449C26384FB}.Release|x64.Build.0 = Release|x64 {8EDF4429-251A-416D-BB68-93F227191BCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8EDF4429-251A-416D-BB68-93F227191BCF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8EDF4429-251A-416D-BB68-93F227191BCF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {8EDF4429-251A-416D-BB68-93F227191BCF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {8EDF4429-251A-416D-BB68-93F227191BCF}.Debug|x64.ActiveCfg = Debug|x64 + {8EDF4429-251A-416D-BB68-93F227191BCF}.Debug|x64.Build.0 = Debug|x64 {8EDF4429-251A-416D-BB68-93F227191BCF}.Release|Any CPU.ActiveCfg = Release|Any CPU {8EDF4429-251A-416D-BB68-93F227191BCF}.Release|Any CPU.Build.0 = Release|Any CPU + {8EDF4429-251A-416D-BB68-93F227191BCF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {8EDF4429-251A-416D-BB68-93F227191BCF}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {8EDF4429-251A-416D-BB68-93F227191BCF}.Release|x64.ActiveCfg = Release|x64 + {8EDF4429-251A-416D-BB68-93F227191BCF}.Release|x64.Build.0 = Release|x64 + {5440263F-5089-4050-9689-B2060192707E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5440263F-5089-4050-9689-B2060192707E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5440263F-5089-4050-9689-B2060192707E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {5440263F-5089-4050-9689-B2060192707E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {5440263F-5089-4050-9689-B2060192707E}.Debug|x64.ActiveCfg = Debug|x64 + {5440263F-5089-4050-9689-B2060192707E}.Debug|x64.Build.0 = Debug|x64 + {5440263F-5089-4050-9689-B2060192707E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5440263F-5089-4050-9689-B2060192707E}.Release|Any CPU.Build.0 = Release|Any CPU + {5440263F-5089-4050-9689-B2060192707E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {5440263F-5089-4050-9689-B2060192707E}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {5440263F-5089-4050-9689-B2060192707E}.Release|x64.ActiveCfg = Release|x64 + {5440263F-5089-4050-9689-B2060192707E}.Release|x64.Build.0 = Release|x64 + {56E7C431-933E-409E-AA4A-156C3790C6B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {56E7C431-933E-409E-AA4A-156C3790C6B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {56E7C431-933E-409E-AA4A-156C3790C6B5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {56E7C431-933E-409E-AA4A-156C3790C6B5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {56E7C431-933E-409E-AA4A-156C3790C6B5}.Debug|x64.ActiveCfg = Debug|x64 + {56E7C431-933E-409E-AA4A-156C3790C6B5}.Debug|x64.Build.0 = Debug|x64 + {56E7C431-933E-409E-AA4A-156C3790C6B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {56E7C431-933E-409E-AA4A-156C3790C6B5}.Release|Any CPU.Build.0 = Release|Any CPU + {56E7C431-933E-409E-AA4A-156C3790C6B5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {56E7C431-933E-409E-AA4A-156C3790C6B5}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {56E7C431-933E-409E-AA4A-156C3790C6B5}.Release|x64.ActiveCfg = Release|Any CPU + {CCB36955-595F-4003-81CB-D7A3121B67D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCB36955-595F-4003-81CB-D7A3121B67D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCB36955-595F-4003-81CB-D7A3121B67D9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {CCB36955-595F-4003-81CB-D7A3121B67D9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {CCB36955-595F-4003-81CB-D7A3121B67D9}.Debug|x64.ActiveCfg = Debug|x64 + {CCB36955-595F-4003-81CB-D7A3121B67D9}.Debug|x64.Build.0 = Debug|x64 + {CCB36955-595F-4003-81CB-D7A3121B67D9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCB36955-595F-4003-81CB-D7A3121B67D9}.Release|Any CPU.Build.0 = Release|Any CPU + {CCB36955-595F-4003-81CB-D7A3121B67D9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {CCB36955-595F-4003-81CB-D7A3121B67D9}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {CCB36955-595F-4003-81CB-D7A3121B67D9}.Release|x64.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/packages/repositories.config b/packages/repositories.config index 483b638..12ba9c9 100644 --- a/packages/repositories.config +++ b/packages/repositories.config @@ -1,4 +1,8 @@  + + + + \ No newline at end of file From 2f21cc2e0e209c2d182cb42e9ae2e35047f7483d Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Wed, 26 Apr 2017 07:44:00 -0700 Subject: [PATCH 06/47] Add timestamp to printout --- ThermalConsole/Program.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ThermalConsole/Program.cs b/ThermalConsole/Program.cs index 5f86956..7c27bae 100644 --- a/ThermalConsole/Program.cs +++ b/ThermalConsole/Program.cs @@ -26,7 +26,9 @@ static void Main(string[] args) using(var image = ThermalTalk.Imaging.Webcam.GrabPicture()) { image.Save(imgpath); - Console.WriteLine("Image #{0} taken at {1}", count, DateTime.Now); + var now = DateTime.Now; + + Console.WriteLine("Image #{0} taken at {1}", count, now); using(var logo = new BasePrintLogo(imgpath, 640, 480)) { @@ -37,7 +39,7 @@ static void Main(string[] args) var raw = File.ReadAllBytes(imgescbin); - printer.PrintASCIIString(string.Format("Capture #{0}", count++)); + printer.PrintASCIIString(string.Format("Capture #{0} at {1}", count++, now)); printer.PrintNewline(); Thread.Sleep(5); From 956f300b216b05f42d9e6b2bcbbc5661022405d1 Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Wed, 26 Apr 2017 13:58:22 -0700 Subject: [PATCH 07/47] Cleanup the BasePrintLogo Remove a bunch of unused properties and functions. Remove unused classes. Make Webcam class return PrintImage Add ESCPOSBuffer return for PrintImage class Simplify Program main loop --- ThermalConsole/Program.cs | 48 ++-- ThermalTalk.Imaging/IPrintLogo.cs | 49 +++- ThermalTalk.Imaging/ImagingException.cs | 11 + ThermalTalk.Imaging/LogoSize.cs | 43 ---- .../{BasePrintLogo.cs => PrinterImage.cs} | 226 ++++++++---------- .../ThermalTalk.Imaging.csproj | 4 +- ThermalTalk.Imaging/Webcam.cs | 11 +- ThermalTalk/Reliance/RelianceConnection.cs | 2 +- 8 files changed, 175 insertions(+), 219 deletions(-) create mode 100644 ThermalTalk.Imaging/ImagingException.cs delete mode 100644 ThermalTalk.Imaging/LogoSize.cs rename ThermalTalk.Imaging/{BasePrintLogo.cs => PrinterImage.cs} (56%) diff --git a/ThermalConsole/Program.cs b/ThermalConsole/Program.cs index 7c27bae..a039046 100644 --- a/ThermalConsole/Program.cs +++ b/ThermalConsole/Program.cs @@ -1,6 +1,5 @@  using System; -using System.IO; using System.Threading; using ThermalTalk; using ThermalTalk.Imaging; @@ -12,12 +11,9 @@ class Program static void Main(string[] args) { const string commport = "COM1"; - const string imgpath = @"C:\temp\security_sample.png"; - const string imgescbin = @"C:\temp\security_sample.bin"; - const int captureRate = 10; // number of seconds between capture - - Console.WriteLine("Starting Security Cam Sample"); + + Console.WriteLine("Starting Security Camera Sample"); int count = 1; while (true) @@ -25,34 +21,32 @@ static void Main(string[] args) using (var printer = new ReliancePrinter(commport)) using(var image = ThermalTalk.Imaging.Webcam.GrabPicture()) { - image.Save(imgpath); + var now = DateTime.Now; - Console.WriteLine("Image #{0} taken at {1}", count, now); - using(var logo = new BasePrintLogo(imgpath, 640, 480)) - { - logo.ApplyDithering(Algorithms.JarvisJudiceNinke, 128); - logo.ExportLogoEscPos(imgescbin); - - logo.ExportLogo(@"C:\temp\dither.png"); - - var raw = File.ReadAllBytes(imgescbin); - - printer.PrintASCIIString(string.Format("Capture #{0} at {1}", count++, now)); - printer.PrintNewline(); + // Resize image if we want. This will follow ESC/POS justification + //logo.Resize(640, 480); + image.ApplyDithering(Algorithms.JarvisJudiceNinke, 128); - Thread.Sleep(5); - - printer.SendRaw(raw); - printer.FormFeed(); + // Center justify the capture count number + printer.SetJustification(FontJustification.JustifyCenter); + printer.PrintASCIIString(string.Format("Capture #{0}", count)); + printer.PrintNewline(); + // Bold (and still centered) timestamp + printer.AddEffect(FontEffects.Bold); + printer.PrintASCIIString(string.Format("{1}", count++, now)); + printer.RemoveEffect(FontEffects.Bold); + printer.PrintNewline(); - Thread.Sleep(captureRate * 1000); - } - } + // Send the whole image. This will take sometime + printer.SendRaw(image.GetAsEscBuffer()); + printer.FormFeed(); - + // Wait for next capture period + Thread.Sleep(captureRate * 1000); + } } } } diff --git a/ThermalTalk.Imaging/IPrintLogo.cs b/ThermalTalk.Imaging/IPrintLogo.cs index 1cb2bd1..30b41bd 100644 --- a/ThermalTalk.Imaging/IPrintLogo.cs +++ b/ThermalTalk.Imaging/IPrintLogo.cs @@ -2,21 +2,50 @@ { using System; - public interface IPrintLogo + public interface IPrintLogo : IDisposable { + /// + /// Inverts the color palette on this bitmap, pixel-by-pixel + /// void ApplyColorInversion(); + + /// + /// Applies the specified dithering algorithm to this logo + /// + /// Name of algorithm + /// Gray threshold. Values below this are considered white void ApplyDithering(Algorithms algorithm, byte threshhold); + + /// + /// Returns this bitmap, in its current state, as a base64 encoded string + /// + /// string AsBase64String(); - LogoSize Dimensions { get; } - void Dispose(); - int ForceWidth { get; } - int IdealHeight { get; } - int IdealWidth { get; } + + /// + /// Observable bitmap image source that represents bitmap in its current state + /// and will reflect any changes due to resize, dither, or inversion. + /// System.Windows.Media.Imaging.BitmapImage ImageData { get; } + + /// + /// Width of this bitmap in pixels + /// + int Width { get; } + + /// + /// Height of this bitmap in pixels + /// + int Height { get; } + + /// + /// Total size of this bitmap in bytes + /// + int Size { get; } + + /// + /// Returns true if this bitmap is in an inverted state + /// bool IsInverted { get; } - int MaxHeight { get; } - int MaxWidth { get; } - uint TransmitCRC { get; set; } - string TransmitPath { get; set; } } } diff --git a/ThermalTalk.Imaging/ImagingException.cs b/ThermalTalk.Imaging/ImagingException.cs new file mode 100644 index 0000000..dd72a36 --- /dev/null +++ b/ThermalTalk.Imaging/ImagingException.cs @@ -0,0 +1,11 @@ +namespace ThermalTalk.Imaging +{ + using System; + + public class ImagingException : Exception + { + public ImagingException(string message) + : base(message) + { } + } +} diff --git a/ThermalTalk.Imaging/LogoSize.cs b/ThermalTalk.Imaging/LogoSize.cs deleted file mode 100644 index 3b31dec..0000000 --- a/ThermalTalk.Imaging/LogoSize.cs +++ /dev/null @@ -1,43 +0,0 @@ -namespace ThermalTalk.Imaging -{ - /// - /// Encapsulates a bitmap's dimensions - /// - public class LogoSize - { - /// - /// Width of image in bytes - /// - public int WidthBytes { get; set; } - - /// - /// Width of image in thermal printer dots (def. 203 DPI) - /// - public int WidthDots { get; set; } - - /// - /// Height of image in dots (and bytes, they're the same metric here) - /// - public int Height { get; set; } - - /// - /// Gets or sets the size in bytes for this logo - /// - public int SizeInBytes { get; set; } - - /// - /// Gets or sets the size of the logo stored in flash. - /// This will always be greater than or equal to SizeInBytes - /// - public int SizeInBytesOnFlash { get; set; } - - /// - /// Returns dimension string as WidthxHeight - /// - /// - public object GetBitmapSizeString() - { - return string.Format("{0}x{1}", WidthDots, Height); - } - } -} diff --git a/ThermalTalk.Imaging/BasePrintLogo.cs b/ThermalTalk.Imaging/PrinterImage.cs similarity index 56% rename from ThermalTalk.Imaging/BasePrintLogo.cs rename to ThermalTalk.Imaging/PrinterImage.cs index 8c8a932..73f013d 100644 --- a/ThermalTalk.Imaging/BasePrintLogo.cs +++ b/ThermalTalk.Imaging/PrinterImage.cs @@ -7,42 +7,33 @@ using System.IO; using System.Windows.Media.Imaging; - public class BasePrintLogo : IDisposable, ThermalTalk.Imaging.IPrintLogo + public class PrinterImage : ThermalTalk.Imaging.IPrintLogo { /// - /// Construct a new logo from source image and scale to ratio. - /// Set maxWidthPixels to 0 for full size (no change). + /// Construct a new logo from source image on disk /// /// String path to file. Supports all image formats. - /// Maximum width in pixels to enforce. 0 to ignore. - /// Maximum height in pixels to engore. 0 to ignore. - public BasePrintLogo(string sourcePath, int maxWidth = 0, int maxHeight = 0, int forceWidth = 0) + public PrinterImage(string sourcePath) { if (string.IsNullOrEmpty(sourcePath)) { throw new ArgumentException("sourcePath must be a non-empty string."); } - // MaxWidth must always be byte aligned (units are in pixels) - MaxWidth = maxWidth.RoundUp(8); - MaxHeight = maxHeight; - ForceWidth = forceWidth; - SetImageData(sourcePath); } - #region Properties - /// - /// Temporary path for this logo that is used to avoid heap allocating - /// a buffer just to pass into libcore. - /// - public string TransmitPath { get; set; } /// - /// CRC of logo in transmit mode + /// Construct a new logo from source image /// - public uint TransmitCRC { get; set; } + /// Source image + public PrinterImage(Bitmap source) + { + SetImageData(source); + } + #region Properties /// /// Gets the raw image data /// @@ -50,37 +41,19 @@ public BasePrintLogo(string sourcePath, int maxWidth = 0, int maxHeight = 0, int public BitmapImage ImageData { get; private set; } /// - /// Gets the dimensions for the current state of the image + /// Gets the current bitmap width in pixels /// - public LogoSize Dimensions { get; private set; } + public int Width { get; private set; } /// - /// Gets the ideal width of this image. The ideal - /// width is the scaled width set at instantiation time. + /// Gets the current bitmap height in pixels /// - public int IdealWidth { get; private set; } + public int Height { get; private set; } /// - /// Gets the ideal height of this image. The ideal - /// height is the scaled height set at instantiation time. + /// Returns the size in bytes for this bitmap /// - public int IdealHeight { get; private set; } - - /// - /// Gets the enforced max width. Set to 0 to ignore. - /// - public int MaxHeight { get; private set; } - - /// - /// Gets the enforced max height. Set to 0 to ignore. - /// - public int MaxWidth { get; private set; } - - /// - /// Gets the width to force. Image will be scaled up or down to meet - /// this requirement. 0 to ignore. - /// - public int ForceWidth { get; private set; } + public int Size { get; private set; } /// /// Returns true if this image is inverted @@ -88,6 +61,7 @@ public BasePrintLogo(string sourcePath, int maxWidth = 0, int maxHeight = 0, int public bool IsInverted { get; private set; } #endregion + public void ApplyDithering(Algorithms algorithm, byte threshhold) { // Create an instance of the specified dithering algorithm @@ -103,8 +77,7 @@ public void ApplyDithering(Algorithms algorithm, byte threshhold) SetImageData(dithered); // For Phoenix we don't care about size of logo in flash. Everything is static. - Dimensions.SizeInBytes = dithered.ToLogoBuffer().Length; - Dimensions.SizeInBytesOnFlash = Dimensions.SizeInBytes; + Size = dithered.ToLogoBuffer().Length; } /// @@ -143,12 +116,13 @@ public void ExportLogoBin(string outpath) File.WriteAllBytes(outpath, bmpData); } + /// - /// Export the current state of this logo as a binary file, wrapped in the 1D 76 - /// ESC/POS bitmap command. + /// Package this bitmap as an ESC/POS raster image which is the + /// 1D 76 command. /// - /// - public void ExportLogoEscPos(string outpath) + /// Byte buffer + public byte[] GetAsEscBuffer() { // Build up the ESC/POS 1D 76 30 command var buffer = new List(); @@ -160,8 +134,8 @@ public void ExportLogoEscPos(string outpath) buffer.Add(0x00); // Get correct dimensions - var w = Dimensions.WidthBytes; - var h = Dimensions.Height; + var w = (int)Math.Ceiling((double)Width / 8); + var h = Height; // https://goo.gl/FFdiZl // Calculate xL and xH @@ -182,8 +156,19 @@ public void ExportLogoEscPos(string outpath) var bmpData = ImageData.ToBitmap().ToLogoBuffer(); buffer.AddRange(bmpData); - // Write to file - File.WriteAllBytes(outpath, buffer.ToArray()); + return buffer.ToArray(); + } + + /// + /// Export the current state of this logo as a binary file, wrapped in the 1D 76 + /// ESC/POS bitmap command. + /// + /// + public void ExportLogoEscPos(string outpath) + { + var buffer = GetAsEscBuffer(); + + File.WriteAllBytes(outpath, buffer); } /// @@ -195,7 +180,7 @@ public string AsBase64String() using(var bitmap = ImageData.ToBitmap()) { return bitmap.ToBase64String(); - } + }; } /// @@ -211,91 +196,75 @@ public void FromBase64String(string base64) } /// - /// Opens image located at sourcepath. Scales image down to MaxWidth if required. - /// Images smaller than MaxWidth will not be scaled up. Result is stored in ImageData field. - /// Final result CRC is calculated and assigned to CRC32 field. + /// Resize logo using the specific dimensions. To adjustt a single dimension, set + /// maintainAspectRatio to true and the first non-zero parameter. /// - /// String path to source image - private void SetImageData(string sourcePath) + /// + /// myLogo.Resize(100, 0, true); // Scale to 100 pixels wide and maintain ratio + /// myLogo.Resize(0, 400, true); // Scale to 400 pixel tall and maintain ratio + /// myLogo.Resize(100, 200, true);// Scale to 100 pixels wide because maintainAspectRatio is true and width is 1st + /// myLogo.Resize(640, 480); // Scale to 640x480 and don't worry about ratio + /// + /// Desired width in pixels, non-zero if maintainAspectRatio is false + /// Desired height in pixels, non-zero if maintainAspectRatio is false + /// Keep current ratio + /// Raised if invalid dimensions are specified + public void Resize(int pixelWidth, int pixelHeight, bool maintainAspectRatio=false) { - using (Bitmap bitmap = (Bitmap)Image.FromFile(sourcePath)) + if (maintainAspectRatio) { - // extract dimensions - var actualWidth = bitmap.Width; - var actualHeight = bitmap.Height; - - - // Adjust width if needed - if(ForceWidth != 0 && actualWidth != ForceWidth) + if (pixelWidth > 0) { - IdealWidth = ForceWidth; - } - else if (MaxWidth != 0 && MaxWidth < actualWidth) + // Get required height scalar + var scalar = (float)((float)Width / (float)pixelWidth); + Width = pixelWidth; + Height = (int)(Height * scalar); + } + else if (pixelHeight > 0) { - IdealWidth = MaxWidth; + // Get required width scalar + var scalar = (float)((float)Height / (float)pixelHeight); + Height = pixelHeight; + Width = (int)(Width * scalar); } else { - IdealWidth = actualWidth; - } - - - // Limit height if needed - if (MaxHeight != 0 && MaxHeight < actualHeight) - { - IdealHeight = MaxHeight; - } - else - { - IdealHeight = actualHeight; - } - - // First, scale width to ideal size - if (actualWidth > IdealWidth) - { - // Scale down - float factor = (float)IdealWidth / (float)actualWidth; - actualWidth = (int)(factor * actualWidth); - actualHeight = (int)(factor * actualHeight); + throw new ImagingException("Width or Height must be non-zero"); } - else if (actualWidth < IdealWidth) - { - // Scale up - float factor = (float)IdealWidth / (float)actualWidth; - actualWidth = (int)(factor * actualWidth); - actualHeight = (int)(factor * actualHeight); - } - else + } + else + { + if(pixelWidth == 0 || pixelHeight == 0) { - // Width need not be scaled + throw new ImagingException("Width and Height must be non-zero"); } + Width = pixelWidth; + Height = pixelHeight; + } - // Second scale height -- down only - // and don't touch the width, just cut it off - if (actualHeight > IdealHeight) - { - // Scale down - float factor = (float)IdealHeight / (float)actualHeight; - actualHeight = (int)(factor * actualHeight); - } - + // Ensure we have byte alignment + Width = Width.RoundUp(8); + Height = Height.RoundUp(8); - // Ensure that whatever width we have is byte aligned - if (actualWidth % 8 != 0) - { - actualWidth = actualWidth.RoundUp(8); - } - - // Ensure that our width property matches the final scaled width - IdealWidth = actualWidth; - IdealHeight = actualHeight; + using (var bitmap = new Bitmap(ImageData.ToBitmap(), new Size(Width, Height))) + { + SetImageData(bitmap); + } + } - using (Bitmap resized = new Bitmap(bitmap, new Size(IdealWidth, IdealHeight))) - { - SetImageData(resized); - } + /// + /// Opens image located at sourcepath. Scales image down to MaxWidth if required. + /// Images smaller than MaxWidth will not be scaled up. Result is stored in ImageData field. + /// Final result CRC is calculated and assigned to CRC32 field. + /// + /// String path to source image + private void SetImageData(string sourcePath) + { + using (Bitmap bitmap = (Bitmap)Image.FromFile(sourcePath)) + { + SetImageData(bitmap); } } @@ -306,13 +275,10 @@ private void SetImageData(string sourcePath) /// String path to source image> private void SetImageData(Bitmap bitmap) { - // Extract dimension info - Dimensions = new LogoSize(); - Dimensions.Height = bitmap.Height; - Dimensions.WidthDots = bitmap.Width; - Dimensions.WidthBytes = (int)Math.Ceiling((double)Dimensions.WidthDots / 8); - Dimensions.SizeInBytes = bitmap.Height * bitmap.Width; - Dimensions.SizeInBytesOnFlash = Dimensions.SizeInBytes; + + // extract dimensions + Width = bitmap.Width; + Height = bitmap.Height; using (var memory = new MemoryStream()) { diff --git a/ThermalTalk.Imaging/ThermalTalk.Imaging.csproj b/ThermalTalk.Imaging/ThermalTalk.Imaging.csproj index d7d23f7..2468503 100644 --- a/ThermalTalk.Imaging/ThermalTalk.Imaging.csproj +++ b/ThermalTalk.Imaging/ThermalTalk.Imaging.csproj @@ -94,14 +94,14 @@ - + + - diff --git a/ThermalTalk.Imaging/Webcam.cs b/ThermalTalk.Imaging/Webcam.cs index 7cfa2c5..68dd4f7 100644 --- a/ThermalTalk.Imaging/Webcam.cs +++ b/ThermalTalk.Imaging/Webcam.cs @@ -1,17 +1,16 @@ namespace ThermalTalk.Imaging { using Emgu.CV; - using Emgu.CV.CvEnum; - using System.Drawing; public static class Webcam { - public static Bitmap GrabPicture() + public static PrinterImage GrabPicture() { Capture capture = new Capture(0); - Bitmap image = capture.QueryFrame().Bitmap; //take a picture - - return image; + using(var image = capture.QueryFrame().Bitmap) + { + return new PrinterImage(image); + } } } } diff --git a/ThermalTalk/Reliance/RelianceConnection.cs b/ThermalTalk/Reliance/RelianceConnection.cs index 2fa7dc5..7cf3600 100644 --- a/ThermalTalk/Reliance/RelianceConnection.cs +++ b/ThermalTalk/Reliance/RelianceConnection.cs @@ -199,7 +199,7 @@ private int WritePort(byte[] data) foreach (var s in data.Split(256)) { _mPort.Write(s, 0, s.Length); - Thread.Sleep(5); + Thread.Sleep(10); } return data.Length; From 6c6e6a38ce797b5ee643b3f2982b94aa6214b832 Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Wed, 26 Apr 2017 14:07:51 -0700 Subject: [PATCH 08/47] Add license header to all files --- ThermalTalk/Common/FontJustification.cs | 25 +++++++++++++++++++++- ThermalTalk/Common/FontScalar.cs | 25 +++++++++++++++++++++- ThermalTalk/Helpers/Extensions.cs | 25 +++++++++++++++++++++- ThermalTalk/IPrinter.cs | 25 +++++++++++++++++++++- ThermalTalk/Reliance/RelianceConnection.cs | 25 +++++++++++++++++++++- 5 files changed, 120 insertions(+), 5 deletions(-) diff --git a/ThermalTalk/Common/FontJustification.cs b/ThermalTalk/Common/FontJustification.cs index 9ae19a2..9ce85e0 100644 --- a/ThermalTalk/Common/FontJustification.cs +++ b/ThermalTalk/Common/FontJustification.cs @@ -1,4 +1,27 @@ -namespace ThermalTalk +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk { /// /// Set of multually exclusive font justification diff --git a/ThermalTalk/Common/FontScalar.cs b/ThermalTalk/Common/FontScalar.cs index d04a8d8..f19cdff 100644 --- a/ThermalTalk/Common/FontScalar.cs +++ b/ThermalTalk/Common/FontScalar.cs @@ -1,4 +1,27 @@ -namespace ThermalTalk +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk { public enum FontWidthScalar { diff --git a/ThermalTalk/Helpers/Extensions.cs b/ThermalTalk/Helpers/Extensions.cs index 550c275..3ecf662 100644 --- a/ThermalTalk/Helpers/Extensions.cs +++ b/ThermalTalk/Helpers/Extensions.cs @@ -1,4 +1,27 @@ -namespace ThermalTalk +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk { using System; using System.Collections.Generic; diff --git a/ThermalTalk/IPrinter.cs b/ThermalTalk/IPrinter.cs index 7b7e1d5..fee1fc7 100644 --- a/ThermalTalk/IPrinter.cs +++ b/ThermalTalk/IPrinter.cs @@ -1,4 +1,27 @@ -namespace ThermalTalk +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk { interface IPrinter : System.IDisposable { diff --git a/ThermalTalk/Reliance/RelianceConnection.cs b/ThermalTalk/Reliance/RelianceConnection.cs index 7cf3600..54504fb 100644 --- a/ThermalTalk/Reliance/RelianceConnection.cs +++ b/ThermalTalk/Reliance/RelianceConnection.cs @@ -1,4 +1,27 @@ -namespace ThermalTalk +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk { using System; using System.IO.Ports; From cd24fe825ef621d78d0da8ee56ab4f23ca585608 Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Wed, 26 Apr 2017 14:08:33 -0700 Subject: [PATCH 09/47] Add IDocument concept The idea is to allow for encapsulated text segments that have their own style without having to manually punch in the effects for every line of data. --- ThermalTalk/IDocument.cs | 67 ++++++++++++++++++++++++++++++++++ ThermalTalk/ThermalTalk.csproj | 1 + 2 files changed, 68 insertions(+) create mode 100644 ThermalTalk/IDocument.cs diff --git a/ThermalTalk/IDocument.cs b/ThermalTalk/IDocument.cs new file mode 100644 index 0000000..5614aab --- /dev/null +++ b/ThermalTalk/IDocument.cs @@ -0,0 +1,67 @@ +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk +{ + public interface IDocument + { + /// + /// Gets or Sets the string content for this document. + /// All effects, scalars, and justification will be applied + /// this this content. For newlines, inject the new line + /// character "\n" + /// + string Content { get; set; } + + /// + /// All effects to apply to content. This can be masked together to + /// apply more than one effect. These effects will only + /// be active during the printing of this document and then + /// they will be cleared. + /// + FontEffects Effects { get; set; } + + /// + /// Gets or Sets justification for this document + /// + FontJustification Justification { get; set; } + + /// + /// Gets or Sets the width scalar for this document + /// + FontWidthScalar WidthScalar { get; set; } + + /// + /// Gets or Sets the height scalar for this document + /// + FontHeighScalar HeightScalar { get; set; } + + /// + /// Returns a buffer with all content and effect packed up per the + /// ESC/POS protocol. This buffer must contain all effect setup + /// commands, the content, and all effect tear down commands. + /// + /// byte buffer + byte[] ToBuffer(); + } +} diff --git a/ThermalTalk/ThermalTalk.csproj b/ThermalTalk/ThermalTalk.csproj index a8e813b..d26c890 100644 --- a/ThermalTalk/ThermalTalk.csproj +++ b/ThermalTalk/ThermalTalk.csproj @@ -59,6 +59,7 @@ + From 8737cd57bdf0d940806995035f67d2341f820782 Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Wed, 26 Apr 2017 14:51:34 -0700 Subject: [PATCH 10/47] Implement document concept --- ThermalConsole/Program.cs | 39 +++++++++++++++++++------ ThermalTalk/IDocument.cs | 7 ++--- ThermalTalk/IPrinter.cs | 11 +++++-- ThermalTalk/Reliance/ReliancePrinter.cs | 28 ++++++++++++++++++ ThermalTalk/StandardDocument.cs | 22 ++++++++++++++ ThermalTalk/ThermalTalk.csproj | 1 + 6 files changed, 92 insertions(+), 16 deletions(-) create mode 100644 ThermalTalk/StandardDocument.cs diff --git a/ThermalConsole/Program.cs b/ThermalConsole/Program.cs index a039046..9631586 100644 --- a/ThermalConsole/Program.cs +++ b/ThermalConsole/Program.cs @@ -15,6 +15,29 @@ static void Main(string[] args) Console.WriteLine("Starting Security Camera Sample"); + + // Setup the header with double width, double height, center justified + var header = new StandardDocument() + { + Justification = FontJustification.JustifyCenter, + HeightScalar = FontHeighScalar.h2, + WidthScalar = FontWidthScalar.w2, + AutoNewline = true, + }; + + + + // Setup timestamp at normal scalar with bold, underline, and centered + var timestamp = new StandardDocument() + { + Justification = FontJustification.JustifyCenter, + HeightScalar = FontHeighScalar.h1, + WidthScalar = FontWidthScalar.w1, + Effects = FontEffects.Bold | FontEffects.Underline, + AutoNewline = true, + }; + + int count = 1; while (true) { @@ -25,20 +48,18 @@ static void Main(string[] args) var now = DateTime.Now; Console.WriteLine("Image #{0} taken at {1}", count, now); + // Resize image if we want. This will follow ESC/POS justification //logo.Resize(640, 480); image.ApplyDithering(Algorithms.JarvisJudiceNinke, 128); - // Center justify the capture count number - printer.SetJustification(FontJustification.JustifyCenter); - printer.PrintASCIIString(string.Format("Capture #{0}", count)); - printer.PrintNewline(); + // Print the header document, update with new capture number + header.Content = string.Format("Capture #{0}", count); + printer.PrintDocument(header); - // Bold (and still centered) timestamp - printer.AddEffect(FontEffects.Bold); - printer.PrintASCIIString(string.Format("{1}", count++, now)); - printer.RemoveEffect(FontEffects.Bold); - printer.PrintNewline(); + // Printer the timestamp document + timestamp.Content = string.Format("{1}", count++, now); + printer.PrintDocument(timestamp); // Send the whole image. This will take sometime printer.SendRaw(image.GetAsEscBuffer()); diff --git a/ThermalTalk/IDocument.cs b/ThermalTalk/IDocument.cs index 5614aab..eef0dbb 100644 --- a/ThermalTalk/IDocument.cs +++ b/ThermalTalk/IDocument.cs @@ -57,11 +57,8 @@ public interface IDocument FontHeighScalar HeightScalar { get; set; } /// - /// Returns a buffer with all content and effect packed up per the - /// ESC/POS protocol. This buffer must contain all effect setup - /// commands, the content, and all effect tear down commands. + /// Auto-apply a newline after this document /// - /// byte buffer - byte[] ToBuffer(); + bool AutoNewline { get; set; } } } diff --git a/ThermalTalk/IPrinter.cs b/ThermalTalk/IPrinter.cs index fee1fc7..ce92a0e 100644 --- a/ThermalTalk/IPrinter.cs +++ b/ThermalTalk/IPrinter.cs @@ -92,11 +92,18 @@ interface IPrinter : System.IDisposable void Reinitialize(); /// - /// Print str as ASCII text. + /// Print string as ASCII text. Any effects that are currently + /// active will be applied to this string. /// - /// + /// ASCII stirng to print void PrintASCIIString(string str); + /// + /// Prints the specified document + /// + /// Document to print + void PrintDocument(IDocument doc); + /// /// Emit one newline character and return print /// position to start of line. diff --git a/ThermalTalk/Reliance/ReliancePrinter.cs b/ThermalTalk/Reliance/ReliancePrinter.cs index 886a387..8366399 100644 --- a/ThermalTalk/Reliance/ReliancePrinter.cs +++ b/ThermalTalk/Reliance/ReliancePrinter.cs @@ -256,6 +256,34 @@ public void PrintASCIIString(string str) internalSend(ASCIIEncoding.ASCII.GetBytes(str)); } + public void PrintDocument(IDocument doc) + { + // Keep track of current settings so we can restore + var oldJustification = Justification; + var oldWidth = Width; + var oldHeight = Height; + + // First apply all effects. The firwmare decides if any there + // are any conflicts and there is nothing we can do about that. + // Apply the rest of the settings before we send string + AddEffect(doc.Effects); + SetJustification(doc.Justification); + SetScalars(doc.WidthScalar, doc.HeightScalar); + + // Send the actual content + internalSend(ASCIIEncoding.ASCII.GetBytes(doc.Content)); + + if(doc.AutoNewline) + { + PrintNewline(); + } + + // Undo all the settings we just set + RemoveEffect(doc.Effects); + SetJustification(oldJustification); + SetScalars(oldWidth, oldHeight); + } + /// /// Encodes the specified string as a center justified 2D barcode. /// This 2D barcode is compliant with the QR Code® specicification and can be read by all 2D barcode readers. diff --git a/ThermalTalk/StandardDocument.cs b/ThermalTalk/StandardDocument.cs new file mode 100644 index 0000000..cc13fa3 --- /dev/null +++ b/ThermalTalk/StandardDocument.cs @@ -0,0 +1,22 @@ +namespace ThermalTalk +{ + using System; + + /// + /// Standard document implementation + /// + public class StandardDocument : IDocument + { + public string Content { get; set; } + + public FontEffects Effects { get; set; } + + public FontJustification Justification { get; set; } + + public FontWidthScalar WidthScalar { get; set; } + + public FontHeighScalar HeightScalar { get; set; } + + public bool AutoNewline { get; set; } + } +} diff --git a/ThermalTalk/ThermalTalk.csproj b/ThermalTalk/ThermalTalk.csproj index d26c890..ea0061c 100644 --- a/ThermalTalk/ThermalTalk.csproj +++ b/ThermalTalk/ThermalTalk.csproj @@ -68,6 +68,7 @@ + From dafb99fba33595932093e6cc14f0db1c273e5eb8 Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Wed, 26 Apr 2017 14:55:06 -0700 Subject: [PATCH 11/47] Rename RelianceConnection and ReliancePrinter Differentiate so we can implement Win and HID in the future --- ThermalConsole/Program.cs | 2 +- ThermalTalk.Test/HW_ReliancePrintTest.cs | 2 +- ThermalTalk.Test/RelianceEffectsTest.cs | 6 ++-- ThermalTalk.Test/RelianceStatusTests.cs | 14 +++++----- ...nection.cs => RelianceSerialConnection.cs} | 8 +++--- ...ncePrinter.cs => RelianceSerialPrinter.cs} | 28 ++++--------------- ThermalTalk/ThermalTalk.csproj | 4 +-- 7 files changed, 23 insertions(+), 41 deletions(-) rename ThermalTalk/Reliance/{RelianceConnection.cs => RelianceSerialConnection.cs} (97%) rename ThermalTalk/Reliance/{ReliancePrinter.cs => RelianceSerialPrinter.cs} (94%) diff --git a/ThermalConsole/Program.cs b/ThermalConsole/Program.cs index 9631586..c88f215 100644 --- a/ThermalConsole/Program.cs +++ b/ThermalConsole/Program.cs @@ -41,7 +41,7 @@ static void Main(string[] args) int count = 1; while (true) { - using (var printer = new ReliancePrinter(commport)) + using (var printer = new RelianceSerialPrinter(commport)) using(var image = ThermalTalk.Imaging.Webcam.GrabPicture()) { diff --git a/ThermalTalk.Test/HW_ReliancePrintTest.cs b/ThermalTalk.Test/HW_ReliancePrintTest.cs index db2ede4..222dfed 100644 --- a/ThermalTalk.Test/HW_ReliancePrintTest.cs +++ b/ThermalTalk.Test/HW_ReliancePrintTest.cs @@ -10,7 +10,7 @@ public class HW_ReliancePrintTest [Test()] public void RealHardwareTests() { - var printer = new ReliancePrinter(TEST_PORT); + var printer = new RelianceSerialPrinter(TEST_PORT); Assert.IsNotNull(printer); diff --git a/ThermalTalk.Test/RelianceEffectsTest.cs b/ThermalTalk.Test/RelianceEffectsTest.cs index 88ee683..a16b733 100644 --- a/ThermalTalk.Test/RelianceEffectsTest.cs +++ b/ThermalTalk.Test/RelianceEffectsTest.cs @@ -10,7 +10,7 @@ public class ReliancePrinterTests [Test()] public void RelianceEffectsTest() { - var printer = new ReliancePrinter(TEST_PORT); + var printer = new RelianceSerialPrinter(TEST_PORT); Assert.IsNotNull(printer); Assert.AreEqual(FontEffects.None, printer.Effects); @@ -61,7 +61,7 @@ public void RelianceEffectsTest() [Test()] public void RelianceJustificationTest() { - var printer = new ReliancePrinter(TEST_PORT); + var printer = new RelianceSerialPrinter(TEST_PORT); Assert.IsNotNull(printer); Assert.AreEqual(FontJustification.JustifyLeft, printer.Justification); @@ -81,7 +81,7 @@ public void RelianceJustificationTest() public void RelianceScalarTest() { // Test ctor - var printer = new ReliancePrinter(TEST_PORT); + var printer = new RelianceSerialPrinter(TEST_PORT); Assert.IsNotNull(printer); // Ensure defaults are set diff --git a/ThermalTalk.Test/RelianceStatusTests.cs b/ThermalTalk.Test/RelianceStatusTests.cs index 8d1716a..2772933 100644 --- a/ThermalTalk.Test/RelianceStatusTests.cs +++ b/ThermalTalk.Test/RelianceStatusTests.cs @@ -10,7 +10,7 @@ public class ReliancePrinterTests public void ReliancePrinterTest() { // Test ctor - var printer = new ReliancePrinter(TEST_PORT); + var printer = new RelianceSerialPrinter(TEST_PORT); Assert.IsNotNull(printer); } @@ -19,7 +19,7 @@ public void GetStatusTest_Status() { // Tests may run in parallel and since we are using a serial port // we should just run all queries in one test to avoid access issues. - var printer = new ReliancePrinter(TEST_PORT); + var printer = new RelianceSerialPrinter(TEST_PORT); var status = printer.GetStatus(StatusRequests.Status); @@ -52,7 +52,7 @@ public void GetStatusTest_OffLineStatus() { // Tests may run in parallel and since we are using a serial port // we should just run all queries in one test to avoid access issues. - var printer = new ReliancePrinter(TEST_PORT); + var printer = new RelianceSerialPrinter(TEST_PORT); var status = printer.GetStatus(StatusRequests.OffLineStatus); @@ -86,7 +86,7 @@ public void GetStatusTest_ErrorStatus() { // Tests may run in parallel and since we are using a serial port // we should just run all queries in one test to avoid access issues. - var printer = new ReliancePrinter(TEST_PORT); + var printer = new RelianceSerialPrinter(TEST_PORT); var status = printer.GetStatus(StatusRequests.ErrorStatus); @@ -120,7 +120,7 @@ public void GetStatusTest_PaperRollStatus() { // Tests may run in parallel and since we are using a serial port // we should just run all queries in one test to avoid access issues. - var printer = new ReliancePrinter(TEST_PORT); + var printer = new RelianceSerialPrinter(TEST_PORT); var status = printer.GetStatus(StatusRequests.PaperRollStatus); @@ -153,7 +153,7 @@ public void GetStatusTest_PrintStatus() { // Tests may run in parallel and since we are using a serial port // we should just run all queries in one test to avoid access issues. - var printer = new ReliancePrinter(TEST_PORT); + var printer = new RelianceSerialPrinter(TEST_PORT); var status = printer.GetStatus(StatusRequests.PrintStatus); @@ -186,7 +186,7 @@ public void GetStatusTest_FullStatus() { // Tests may run in parallel and since we are using a serial port // we should just run all queries in one test to avoid access issues. - var printer = new ReliancePrinter(TEST_PORT); + var printer = new RelianceSerialPrinter(TEST_PORT); var status = printer.GetStatus(StatusRequests.FullStatus); diff --git a/ThermalTalk/Reliance/RelianceConnection.cs b/ThermalTalk/Reliance/RelianceSerialConnection.cs similarity index 97% rename from ThermalTalk/Reliance/RelianceConnection.cs rename to ThermalTalk/Reliance/RelianceSerialConnection.cs index 54504fb..69576a8 100644 --- a/ThermalTalk/Reliance/RelianceConnection.cs +++ b/ThermalTalk/Reliance/RelianceSerialConnection.cs @@ -31,7 +31,7 @@ namespace ThermalTalk /// /// Reliance serial port implementation /// - class RelianceConnection : ISerialConnection + class RelianceSerialConnection : ISerialConnection { #region Default SerialPort Params const int DefaultBaudRate = 19200; @@ -48,15 +48,15 @@ class RelianceConnection : ISerialConnection #endregion #region Constructor - public RelianceConnection(string portName) + public RelianceSerialConnection(string portName) : this(portName, DefaultBaudRate) { } - public RelianceConnection(string portName, int baud) + public RelianceSerialConnection(string portName, int baud) : this(portName, baud, DefaultDatabits, DefaultParity, DefaultStopbits, DefaultHandshake) { } - public RelianceConnection(string portName, + public RelianceSerialConnection(string portName, int baud, int databits, Parity parity, diff --git a/ThermalTalk/Reliance/ReliancePrinter.cs b/ThermalTalk/Reliance/RelianceSerialPrinter.cs similarity index 94% rename from ThermalTalk/Reliance/ReliancePrinter.cs rename to ThermalTalk/Reliance/RelianceSerialPrinter.cs index 8366399..3718f92 100644 --- a/ThermalTalk/Reliance/ReliancePrinter.cs +++ b/ThermalTalk/Reliance/RelianceSerialPrinter.cs @@ -30,7 +30,7 @@ namespace ThermalTalk /// /// Reliance Printer is the primary handle for accessing the printer API /// - public class ReliancePrinter : IPrinter + public class RelianceSerialPrinter : IPrinter { const int DefaultReadTimeout = 1000; /// ms @@ -41,7 +41,7 @@ public class ReliancePrinter : IPrinter private readonly static Dictionary EnableCommands; private readonly static Dictionary DisableCommands; - static ReliancePrinter() + static RelianceSerialPrinter() { EnableCommands = new Dictionary() { @@ -68,33 +68,21 @@ static ReliancePrinter() #endregion - /// - /// Constructs a new instance of ReliancePrinter. This printer - /// acts as a handle to all features and functions - /// - /// OS name of serial port - public ReliancePrinter(string serialPortName) - : this(serialPortName, string.Empty) - { } - /// /// Constructs a new instance of ReliancePrinter. This printer /// acts as a handle to all features and functions. If the serial port parameter /// is provided, the serial connection will be opened immediately. /// /// OS name of serial port - /// OS name of printer - public ReliancePrinter(string serialPortName, string printerName) + public RelianceSerialPrinter(string serialPortName) { - PrinterName = printerName; - // User wants a serial port if (!string.IsNullOrEmpty(serialPortName)) { PrintSerialReadTimeout = DefaultReadTimeout; PrintSerialBaudRate = DefaultBaudRate; - Connection = new RelianceConnection(serialPortName, PrintSerialBaudRate); + Connection = new RelianceSerialConnection(serialPortName, PrintSerialBaudRate); Connection.ReadTimeoutMS = DefaultReadTimeout; } @@ -104,7 +92,7 @@ public ReliancePrinter(string serialPortName, string printerName) /// /// Destructor - Close and dispose serial port if needed /// - ~ReliancePrinter() + ~RelianceSerialPrinter() { if (Connection != null) { @@ -112,14 +100,8 @@ public ReliancePrinter(string serialPortName, string printerName) } } - public ISerialConnection Connection { get; private set; } - /// - /// Gets or replaces the name this printer was constructed with - /// - public string PrinterName { get; set; } - /// /// Gets or sets the read timeout in milliseconds /// diff --git a/ThermalTalk/ThermalTalk.csproj b/ThermalTalk/ThermalTalk.csproj index ea0061c..bc27840 100644 --- a/ThermalTalk/ThermalTalk.csproj +++ b/ThermalTalk/ThermalTalk.csproj @@ -64,8 +64,8 @@ - - + + From 31492c81915dae7696d2c5b6365f96e66d5b154e Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Wed, 26 Apr 2017 14:56:37 -0700 Subject: [PATCH 12/47] Change my mind about the names --- ThermalConsole/Program.cs | 2 +- ThermalTalk.Test/HW_ReliancePrintTest.cs | 2 +- ThermalTalk.Test/RelianceEffectsTest.cs | 6 +++--- ThermalTalk.Test/RelianceStatusTests.cs | 14 +++++++------- ...RelianceSerialPrinter.cs => ReliancePrinter.cs} | 10 +++++----- ...ceSerialConnection.cs => RelianceSerialPort.cs} | 8 ++++---- ThermalTalk/ThermalTalk.csproj | 4 ++-- 7 files changed, 23 insertions(+), 23 deletions(-) rename ThermalTalk/Reliance/{RelianceSerialPrinter.cs => ReliancePrinter.cs} (98%) rename ThermalTalk/Reliance/{RelianceSerialConnection.cs => RelianceSerialPort.cs} (97%) diff --git a/ThermalConsole/Program.cs b/ThermalConsole/Program.cs index c88f215..9631586 100644 --- a/ThermalConsole/Program.cs +++ b/ThermalConsole/Program.cs @@ -41,7 +41,7 @@ static void Main(string[] args) int count = 1; while (true) { - using (var printer = new RelianceSerialPrinter(commport)) + using (var printer = new ReliancePrinter(commport)) using(var image = ThermalTalk.Imaging.Webcam.GrabPicture()) { diff --git a/ThermalTalk.Test/HW_ReliancePrintTest.cs b/ThermalTalk.Test/HW_ReliancePrintTest.cs index 222dfed..db2ede4 100644 --- a/ThermalTalk.Test/HW_ReliancePrintTest.cs +++ b/ThermalTalk.Test/HW_ReliancePrintTest.cs @@ -10,7 +10,7 @@ public class HW_ReliancePrintTest [Test()] public void RealHardwareTests() { - var printer = new RelianceSerialPrinter(TEST_PORT); + var printer = new ReliancePrinter(TEST_PORT); Assert.IsNotNull(printer); diff --git a/ThermalTalk.Test/RelianceEffectsTest.cs b/ThermalTalk.Test/RelianceEffectsTest.cs index a16b733..88ee683 100644 --- a/ThermalTalk.Test/RelianceEffectsTest.cs +++ b/ThermalTalk.Test/RelianceEffectsTest.cs @@ -10,7 +10,7 @@ public class ReliancePrinterTests [Test()] public void RelianceEffectsTest() { - var printer = new RelianceSerialPrinter(TEST_PORT); + var printer = new ReliancePrinter(TEST_PORT); Assert.IsNotNull(printer); Assert.AreEqual(FontEffects.None, printer.Effects); @@ -61,7 +61,7 @@ public void RelianceEffectsTest() [Test()] public void RelianceJustificationTest() { - var printer = new RelianceSerialPrinter(TEST_PORT); + var printer = new ReliancePrinter(TEST_PORT); Assert.IsNotNull(printer); Assert.AreEqual(FontJustification.JustifyLeft, printer.Justification); @@ -81,7 +81,7 @@ public void RelianceJustificationTest() public void RelianceScalarTest() { // Test ctor - var printer = new RelianceSerialPrinter(TEST_PORT); + var printer = new ReliancePrinter(TEST_PORT); Assert.IsNotNull(printer); // Ensure defaults are set diff --git a/ThermalTalk.Test/RelianceStatusTests.cs b/ThermalTalk.Test/RelianceStatusTests.cs index 2772933..8d1716a 100644 --- a/ThermalTalk.Test/RelianceStatusTests.cs +++ b/ThermalTalk.Test/RelianceStatusTests.cs @@ -10,7 +10,7 @@ public class ReliancePrinterTests public void ReliancePrinterTest() { // Test ctor - var printer = new RelianceSerialPrinter(TEST_PORT); + var printer = new ReliancePrinter(TEST_PORT); Assert.IsNotNull(printer); } @@ -19,7 +19,7 @@ public void GetStatusTest_Status() { // Tests may run in parallel and since we are using a serial port // we should just run all queries in one test to avoid access issues. - var printer = new RelianceSerialPrinter(TEST_PORT); + var printer = new ReliancePrinter(TEST_PORT); var status = printer.GetStatus(StatusRequests.Status); @@ -52,7 +52,7 @@ public void GetStatusTest_OffLineStatus() { // Tests may run in parallel and since we are using a serial port // we should just run all queries in one test to avoid access issues. - var printer = new RelianceSerialPrinter(TEST_PORT); + var printer = new ReliancePrinter(TEST_PORT); var status = printer.GetStatus(StatusRequests.OffLineStatus); @@ -86,7 +86,7 @@ public void GetStatusTest_ErrorStatus() { // Tests may run in parallel and since we are using a serial port // we should just run all queries in one test to avoid access issues. - var printer = new RelianceSerialPrinter(TEST_PORT); + var printer = new ReliancePrinter(TEST_PORT); var status = printer.GetStatus(StatusRequests.ErrorStatus); @@ -120,7 +120,7 @@ public void GetStatusTest_PaperRollStatus() { // Tests may run in parallel and since we are using a serial port // we should just run all queries in one test to avoid access issues. - var printer = new RelianceSerialPrinter(TEST_PORT); + var printer = new ReliancePrinter(TEST_PORT); var status = printer.GetStatus(StatusRequests.PaperRollStatus); @@ -153,7 +153,7 @@ public void GetStatusTest_PrintStatus() { // Tests may run in parallel and since we are using a serial port // we should just run all queries in one test to avoid access issues. - var printer = new RelianceSerialPrinter(TEST_PORT); + var printer = new ReliancePrinter(TEST_PORT); var status = printer.GetStatus(StatusRequests.PrintStatus); @@ -186,7 +186,7 @@ public void GetStatusTest_FullStatus() { // Tests may run in parallel and since we are using a serial port // we should just run all queries in one test to avoid access issues. - var printer = new RelianceSerialPrinter(TEST_PORT); + var printer = new ReliancePrinter(TEST_PORT); var status = printer.GetStatus(StatusRequests.FullStatus); diff --git a/ThermalTalk/Reliance/RelianceSerialPrinter.cs b/ThermalTalk/Reliance/ReliancePrinter.cs similarity index 98% rename from ThermalTalk/Reliance/RelianceSerialPrinter.cs rename to ThermalTalk/Reliance/ReliancePrinter.cs index 3718f92..072a3a0 100644 --- a/ThermalTalk/Reliance/RelianceSerialPrinter.cs +++ b/ThermalTalk/Reliance/ReliancePrinter.cs @@ -30,7 +30,7 @@ namespace ThermalTalk /// /// Reliance Printer is the primary handle for accessing the printer API /// - public class RelianceSerialPrinter : IPrinter + public class ReliancePrinter : IPrinter { const int DefaultReadTimeout = 1000; /// ms @@ -41,7 +41,7 @@ public class RelianceSerialPrinter : IPrinter private readonly static Dictionary EnableCommands; private readonly static Dictionary DisableCommands; - static RelianceSerialPrinter() + static ReliancePrinter() { EnableCommands = new Dictionary() { @@ -74,7 +74,7 @@ static RelianceSerialPrinter() /// is provided, the serial connection will be opened immediately. /// /// OS name of serial port - public RelianceSerialPrinter(string serialPortName) + public ReliancePrinter(string serialPortName) { // User wants a serial port if (!string.IsNullOrEmpty(serialPortName)) @@ -82,7 +82,7 @@ public RelianceSerialPrinter(string serialPortName) PrintSerialReadTimeout = DefaultReadTimeout; PrintSerialBaudRate = DefaultBaudRate; - Connection = new RelianceSerialConnection(serialPortName, PrintSerialBaudRate); + Connection = new RelianceSerialPort(serialPortName, PrintSerialBaudRate); Connection.ReadTimeoutMS = DefaultReadTimeout; } @@ -92,7 +92,7 @@ public RelianceSerialPrinter(string serialPortName) /// /// Destructor - Close and dispose serial port if needed /// - ~RelianceSerialPrinter() + ~ReliancePrinter() { if (Connection != null) { diff --git a/ThermalTalk/Reliance/RelianceSerialConnection.cs b/ThermalTalk/Reliance/RelianceSerialPort.cs similarity index 97% rename from ThermalTalk/Reliance/RelianceSerialConnection.cs rename to ThermalTalk/Reliance/RelianceSerialPort.cs index 69576a8..48bb11f 100644 --- a/ThermalTalk/Reliance/RelianceSerialConnection.cs +++ b/ThermalTalk/Reliance/RelianceSerialPort.cs @@ -31,7 +31,7 @@ namespace ThermalTalk /// /// Reliance serial port implementation /// - class RelianceSerialConnection : ISerialConnection + class RelianceSerialPort : ISerialConnection { #region Default SerialPort Params const int DefaultBaudRate = 19200; @@ -48,15 +48,15 @@ class RelianceSerialConnection : ISerialConnection #endregion #region Constructor - public RelianceSerialConnection(string portName) + public RelianceSerialPort(string portName) : this(portName, DefaultBaudRate) { } - public RelianceSerialConnection(string portName, int baud) + public RelianceSerialPort(string portName, int baud) : this(portName, baud, DefaultDatabits, DefaultParity, DefaultStopbits, DefaultHandshake) { } - public RelianceSerialConnection(string portName, + public RelianceSerialPort(string portName, int baud, int databits, Parity parity, diff --git a/ThermalTalk/ThermalTalk.csproj b/ThermalTalk/ThermalTalk.csproj index bc27840..d89944e 100644 --- a/ThermalTalk/ThermalTalk.csproj +++ b/ThermalTalk/ThermalTalk.csproj @@ -64,8 +64,8 @@ - - + + From 38af010dbc4194d49c02a7ba410c81481f5269fd Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Wed, 26 Apr 2017 15:28:49 -0700 Subject: [PATCH 13/47] Create base serial port Use as abstract base between Phoenix and Reliance --- ThermalTalk/Common/BaseSerialPort.cs | 202 +++++++++++++++++++++ ThermalTalk/Phoenix/PhoenixSerialPort.cs | 50 +++++ ThermalTalk/Reliance/RelianceSerialPort.cs | 187 +------------------ 3 files changed, 261 insertions(+), 178 deletions(-) create mode 100644 ThermalTalk/Common/BaseSerialPort.cs create mode 100644 ThermalTalk/Phoenix/PhoenixSerialPort.cs diff --git a/ThermalTalk/Common/BaseSerialPort.cs b/ThermalTalk/Common/BaseSerialPort.cs new file mode 100644 index 0000000..a75b86a --- /dev/null +++ b/ThermalTalk/Common/BaseSerialPort.cs @@ -0,0 +1,202 @@ +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk +{ + using System.IO.Ports; + using System.Threading; + + abstract class BaseSerialPort : ISerialConnection + { + #region Fields + protected readonly SerialPort _mPort; + protected int _mReadTimeout; + protected int _mWriteTimeout; + #endregion + + #region Constructor + protected BaseSerialPort(string portName, + int baud, + int databits, + Parity parity, + StopBits stopbits, + Handshake handshake) + { + Name = portName; + + _mPort = new SerialPort(portName, baud, parity, databits, stopbits); + _mPort.Encoding = System.Text.Encoding.GetEncoding("Windows-1252"); + _mPort.Handshake = handshake; + _mPort.WriteTimeout = _mWriteTimeout = 500; + _mPort.ReadTimeout = _mReadTimeout = 500; + } + #endregion + + #region Properties + /// + /// Gets the serial port name for this connection + /// + public string Name { get; private set; } + + /// + /// Gets or Sets the read timeout in milliseconds + /// + public int ReadTimeoutMS + { + get { return _mReadTimeout; } + set + { + _mReadTimeout = value; + _mPort.ReadTimeout = value; + } + } + + /// + /// Gets or Sets the write timeout in milliseconds + /// + public int WriteTimeoutMS + { + get { return _mWriteTimeout; } + set + { + _mWriteTimeout = value; + _mPort.WriteTimeout = value; + } + } + + #endregion + + public ReturnCode Open() + { + if (_mPort.IsOpen) return ReturnCode.Success; + + try + { + _mPort.Open(); + return ReturnCode.Success; + } + catch(System.IO.IOException) + { + return ReturnCode.ConnectionNotFound; + } + catch(System.AccessViolationException) + { + return ReturnCode.ConnectionAlreadyOpen; + } + } + + public ReturnCode Close() + { + if (!_mPort.IsOpen) return ReturnCode.Success; + + try + { + _mPort.Close(); + return ReturnCode.Success; + } + catch + { + return ReturnCode.ExecutionFailure; + } + } + + + public int Write(byte[] payload) + { + return WritePort(payload); + } + + public byte[] Read(int n) + { + return ReadPort(n); + } + + public void Dispose() + { + if(_mPort != null) + { + Close(); + _mPort.Dispose(); + } + } + + #region Protected + /// + /// Writes data to the printer serial port + /// + /// Data to send + /// Number of bytes written + protected int WritePort(byte[] data) + { + try + { + // Split into chunks to avoid overrunning target buffer + foreach (var s in data.Split(256)) + { + _mPort.Write(s, 0, s.Length); + Thread.Sleep(10); + } + + return data.Length; + } + catch + { + return 0; + } + } + + /// + /// Reads count bytes from serial port. If count bytes are unavailable, this + /// function will block until the read times out. If there is an exception or + /// not all expected data is received, an empty buffer will be returned. + /// + /// Number of bytes to read from port. + /// Bytes read from port. + protected byte[] ReadPort(int count) + { + + byte[] buff = new byte[count]; + + try + { + + // Attempt to read count bytes + var read = _mPort.Read(buff, 0, count); + + // If we don't get enough, reset buffer to 0 length + if (read != count) + { + buff = new byte[0]; + } + + } + catch + { + buff = new byte[0]; + } + + return buff; + } + #endregion + } +} diff --git a/ThermalTalk/Phoenix/PhoenixSerialPort.cs b/ThermalTalk/Phoenix/PhoenixSerialPort.cs new file mode 100644 index 0000000..c7fe2bb --- /dev/null +++ b/ThermalTalk/Phoenix/PhoenixSerialPort.cs @@ -0,0 +1,50 @@ +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk +{ + using System.IO.Ports; + + class PhoenixSerialPort : BaseSerialPort + { + + #region Default SerialPort Params + private const int DefaultBaudRate = 9600; + private const int DefaultDatabits = 8; + private const Parity DefaultParity = Parity.None; + private const StopBits DefaultStopbits = StopBits.One; + private const Handshake DefaultHandshake = Handshake.None; + #endregion + + #region Constructor + public PhoenixSerialPort(string portName) + : this(portName, DefaultBaudRate) + { } + + public PhoenixSerialPort(string portName, int baud) + : base(portName, baud, DefaultDatabits, DefaultParity, DefaultStopbits, DefaultHandshake) + { } + + #endregion + } +} diff --git a/ThermalTalk/Reliance/RelianceSerialPort.cs b/ThermalTalk/Reliance/RelianceSerialPort.cs index 48bb11f..76cd8aa 100644 --- a/ThermalTalk/Reliance/RelianceSerialPort.cs +++ b/ThermalTalk/Reliance/RelianceSerialPort.cs @@ -26,25 +26,18 @@ namespace ThermalTalk using System; using System.IO.Ports; using System.Runtime.InteropServices; - using System.Threading; /// /// Reliance serial port implementation /// - class RelianceSerialPort : ISerialConnection + class RelianceSerialPort : BaseSerialPort { #region Default SerialPort Params - const int DefaultBaudRate = 19200; - const int DefaultDatabits = 8; - const Parity DefaultParity = Parity.None; - const StopBits DefaultStopbits = StopBits.One; - const Handshake DefaultHandshake = Handshake.None; - #endregion - - #region Fields - private readonly SerialPort _mPort; - private int _mReadTimeout; - private int _mWriteTimeout; + private const int DefaultBaudRate = 19200; + private const int DefaultDatabits = 8; + private const Parity DefaultParity = Parity.None; + private const StopBits DefaultStopbits = StopBits.One; + private const Handshake DefaultHandshake = Handshake.None; #endregion #region Constructor @@ -53,115 +46,11 @@ public RelianceSerialPort(string portName) { } public RelianceSerialPort(string portName, int baud) - : this(portName, baud, DefaultDatabits, DefaultParity, DefaultStopbits, DefaultHandshake) + : base(portName, baud, DefaultDatabits, DefaultParity, DefaultStopbits, DefaultHandshake) { } - public RelianceSerialPort(string portName, - int baud, - int databits, - Parity parity, - StopBits stopbits, - Handshake handshake) - { - Name = portName; - - _mPort = new SerialPort(portName, baud, parity, databits, stopbits); - _mPort.Encoding = System.Text.Encoding.GetEncoding("Windows-1252"); - _mPort.Handshake = handshake; - _mPort.WriteTimeout = _mWriteTimeout = 500; - _mPort.ReadTimeout = _mReadTimeout = 500; - } - #endregion - - #region Properties - /// - /// Gets the serial port name for this connection - /// - public string Name { get; private set; } - - /// - /// Gets or Sets the read timeout in milliseconds - /// - public int ReadTimeoutMS - { - get { return _mReadTimeout; } - set - { - _mReadTimeout = value; - _mPort.ReadTimeout = value; - } - } - - /// - /// Gets or Sets the write timeout in milliseconds - /// - public int WriteTimeoutMS - { - get { return _mWriteTimeout; } - set - { - _mWriteTimeout = value; - _mPort.WriteTimeout = value; - } - } - #endregion - public ReturnCode Open() - { - if (_mPort.IsOpen) return ReturnCode.Success; - - try - { - _mPort.Open(); - return ReturnCode.Success; - } - catch(System.IO.IOException) - { - return ReturnCode.ConnectionNotFound; - } - catch(System.AccessViolationException) - { - return ReturnCode.ConnectionAlreadyOpen; - } - } - - public ReturnCode Close() - { - if (!_mPort.IsOpen) return ReturnCode.Success; - - try - { - _mPort.Close(); - return ReturnCode.Success; - } - catch - { - return ReturnCode.ExecutionFailure; - } - } - - - public int Write(byte[] payload) - { - return WritePort(payload); - } - - public byte[] Read(int n) - { - return ReadPort(n); - } - - public void Dispose() - { - if(_mPort != null) - { - Close(); - _mPort.Dispose(); - } - } - - /// /// Write raw data to printer through its Windows print handle /// @@ -182,6 +71,7 @@ public static ReturnCode WritePrinter(string printerName, byte[] data) return result ? ReturnCode.Success : ReturnCode.ExecutionFailure; } + /// /// Reads count bytes from printer /// @@ -206,65 +96,6 @@ public static byte[] ReadPrinter(string printerName, int count) } return returnbytes; - } - - #region Private - /// - /// Writes data to the printer serial port - /// - /// Data to send - /// Number of bytes written - private int WritePort(byte[] data) - { - try - { - // Split into chunks to avoid overrunning target buffer - foreach (var s in data.Split(256)) - { - _mPort.Write(s, 0, s.Length); - Thread.Sleep(10); - } - - return data.Length; - } - catch - { - return 0; - } - } - - /// - /// Reads count bytes from serial port. If count bytes are unavailable, this - /// function will block until the read times out. If there is an exception or - /// not all expected data is received, an empty buffer will be returned. - /// - /// Number of bytes to read from port. - /// Bytes read from port. - private byte[] ReadPort(int count) - { - - byte[] buff = new byte[count]; - - try - { - - // Attempt to read count bytes - var read = _mPort.Read(buff, 0, count); - - // If we don't get enough, reset buffer to 0 length - if (read != count) - { - buff = new byte[0]; - } - - } - catch - { - buff = new byte[0]; - } - - return buff; - } - #endregion + } } } From 5460437d60280bab9238355fd0f9b8157ad98c51 Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Wed, 26 Apr 2017 15:29:36 -0700 Subject: [PATCH 14/47] Create base printer Use abstract base printer class between reliance and phoenix --- ThermalTalk/Common/BasePrinter.cs | 247 +++++++++++++++++++++++ ThermalTalk/IPrinter.cs | 5 - ThermalTalk/Phoenix/PhoenixPrinter.cs | 90 +++++++++ ThermalTalk/Reliance/ReliancePrinter.cs | 258 ++---------------------- ThermalTalk/ThermalTalk.csproj | 4 + 5 files changed, 361 insertions(+), 243 deletions(-) create mode 100644 ThermalTalk/Common/BasePrinter.cs create mode 100644 ThermalTalk/Phoenix/PhoenixPrinter.cs diff --git a/ThermalTalk/Common/BasePrinter.cs b/ThermalTalk/Common/BasePrinter.cs new file mode 100644 index 0000000..49b9de0 --- /dev/null +++ b/ThermalTalk/Common/BasePrinter.cs @@ -0,0 +1,247 @@ +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk +{ + using System.Collections.Generic; + using System.Text; + + public abstract class BasePrinter : IPrinter + { + protected Dictionary EnableCommands = new Dictionary(); + protected Dictionary DisableCommands = new Dictionary(); + protected Dictionary JustificationCommands = new Dictionary(); + protected byte[] SetScalarCommand = new byte[0]; + protected byte[] InitPrinterCommand = new byte[0]; + protected byte[] FormFeedCommand = new byte[0]; + protected byte[] NewLineCommand = new byte[0]; + + /// + /// Destructor - Close and dispose serial port if needed + /// + ~BasePrinter() + { + if (Connection != null) + { + Connection.Dispose(); + } + } + + /// + /// Gets the serial connection for this device + /// + protected ISerialConnection Connection { get; set; } + + /// + /// Gets or sets the read timeout in milliseconds + /// + public int PrintSerialReadTimeout { get; set; } + + /// + /// Gets or sets the serial port baud rate + /// + public int PrintSerialBaudRate { get; set; } + + /// + /// Gets or Sets the font's height scalar + /// + public FontHeighScalar Height { get; private set; } + + /// + /// Gets or Sets the font's width scalar + /// + public FontWidthScalar Width { get; private set; } + + /// + /// Gets the active font effects + /// + public FontEffects Effects { get; private set; } + + /// + /// Gets or sets the active justification + /// + public FontJustification Justification { get; private set; } + + public void Reinitialize() + { + Justification = FontJustification.JustifyLeft; + Width = FontWidthScalar.w1; + Height = FontHeighScalar.h1; + Effects = FontEffects.None; + + internalSend(InitPrinterCommand); + } + + + /// + /// Applies the specified scalars + /// + /// Width scalar + /// Height scalar + public void SetScalars(FontWidthScalar w, FontHeighScalar h) + { + Width = w; + Height = h; + + byte wb = (byte)w; + byte hb = (byte)h; + + byte[] cmd = (byte[])SetScalarCommand.Clone(); + + cmd[2] = (byte)(wb | hb); + internalSend(cmd); + } + + /// + /// Applies the specified justification + /// + /// Justification to use + public void SetJustification(FontJustification justification) + { + Justification = justification; + + byte[] cmd = JustificationCommands[justification]; + if(cmd != null) + { + internalSend(cmd); + } + } + + public void AddEffect(FontEffects effect) + { + foreach (var flag in effect.GetFlags()) + { + // Lookup enable command and send if non-empty + var cmd = EnableCommands[flag]; + if(cmd.Length > 0) + { + internalSend(cmd); + } + } + + Effects |= effect; + } + + public void RemoveEffect(FontEffects effect) + { + foreach (var flag in effect.GetFlags()) + { + // Lookup enable command and send if non-empty + var cmd = DisableCommands[flag]; + if (cmd.Length > 0) + { + internalSend(cmd); + } + } + Effects &= ~effect; + } + + + + public void ClearAllEffects() + { + foreach (var cmd in DisableCommands.Values) + { + if (cmd.Length > 0) + { + internalSend(cmd); + } + } + Effects = FontEffects.None; + } + + public void PrintASCIIString(string str) + { + internalSend(ASCIIEncoding.ASCII.GetBytes(str)); + } + + public void PrintDocument(IDocument doc) + { + // Keep track of current settings so we can restore + var oldJustification = Justification; + var oldWidth = Width; + var oldHeight = Height; + + // First apply all effects. The firwmare decides if any there + // are any conflicts and there is nothing we can do about that. + // Apply the rest of the settings before we send string + AddEffect(doc.Effects); + SetJustification(doc.Justification); + SetScalars(doc.WidthScalar, doc.HeightScalar); + + // Send the actual content + internalSend(ASCIIEncoding.ASCII.GetBytes(doc.Content)); + + if(doc.AutoNewline) + { + PrintNewline(); + } + + // Undo all the settings we just set + RemoveEffect(doc.Effects); + SetJustification(oldJustification); + SetScalars(oldWidth, oldHeight); + } + + public void PrintNewline() + { + internalSend(NewLineCommand); + } + + public void FormFeed() + { + internalSend(FormFeedCommand); + } + + public void SendRaw(byte[] raw) + { + internalSend(raw); + } + + + public void Dispose() + { + if (Connection != null) + { + Connection.Dispose(); + } + } + + #region Private + protected void internalSend(byte[] payload) + { + try + { + Connection.Open(); + + Connection.Write(payload); + } + catch { } + finally + { + Connection.Close(); + } + } + #endregion + } +} diff --git a/ThermalTalk/IPrinter.cs b/ThermalTalk/IPrinter.cs index ce92a0e..91f42ff 100644 --- a/ThermalTalk/IPrinter.cs +++ b/ThermalTalk/IPrinter.cs @@ -25,11 +25,6 @@ namespace ThermalTalk { interface IPrinter : System.IDisposable { - /// - /// Gets the serial connection to use with this printer - /// - ISerialConnection Connection { get; } - /// /// Gets the active font effects /// diff --git a/ThermalTalk/Phoenix/PhoenixPrinter.cs b/ThermalTalk/Phoenix/PhoenixPrinter.cs new file mode 100644 index 0000000..d39bed6 --- /dev/null +++ b/ThermalTalk/Phoenix/PhoenixPrinter.cs @@ -0,0 +1,90 @@ +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk.Phoenix +{ + using System.Collections.Generic; + + public class PhoenixPrinter : BasePrinter + { + + const int DefaultReadTimeout = 1500; /// ms + const int DefaultBaudRate = 9600; + + /// + /// Constructs a new instance of ReliancePrinter. This printer + /// acts as a handle to all features and functions. If the serial port parameter + /// is provided, the serial connection will be opened immediately. + /// + /// OS name of serial port + public PhoenixPrinter(string serialPortName) + { + + EnableCommands = new Dictionary() + { + { FontEffects.None, new byte[0]}, + { FontEffects.Bold, new byte[] { 0x1B, 0x45, 0x1 }}, + { FontEffects.Italic, new byte[] { 0x1B, 0x34, 0x1 }}, + { FontEffects.Underline, new byte[] { 0x1B, 0x2D, 0x1 }}, + { FontEffects.Rotated, new byte[] { 0x1B, 0x56, 0x1 }}, + { FontEffects.Reversed, new byte[] { 0x1B, 0x42, 0x1 }}, + { FontEffects.UpsideDown, new byte[] { 0x1B, 0x7B, 0x1 }}, + }; + + DisableCommands = new Dictionary() + { + { FontEffects.None, new byte[0]}, + { FontEffects.Bold, new byte[] { 0x1B, 0x45, 0x0 }}, + { FontEffects.Italic, new byte[] { 0x1B, 0x34, 0x0 }}, + { FontEffects.Underline, new byte[] { 0x1B, 0x2D, 0x0 }}, + { FontEffects.Rotated, new byte[] { 0x1B, 0x56, 0x0 }}, + { FontEffects.Reversed, new byte[] { 0x1B, 0x42, 0x0 }}, + { FontEffects.UpsideDown, new byte[] { 0x1B, 0x7B, 0x0 }}, + }; + + JustificationCommands = new Dictionary() + { + { FontJustification.JustifyLeft, new byte[] { 0x1B, 0x61, 0x00 }}, + { FontJustification.JustifyCenter, new byte[] { 0x1B, 0x61, 0x01 }}, + { FontJustification.JustifyRight, new byte[] { 0x1B, 0x61, 0x02 }}, + }; + + SetScalarCommand = new byte[] { 0x1D, 0x21, 0x00}; // last byte set by tx func + FormFeedCommand = new byte[] { 0x0C }; + NewLineCommand = new byte[] { 0x0A }; + InitPrinterCommand = new byte[] { 0x1B, 0x40 }; + + // User wants a serial port + if (!string.IsNullOrEmpty(serialPortName)) + { + PrintSerialReadTimeout = DefaultReadTimeout; + PrintSerialBaudRate = DefaultBaudRate; + + Connection = new RelianceSerialPort(serialPortName, PrintSerialBaudRate); + Connection.ReadTimeoutMS = DefaultReadTimeout; + } + + Reinitialize(); + } + } +} diff --git a/ThermalTalk/Reliance/ReliancePrinter.cs b/ThermalTalk/Reliance/ReliancePrinter.cs index 072a3a0..423bee5 100644 --- a/ThermalTalk/Reliance/ReliancePrinter.cs +++ b/ThermalTalk/Reliance/ReliancePrinter.cs @@ -21,7 +21,6 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - namespace ThermalTalk { using System.Collections.Generic; @@ -30,19 +29,20 @@ namespace ThermalTalk /// /// Reliance Printer is the primary handle for accessing the printer API /// - public class ReliancePrinter : IPrinter + public class ReliancePrinter : BasePrinter { - const int DefaultReadTimeout = 1000; /// ms const int DefaultBaudRate = 19200; - - #region Static - private readonly static Dictionary EnableCommands; - private readonly static Dictionary DisableCommands; - - static ReliancePrinter() + /// + /// Constructs a new instance of ReliancePrinter. This printer + /// acts as a handle to all features and functions. If the serial port parameter + /// is provided, the serial connection will be opened immediately. + /// + /// OS name of serial port + public ReliancePrinter(string serialPortName) { + EnableCommands = new Dictionary() { { FontEffects.None, new byte[0]}, @@ -64,18 +64,19 @@ static ReliancePrinter() { FontEffects.Reversed, new byte[] { 0x1B, 0x42, 0x0 }}, { FontEffects.UpsideDown, new byte[] { 0x1B, 0x7B, 0x0 }}, }; - } - #endregion + JustificationCommands = new Dictionary() + { + { FontJustification.JustifyLeft, new byte[] { 0x1B, 0x61, 0x00 }}, + { FontJustification.JustifyCenter, new byte[] { 0x1B, 0x61, 0x01 }}, + { FontJustification.JustifyRight, new byte[] { 0x1B, 0x61, 0x02 }}, + }; + + SetScalarCommand = new byte[] { 0x1D, 0x21, 0x00}; // last byte set by tx func + FormFeedCommand = new byte[] { 0x0C }; + NewLineCommand = new byte[] { 0x0A }; + InitPrinterCommand = new byte[] { 0x1B, 0x40 }; - /// - /// Constructs a new instance of ReliancePrinter. This printer - /// acts as a handle to all features and functions. If the serial port parameter - /// is provided, the serial connection will be opened immediately. - /// - /// OS name of serial port - public ReliancePrinter(string serialPortName) - { // User wants a serial port if (!string.IsNullOrEmpty(serialPortName)) { @@ -89,183 +90,6 @@ public ReliancePrinter(string serialPortName) Reinitialize(); } - /// - /// Destructor - Close and dispose serial port if needed - /// - ~ReliancePrinter() - { - if (Connection != null) - { - Connection.Dispose(); - } - } - - public ISerialConnection Connection { get; private set; } - - /// - /// Gets or sets the read timeout in milliseconds - /// - public int PrintSerialReadTimeout { get; set; } - - /// - /// Gets or sets the serial port baud rate - /// - public int PrintSerialBaudRate { get; set; } - - /// - /// Gets or Sets the font's height scalar - /// - public FontHeighScalar Height { get; private set; } - - /// - /// Gets or Sets the font's width scalar - /// - public FontWidthScalar Width { get; private set; } - - /// - /// Gets the active font effects - /// - public FontEffects Effects { get; private set; } - - /// - /// Gets or sets the active justification - /// - public FontJustification Justification { get; private set; } - - public void Reinitialize() - { - Justification = FontJustification.JustifyLeft; - Width = FontWidthScalar.w1; - Height = FontHeighScalar.h1; - Effects = FontEffects.None; - - internalSend(new byte[] { 0x1B, 0x40 }); - } - - - /// - /// Applies the specified scalars - /// - /// Width scalar - /// Height scalar - public void SetScalars(FontWidthScalar w, FontHeighScalar h) - { - Width = w; - Height = h; - - byte wb = (byte)w; - byte hb = (byte)h; - - byte[] cmd = new byte[] { 0x1D, 0x21, 0x00 }; - - cmd[2] = (byte)(wb | hb); - internalSend(cmd); - } - - /// - /// Applies the specified justification - /// - /// Justification to use - public void SetJustification(FontJustification justification) - { - Justification = justification; - - byte[] cmd = null; - switch(justification) - { - case FontJustification.JustifyLeft: - cmd = new byte[] { 0x1B, 0x61, 0x0 }; - break; - case FontJustification.JustifyCenter: - cmd = new byte[] { 0x1B, 0x61, 0x1 }; - break; - case FontJustification.JustifyRight: - cmd = new byte[] { 0x1B, 0x61, 0x2 }; - break; - } - - if(cmd != null) - { - internalSend(cmd); - } - } - - public void AddEffect(FontEffects effect) - { - foreach (var flag in effect.GetFlags()) - { - // Lookup enable command and send if non-empty - var cmd = EnableCommands[flag]; - if(cmd.Length > 0) - { - internalSend(cmd); - } - } - - Effects |= effect; - } - - public void RemoveEffect(FontEffects effect) - { - foreach (var flag in effect.GetFlags()) - { - // Lookup enable command and send if non-empty - var cmd = DisableCommands[flag]; - if (cmd.Length > 0) - { - internalSend(cmd); - } - } - Effects &= ~effect; - } - - - - public void ClearAllEffects() - { - foreach (var cmd in DisableCommands.Values) - { - if (cmd.Length > 0) - { - internalSend(cmd); - } - } - Effects = FontEffects.None; - } - - public void PrintASCIIString(string str) - { - internalSend(ASCIIEncoding.ASCII.GetBytes(str)); - } - - public void PrintDocument(IDocument doc) - { - // Keep track of current settings so we can restore - var oldJustification = Justification; - var oldWidth = Width; - var oldHeight = Height; - - // First apply all effects. The firwmare decides if any there - // are any conflicts and there is nothing we can do about that. - // Apply the rest of the settings before we send string - AddEffect(doc.Effects); - SetJustification(doc.Justification); - SetScalars(doc.WidthScalar, doc.HeightScalar); - - // Send the actual content - internalSend(ASCIIEncoding.ASCII.GetBytes(doc.Content)); - - if(doc.AutoNewline) - { - PrintNewline(); - } - - // Undo all the settings we just set - RemoveEffect(doc.Effects); - SetJustification(oldJustification); - SetScalars(oldWidth, oldHeight); - } - /// /// Encodes the specified string as a center justified 2D barcode. /// This 2D barcode is compliant with the QR Code® specicification and can be read by all 2D barcode readers. @@ -283,21 +107,6 @@ public void Print2DBarcode(string encodeThis) } - public void PrintNewline() - { - internalSend(new byte[] { 0x0A }); - } - - public void FormFeed() - { - internalSend(new byte[] { 0x0C }); - } - - public void SendRaw(byte[] raw) - { - internalSend(raw); - } - /// /// This command is processed in real time. The reply to this command is sent /// whenever it is received and does not wait for previous ESC/POS commands to be executed first. @@ -420,32 +229,5 @@ public RealTimeStatus GetStatus(StatusRequests r) return rts; } - - - - public void Dispose() - { - if (Connection != null) - { - Connection.Dispose(); - } - } - - #region Private - private void internalSend(byte[] payload) - { - try - { - Connection.Open(); - - Connection.Write(payload); - } - catch { } - finally - { - Connection.Close(); - } - } - #endregion } } diff --git a/ThermalTalk/ThermalTalk.csproj b/ThermalTalk/ThermalTalk.csproj index d89944e..d9b296f 100644 --- a/ThermalTalk/ThermalTalk.csproj +++ b/ThermalTalk/ThermalTalk.csproj @@ -55,6 +55,8 @@ + + @@ -63,6 +65,8 @@ + + From f3e72a16840f6006ab51c284a793c29026fc43d0 Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Wed, 26 Apr 2017 15:29:44 -0700 Subject: [PATCH 15/47] license and code cleanup --- ThermalTalk/Helpers/RawPrintHelper.cs | 4 ---- ThermalTalk/StandardDocument.cs | 27 ++++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/ThermalTalk/Helpers/RawPrintHelper.cs b/ThermalTalk/Helpers/RawPrintHelper.cs index 0064158..4d619e4 100644 --- a/ThermalTalk/Helpers/RawPrintHelper.cs +++ b/ThermalTalk/Helpers/RawPrintHelper.cs @@ -24,12 +24,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE namespace ThermalTalk { using System; - using System.Collections.Generic; using System.IO; - using System.Linq; using System.Runtime.InteropServices; - using System.Text; - using System.Threading.Tasks; /// /// PInvoke wrapper for winspool driver functions diff --git a/ThermalTalk/StandardDocument.cs b/ThermalTalk/StandardDocument.cs index cc13fa3..ce14923 100644 --- a/ThermalTalk/StandardDocument.cs +++ b/ThermalTalk/StandardDocument.cs @@ -1,7 +1,28 @@ -namespace ThermalTalk -{ - using System; +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk +{ /// /// Standard document implementation /// From b28a37cba20a8f4001427821d7b7dbd536416bfc Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Wed, 26 Apr 2017 15:40:54 -0700 Subject: [PATCH 16/47] Enforce which props are required on BasePrinter The idea is to force implementing the font command lookups and then make the single short commands optional. In practice, any command that is unsupported should be left as an empty byte[]. --- ThermalTalk/Common/BasePrinter.cs | 62 +++++++++++++++++++++---- ThermalTalk/Phoenix/PhoenixPrinter.cs | 14 ++++++ ThermalTalk/Reliance/ReliancePrinter.cs | 16 +++++++ 3 files changed, 83 insertions(+), 9 deletions(-) diff --git a/ThermalTalk/Common/BasePrinter.cs b/ThermalTalk/Common/BasePrinter.cs index 49b9de0..6e5958f 100644 --- a/ThermalTalk/Common/BasePrinter.cs +++ b/ThermalTalk/Common/BasePrinter.cs @@ -28,13 +28,14 @@ namespace ThermalTalk public abstract class BasePrinter : IPrinter { - protected Dictionary EnableCommands = new Dictionary(); - protected Dictionary DisableCommands = new Dictionary(); - protected Dictionary JustificationCommands = new Dictionary(); - protected byte[] SetScalarCommand = new byte[0]; - protected byte[] InitPrinterCommand = new byte[0]; - protected byte[] FormFeedCommand = new byte[0]; - protected byte[] NewLineCommand = new byte[0]; + + protected BasePrinter() + { + SetScalarCommand = new byte[0]; + InitPrinterCommand = new byte[0]; + FormFeedCommand = new byte[0]; + NewLineCommand = new byte[0]; + } /// /// Destructor - Close and dispose serial port if needed @@ -50,7 +51,47 @@ public abstract class BasePrinter : IPrinter /// /// Gets the serial connection for this device /// - protected ISerialConnection Connection { get; set; } + protected virtual ISerialConnection Connection { get; set; } + + /// + /// Command to apply scalar. Add extra 0 byte to hold the configuration value + /// Leave empty if not supported. + /// + protected virtual byte[] SetScalarCommand { get; set; } + + /// + /// Command sent to initialize printer. + /// Leave empty if not supported. + /// + protected virtual byte[] InitPrinterCommand { get; set; } + + /// + /// Command sent to execute a newline and print job + /// Leave empty if not supported. + /// + protected virtual byte[] FormFeedCommand { get; set; } + + /// + /// Command sent to execute a newline + /// Leave empty if not supported. + /// + protected virtual byte[] NewLineCommand { get; set; } + + + /// + /// Map of font effects and the specific byte command to apply them + /// + protected abstract Dictionary EnableCommands { get; set; } + + /// + /// Map of font effects and the specific byte command to de-apply them + /// + protected abstract Dictionary DisableCommands { get; set; } + + /// + /// Map justifcation commands and the specific byte command to apply them + /// + protected abstract Dictionary JustificationCommands { get; set; } /// /// Gets or sets the read timeout in milliseconds @@ -82,6 +123,10 @@ public abstract class BasePrinter : IPrinter /// public FontJustification Justification { get; private set; } + /// + /// Send the ESC/POS reinitialize command which restores all + /// default options, configurable, etc. + /// public void Reinitialize() { Justification = FontJustification.JustifyLeft; @@ -92,7 +137,6 @@ public void Reinitialize() internalSend(InitPrinterCommand); } - /// /// Applies the specified scalars /// diff --git a/ThermalTalk/Phoenix/PhoenixPrinter.cs b/ThermalTalk/Phoenix/PhoenixPrinter.cs index d39bed6..40ffa02 100644 --- a/ThermalTalk/Phoenix/PhoenixPrinter.cs +++ b/ThermalTalk/Phoenix/PhoenixPrinter.cs @@ -86,5 +86,19 @@ public PhoenixPrinter(string serialPortName) Reinitialize(); } + + override protected Dictionary EnableCommands { get; set; } + + override protected Dictionary DisableCommands { get; set; } + + override protected Dictionary JustificationCommands { get; set; } + + override protected byte[] SetScalarCommand { get; set; } + + override protected byte[] InitPrinterCommand { get; set; } + + override protected byte[] FormFeedCommand { get; set; } + + override protected byte[] NewLineCommand { get; set; } } } diff --git a/ThermalTalk/Reliance/ReliancePrinter.cs b/ThermalTalk/Reliance/ReliancePrinter.cs index 423bee5..7e6ac07 100644 --- a/ThermalTalk/Reliance/ReliancePrinter.cs +++ b/ThermalTalk/Reliance/ReliancePrinter.cs @@ -90,6 +90,22 @@ public ReliancePrinter(string serialPortName) Reinitialize(); } + override protected ISerialConnection Connection { get; set; } + + override protected Dictionary EnableCommands { get; set; } + + override protected Dictionary DisableCommands { get; set; } + + override protected Dictionary JustificationCommands { get; set; } + + override protected byte[] SetScalarCommand { get; set; } + + override protected byte[] InitPrinterCommand { get; set; } + + override protected byte[] FormFeedCommand { get; set; } + + override protected byte[] NewLineCommand { get; set; } + /// /// Encodes the specified string as a center justified 2D barcode. /// This 2D barcode is compliant with the QR Code® specicification and can be read by all 2D barcode readers. From 403b129ae833b21cf2dcc2b0ffbc3e7a5fc30289 Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Wed, 26 Apr 2017 15:47:57 -0700 Subject: [PATCH 17/47] Add license header --- ThermalTalk.Imaging/Algorithms.cs | 25 ++++++++++++++++++- ThermalTalk.Imaging/Constants.cs | 25 ++++++++++++++++++- ThermalTalk.Imaging/Dither.cs | 26 +++++++++++++++++-- ThermalTalk.Imaging/DitherFactory.cs | 25 ++++++++++++++++++- ThermalTalk.Imaging/Extensions.cs | 25 +++++++++++++++++-- ThermalTalk.Imaging/IPrintLogo.cs | 28 ++++++++++++++++++--- ThermalTalk.Imaging/ImageExt.cs | 25 ++++++++++++++++++- ThermalTalk.Imaging/ImagingException.cs | 29 +++++++++++++++++++--- ThermalTalk.Imaging/Pixel.cs | 25 ++++++++++++++++++- ThermalTalk.Imaging/PrinterImage.cs | 25 ++++++++++++++++++- ThermalTalk.Imaging/Webcam.cs | 33 ++++++++++++++++++++++++- 11 files changed, 273 insertions(+), 18 deletions(-) diff --git a/ThermalTalk.Imaging/Algorithms.cs b/ThermalTalk.Imaging/Algorithms.cs index cb794e8..1f6d618 100644 --- a/ThermalTalk.Imaging/Algorithms.cs +++ b/ThermalTalk.Imaging/Algorithms.cs @@ -1,4 +1,27 @@ -namespace ThermalTalk.Imaging +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk.Imaging { /// /// List of available dithering algorithms diff --git a/ThermalTalk.Imaging/Constants.cs b/ThermalTalk.Imaging/Constants.cs index 8fe0fa3..8c017af 100644 --- a/ThermalTalk.Imaging/Constants.cs +++ b/ThermalTalk.Imaging/Constants.cs @@ -1,4 +1,27 @@ -namespace ThermalTalk.Imaging +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk.Imaging { public static class Constants { diff --git a/ThermalTalk.Imaging/Dither.cs b/ThermalTalk.Imaging/Dither.cs index 1e03c0d..243eea4 100644 --- a/ThermalTalk.Imaging/Dither.cs +++ b/ThermalTalk.Imaging/Dither.cs @@ -1,10 +1,32 @@ -namespace ThermalTalk.Imaging +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk.Imaging { using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; - using System.Runtime.InteropServices; public interface IDitherable { diff --git a/ThermalTalk.Imaging/DitherFactory.cs b/ThermalTalk.Imaging/DitherFactory.cs index 0a0e26e..fe3845f 100644 --- a/ThermalTalk.Imaging/DitherFactory.cs +++ b/ThermalTalk.Imaging/DitherFactory.cs @@ -1,4 +1,27 @@ -namespace ThermalTalk.Imaging +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk.Imaging { public static class DitherFactory { diff --git a/ThermalTalk.Imaging/Extensions.cs b/ThermalTalk.Imaging/Extensions.cs index d47dcf9..cbcc08a 100644 --- a/ThermalTalk.Imaging/Extensions.cs +++ b/ThermalTalk.Imaging/Extensions.cs @@ -1,8 +1,29 @@ - +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ namespace ThermalTalk.Imaging { using System; - using System.Collections.Generic; static class Extensions { diff --git a/ThermalTalk.Imaging/IPrintLogo.cs b/ThermalTalk.Imaging/IPrintLogo.cs index 30b41bd..5745207 100644 --- a/ThermalTalk.Imaging/IPrintLogo.cs +++ b/ThermalTalk.Imaging/IPrintLogo.cs @@ -1,8 +1,30 @@ -namespace ThermalTalk.Imaging +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk.Imaging { - using System; - public interface IPrintLogo : IDisposable + public interface IPrintLogo : System.IDisposable { /// /// Inverts the color palette on this bitmap, pixel-by-pixel diff --git a/ThermalTalk.Imaging/ImageExt.cs b/ThermalTalk.Imaging/ImageExt.cs index e00ac9c..4d5d12c 100644 --- a/ThermalTalk.Imaging/ImageExt.cs +++ b/ThermalTalk.Imaging/ImageExt.cs @@ -1,4 +1,27 @@ -namespace ThermalTalk.Imaging +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk.Imaging { using System; using System.Collections.Generic; diff --git a/ThermalTalk.Imaging/ImagingException.cs b/ThermalTalk.Imaging/ImagingException.cs index dd72a36..0eb2796 100644 --- a/ThermalTalk.Imaging/ImagingException.cs +++ b/ThermalTalk.Imaging/ImagingException.cs @@ -1,8 +1,29 @@ -namespace ThermalTalk.Imaging -{ - using System; +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - public class ImagingException : Exception +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk.Imaging +{ + public class ImagingException : System.Exception { public ImagingException(string message) : base(message) diff --git a/ThermalTalk.Imaging/Pixel.cs b/ThermalTalk.Imaging/Pixel.cs index d17858f..762c303 100644 --- a/ThermalTalk.Imaging/Pixel.cs +++ b/ThermalTalk.Imaging/Pixel.cs @@ -1,4 +1,27 @@ -namespace ThermalTalk.Imaging +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk.Imaging { using System; diff --git a/ThermalTalk.Imaging/PrinterImage.cs b/ThermalTalk.Imaging/PrinterImage.cs index 73f013d..698ea5d 100644 --- a/ThermalTalk.Imaging/PrinterImage.cs +++ b/ThermalTalk.Imaging/PrinterImage.cs @@ -1,4 +1,27 @@ -namespace ThermalTalk.Imaging +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk.Imaging { using System; using System.Collections.Generic; diff --git a/ThermalTalk.Imaging/Webcam.cs b/ThermalTalk.Imaging/Webcam.cs index 68dd4f7..49f554b 100644 --- a/ThermalTalk.Imaging/Webcam.cs +++ b/ThermalTalk.Imaging/Webcam.cs @@ -1,9 +1,40 @@ -namespace ThermalTalk.Imaging +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +namespace ThermalTalk.Imaging { using Emgu.CV; + /// + /// Collection of helper functions for working with a webcam + /// public static class Webcam { + /// + /// Using the first available webcam, take a picture and return + /// the resulting image. + /// + /// PrinterImage public static PrinterImage GrabPicture() { Capture capture = new Capture(0); From 20849a425697d4e5658d808f0ea2196c85dd5030 Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Wed, 26 Apr 2017 15:48:02 -0700 Subject: [PATCH 18/47] Add license header --- ThermalTalk.Test/HW_ReliancePrintTest.cs | 25 +++++++++++++++++++++++- ThermalTalk.Test/RelianceEffectsTest.cs | 25 +++++++++++++++++++++++- ThermalTalk.Test/RelianceStatusTests.cs | 25 +++++++++++++++++++++++- 3 files changed, 72 insertions(+), 3 deletions(-) diff --git a/ThermalTalk.Test/HW_ReliancePrintTest.cs b/ThermalTalk.Test/HW_ReliancePrintTest.cs index db2ede4..d4c6be8 100644 --- a/ThermalTalk.Test/HW_ReliancePrintTest.cs +++ b/ThermalTalk.Test/HW_ReliancePrintTest.cs @@ -1,4 +1,27 @@ -using NUnit.Framework; +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +using NUnit.Framework; namespace ThermalTalk.Test { diff --git a/ThermalTalk.Test/RelianceEffectsTest.cs b/ThermalTalk.Test/RelianceEffectsTest.cs index 88ee683..16fe381 100644 --- a/ThermalTalk.Test/RelianceEffectsTest.cs +++ b/ThermalTalk.Test/RelianceEffectsTest.cs @@ -1,4 +1,27 @@ -using NUnit.Framework; +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +using NUnit.Framework; namespace ThermalTalk.Test { diff --git a/ThermalTalk.Test/RelianceStatusTests.cs b/ThermalTalk.Test/RelianceStatusTests.cs index 8d1716a..aab9a47 100644 --- a/ThermalTalk.Test/RelianceStatusTests.cs +++ b/ThermalTalk.Test/RelianceStatusTests.cs @@ -1,4 +1,27 @@ -using NUnit.Framework; +/* +MIT License + +Copyright (c) 2017 Pyramid Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +using NUnit.Framework; namespace ThermalTalk.Tests { [TestFixture()] From cda842bdc9fa8a015cd88dde7d3ba63f9f76ea4b Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Thu, 27 Apr 2017 08:18:05 -0700 Subject: [PATCH 19/47] Retarget to .NET 4.0 --- .../ThermalTalk.Imaging.Test.csproj | 11 +- ThermalTalk.Imaging.Test/packages.config | 2 +- ThermalTalk.Test/ThermalTalk.Test.csproj | 13 +- ThermalTalk.Test/packages.config | 2 +- packages/NUnit.3.0.1/CHANGES.txt | 924 - packages/NUnit.3.0.1/LICENSE.txt | 20 - packages/NUnit.3.0.1/NOTICES.txt | 5 - packages/NUnit.3.0.1/NUnit.3.0.1.nupkg | Bin 990994 -> 0 bytes .../lib/dotnet/nunit.framework.xml | 15264 -------------- .../NUnit.3.0.1/lib/net20/nunit.framework.xml | 16883 --------------- .../NUnit.3.0.1/lib/net40/nunit.framework.xml | 16885 ---------------- .../NUnit.3.0.1/lib/net45/nunit.framework.xml | 16865 --------------- .../nunit.framework.xml | 15264 -------------- 13 files changed, 15 insertions(+), 82123 deletions(-) delete mode 100644 packages/NUnit.3.0.1/CHANGES.txt delete mode 100644 packages/NUnit.3.0.1/LICENSE.txt delete mode 100644 packages/NUnit.3.0.1/NOTICES.txt delete mode 100644 packages/NUnit.3.0.1/NUnit.3.0.1.nupkg delete mode 100644 packages/NUnit.3.0.1/lib/dotnet/nunit.framework.xml delete mode 100644 packages/NUnit.3.0.1/lib/net20/nunit.framework.xml delete mode 100644 packages/NUnit.3.0.1/lib/net40/nunit.framework.xml delete mode 100644 packages/NUnit.3.0.1/lib/net45/nunit.framework.xml delete mode 100644 packages/NUnit.3.0.1/lib/portable-net45+win8+wp8+wpa81+Xamarin.Mac+MonoAndroid10+MonoTouch10+Xamarin.iOS10/nunit.framework.xml diff --git a/ThermalTalk.Imaging.Test/ThermalTalk.Imaging.Test.csproj b/ThermalTalk.Imaging.Test/ThermalTalk.Imaging.Test.csproj index d28066c..3f8d630 100644 --- a/ThermalTalk.Imaging.Test/ThermalTalk.Imaging.Test.csproj +++ b/ThermalTalk.Imaging.Test/ThermalTalk.Imaging.Test.csproj @@ -9,8 +9,9 @@ Properties ThermalTalk.Imaging.Test ThermalTalk.Imaging.Test - v4.5 + v4.0 512 + true @@ -49,7 +50,7 @@ - ..\packages\NUnit.3.6.1\lib\net45\nunit.framework.dll + ..\packages\NUnit.3.6.1\lib\net40\nunit.framework.dll True @@ -59,9 +60,6 @@ - - - {5440263f-5089-4050-9689-b2060192707e} @@ -71,6 +69,9 @@ + + + o=G*>+HBcUaX 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
  • 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 BjlA(V>+cL(Pet}qGcNH~J9>L>zbSVu?os4I) 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 - - - nunit.framework - - - -

    - AssemblyHelper provides static methods for working - with assemblies. - - - - - Gets the AssemblyName of an assembly. - - The assembly - An AssemblyName - - - - Loads an assembly given a string, which is the AssemblyName - - - - - - - Interface for logging within the engine - - - - - Logs the specified message at the error level. - - The message. - - - - Logs the specified message at the error level. - - The message. - The arguments. - - - - Logs the specified message at the warning level. - - The message. - - - - Logs the specified message at the warning level. - - The message. - The arguments. - - - - Logs the specified message at the info level. - - The message. - - - - Logs the specified message at the info level. - - The message. - The arguments. - - - - Logs the specified message at the debug level. - - The message. - - - - Logs the specified message at the debug level. - - The message. - The arguments. - - - - InternalTrace provides facilities for tracing the execution - of the NUnit framework. Tests and classes under test may make use - of Console writes, System.Diagnostics.Trace or various loggers and - NUnit itself traps and processes each of them. For that reason, a - separate internal trace is needed. - - Note: - InternalTrace uses a global lock to allow multiple threads to write - trace messages. This can easily make it a bottleneck so it must be - used sparingly. Keep the trace Level as low as possible and only - insert InternalTrace writes where they are needed. - TODO: add some buffering and a separate writer thread as an option. - TODO: figure out a way to turn on trace in specific classes only. - - - - - Gets a flag indicating whether the InternalTrace is initialized - - - - - Initialize the internal trace using a provided TextWriter and level - - A TextWriter - The InternalTraceLevel - - - - Get a named Logger - - - - - - Get a logger named for a particular Type. - - - - - InternalTraceLevel is an enumeration controlling the - level of detailed presented in the internal log. - - - - - Use the default settings as specified by the user. - - - - - Do not display any trace messages - - - - - Display Error messages only - - - - - Display Warning level and higher messages - - - - - Display informational and higher messages - - - - - Display debug messages and higher - i.e. all messages - - - - - Display debug messages and higher - i.e. all messages - - - - - A trace listener that writes to a separate file per domain - and process using it. - - - - - Construct an InternalTraceWriter that writes to a - TextWriter provided by the caller. - - - - - - Returns the character encoding in which the output is written. - - The character encoding in which the output is written. - - - - Writes a character to the text string or stream. - - The character to write to the text stream. - - - - Writes a string to the text string or stream. - - The string to write. - - - - Writes a string followed by a line terminator to the text string or stream. - - The string to write. If is null, only the line terminator is written. - - - - Releases the unmanaged resources used by the and optionally releases the managed resources. - - true to release both managed and unmanaged resources; false to release only unmanaged resources. - - - - Clears all buffers for the current writer and causes any buffered data to be written to the underlying device. - - - - - Provides internal logging to the NUnit framework - - - - - Initializes a new instance of the class. - - The name. - The log level. - The writer where logs are sent. - - - - Logs the message at error level. - - The message. - - - - Logs the message at error level. - - The message. - The message arguments. - - - - Logs the message at warm level. - - The message. - - - - Logs the message at warning level. - - The message. - The message arguments. - - - - Logs the message at info level. - - The message. - - - - Logs the message at info level. - - The message. - The message arguments. - - - - Logs the message at debug level. - - The message. - - - - Logs the message at debug level. - - The message. - The message arguments. - - - - Waits for pending asynchronous operations to complete, if appropriate, - and returns a proper result of the invocation by unwrapping task results - - The raw result of the method invocation - The unwrapped result, if necessary - - - - CombinatorialStrategy creates test cases by using all possible - combinations of the parameter data. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - Provides data from fields marked with the DatapointAttribute or the - DatapointsAttribute. - - - - - Determine whether any data is available for a parameter. - - A ParameterInfo representing one - argument to a parameterized test - - True if any data is available, otherwise false. - - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - A ParameterInfo representing one - argument to a parameterized test - - An IEnumerable providing the required data - - - - - Built-in SuiteBuilder for all types of test classes. - - - - - Checks to see if the provided Type is a fixture. - To be considered a fixture, it must be a non-abstract - class with one or more attributes implementing the - IFixtureBuilder interface or one or more methods - marked as tests. - - The fixture type to check - True if the fixture can be built, false if not - - - - Build a TestSuite from TypeInfo provided. - - The fixture type to build - A TestSuite built from that type - - - - We look for attributes implementing IFixtureBuilder at one level - of inheritance at a time. Attributes on base classes are not used - unless there are no fixture builder attributes at all on the derived - class. This is by design. - - The type being examined for attributes - A list of the attributes found. - - - - Class to build ether a parameterized or a normal NUnitTestMethod. - There are four cases that the builder must deal with: - 1. The method needs no params and none are provided - 2. The method needs params and they are provided - 3. The method needs no params but they are provided in error - 4. The method needs params but they are not provided - This could have been done using two different builders, but it - turned out to be simpler to have just one. The BuildFrom method - takes a different branch depending on whether any parameters are - provided, but all four cases are dealt with in lower-level methods - - - - - Determines if the method can be used to build an NUnit test - test method of some kind. The method must normally be marked - with an identifying attribute for this to be true. - - Note that this method does not check that the signature - of the method for validity. If we did that here, any - test methods with invalid signatures would be passed - over in silence in the test run. Since we want such - methods to be reported, the check for validity is made - in BuildFrom rather than here. - - An IMethodInfo for the method being used as a test method - True if the builder can create a test case from this method - - - - Build a Test from the provided MethodInfo. Depending on - whether the method takes arguments and on the availability - of test case data, this method may return a single test - or a group of tests contained in a ParameterizedMethodSuite. - - The method for which a test is to be built - A Test representing one or more method invocations - - - - Determines if the method can be used to build an NUnit test - test method of some kind. The method must normally be marked - with an identifying attribute for this to be true. - - Note that this method does not check that the signature - of the method for validity. If we did that here, any - test methods with invalid signatures would be passed - over in silence in the test run. Since we want such - methods to be reported, the check for validity is made - in BuildFrom rather than here. - - An IMethodInfo for the method being used as a test method - The test suite being built, to which the new test would be added - True if the builder can create a test case from this method - - - - Build a Test from the provided MethodInfo. Depending on - whether the method takes arguments and on the availability - of test case data, this method may return a single test - or a group of tests contained in a ParameterizedMethodSuite. - - The method for which a test is to be built - The test fixture being populated, or null - A Test representing one or more method invocations - - - - Builds a ParameterizedMethodSuite containing individual test cases. - - The method for which a test is to be built. - The list of test cases to include. - A ParameterizedMethodSuite populated with test cases - - - - Build a simple, non-parameterized TestMethod for this method. - - The MethodInfo for which a test is to be built - The test suite for which the method is being built - A TestMethod. - - - - Class that can build a tree of automatic namespace - suites from a group of fixtures. - - - - - NamespaceDictionary of all test suites we have created to represent - namespaces. Used to locate namespace parent suites for fixtures. - - - - - The root of the test suite being created by this builder. - - - - - Initializes a new instance of the class. - - The root suite. - - - - Gets the root entry in the tree created by the NamespaceTreeBuilder. - - The root suite. - - - - Adds the specified fixtures to the tree. - - The fixtures to be added. - - - - Adds the specified fixture to the tree. - - The fixture to be added. - - - - NUnitTestCaseBuilder is a utility class used by attributes - that build test cases. - - - - - Constructs an - - - - - Builds a single NUnitTestMethod, either as a child of the fixture - or as one of a set of test cases under a ParameterizedTestMethodSuite. - - The MethodInfo from which to construct the TestMethod - The suite or fixture to which the new test will be added - The ParameterSet to be used, or null - - - - - Helper method that checks the signature of a TestMethod and - any supplied parameters to determine if the test is valid. - - Currently, NUnitTestMethods are required to be public, - non-abstract methods, either static or instance, - returning void. They may take arguments but the _values must - be provided or the TestMethod is not considered runnable. - - Methods not meeting these criteria will be marked as - non-runnable and the method will return false in that case. - - The TestMethod to be checked. If it - is found to be non-runnable, it will be modified. - Parameters to be used for this test, or null - True if the method signature is valid, false if not - - The return value is no longer used internally, but is retained - for testing purposes. - - - - - NUnitTestFixtureBuilder is able to build a fixture given - a class marked with a TestFixtureAttribute or an unmarked - class containing test methods. In the first case, it is - called by the attribute and in the second directly by - NUnitSuiteBuilder. - - - - - Build a TestFixture from type provided. A non-null TestSuite - must always be returned, since the method is generally called - because the user has marked the target class as a fixture. - If something prevents the fixture from being used, it should - be returned nonetheless, labelled as non-runnable. - - An ITypeInfo for the fixture to be used. - A TestSuite object or one derived from TestSuite. - - - - Overload of BuildFrom called by tests that have arguments. - Builds a fixture using the provided type and information - in the ITestFixtureData object. - - The TypeInfo for which to construct a fixture. - An object implementing ITestFixtureData or null. - - - - - Method to add test cases to the newly constructed fixture. - - The fixture to which cases should be added - - - - Method to create a test case from a MethodInfo and add - it to the fixture being built. It first checks to see if - any global TestCaseBuilder addin wants to build the - test case. If not, it uses the internal builder - collection maintained by this fixture builder. - - The default implementation has no test case builders. - Derived classes should add builders to the collection - in their constructor. - - The method for which a test is to be created - The test suite being built. - A newly constructed Test - - - - PairwiseStrategy creates test cases by combining the parameter - data so that all possible pairs of data items are used. - - - - The number of test cases that cover all possible pairs of test function - parameters values is significantly less than the number of test cases - that cover all possible combination of test function parameters values. - And because different studies show that most of software failures are - caused by combination of no more than two parameters, pairwise testing - can be an effective ways to test the system when it's impossible to test - all combinations of parameters. - - - The PairwiseStrategy code is based on "jenny" tool by Bob Jenkins: - http://burtleburtle.net/bob/math/jenny.html - - - - - - FleaRand is a pseudo-random number generator developed by Bob Jenkins: - http://burtleburtle.net/bob/rand/talksmall.html#flea - - - - - Initializes a new instance of the FleaRand class. - - The seed. - - - - FeatureInfo represents coverage of a single value of test function - parameter, represented as a pair of indices, Dimension and Feature. In - terms of unit testing, Dimension is the index of the test parameter and - Feature is the index of the supplied value in that parameter's list of - sources. - - - - - Initializes a new instance of FeatureInfo class. - - Index of a dimension. - Index of a feature. - - - - A FeatureTuple represents a combination of features, one per test - parameter, which should be covered by a test case. In the - PairwiseStrategy, we are only trying to cover pairs of features, so the - tuples actually may contain only single feature or pair of features, but - the algorithm itself works with triplets, quadruples and so on. - - - - - Initializes a new instance of FeatureTuple class for a single feature. - - Single feature. - - - - Initializes a new instance of FeatureTuple class for a pair of features. - - First feature. - Second feature. - - - - TestCase represents a single test case covering a list of features. - - - - - Initializes a new instance of TestCaseInfo class. - - A number of features in the test case. - - - - PairwiseTestCaseGenerator class implements an algorithm which generates - a set of test cases which covers all pairs of possible values of test - function. - - - - The algorithm starts with creating a set of all feature tuples which we - will try to cover (see method). This set - includes every single feature and all possible pairs of features. We - store feature tuples in the 3-D collection (where axes are "dimension", - "feature", and "all combinations which includes this feature"), and for - every two feature (e.g. "A" and "B") we generate both ("A", "B") and - ("B", "A") pairs. This data structure extremely reduces the amount of - time needed to calculate coverage for a single test case (this - calculation is the most time-consuming part of the algorithm). - - - Then the algorithm picks one tuple from the uncovered tuple, creates a - test case that covers this tuple, and then removes this tuple and all - other tuples covered by this test case from the collection of uncovered - tuples. - - - Picking a tuple to cover - - - There are no any special rules defined for picking tuples to cover. We - just pick them one by one, in the order they were generated. - - - Test generation - - - Test generation starts from creating a completely random test case which - covers, nevertheless, previously selected tuple. Then the algorithm - tries to maximize number of tuples which this test covers. - - - Test generation and maximization process repeats seven times for every - selected tuple and then the algorithm picks the best test case ("seven" - is a magic number which provides good results in acceptable time). - - Maximizing test coverage - - To maximize tests coverage, the algorithm walks thru the list of mutable - dimensions (mutable dimension is a dimension that are not included in - the previously selected tuple). Then for every dimension, the algorithm - walks thru the list of features and checks if this feature provides - better coverage than randomly selected feature, and if yes keeps this - feature. - - - This process repeats while it shows progress. If the last iteration - doesn't improve coverage, the process ends. - - - In addition, for better results, before start every iteration, the - algorithm "scrambles" dimensions - so for every iteration dimension - probes in a different order. - - - - - - Creates a set of test cases for specified dimensions. - - - An array which contains information about dimensions. Each element of - this array represents a number of features in the specific dimension. - - - A set of test cases. - - - - - Gets the test cases generated by this strategy instance. - - A set of test cases. - - - - The ParameterDataProvider class implements IParameterDataProvider - and hosts one or more individual providers. - - - - - Construct with a collection of individual providers - - - - - Determine whether any data is available for a parameter. - - An IParameterInfo representing one - argument to a parameterized test - True if any data is available, otherwise false. - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - An IEnumerable providing the required data - - - - ParameterDataSourceProvider supplies individual argument _values for - single parameters using attributes implementing IParameterDataSource. - - - - - Determine whether any data is available for a parameter. - - A ParameterInfo representing one - argument to a parameterized test - - True if any data is available, otherwise false. - - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - - An IEnumerable providing the required data - - - - - SequentialStrategy creates test cases by using all of the - parameter data sources in parallel, substituting null - when any of them run out of data. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - ContextSettingsCommand applies specified changes to the - TestExecutionContext prior to running a test. No special - action is needed after the test runs, since the prior - context will be restored automatically. - - - - - The CommandStage enumeration represents the defined stages - of execution for a series of TestCommands. The int _values - of the enum are used to apply decorators in the proper - order. Lower _values are applied first and are therefore - "closer" to the actual test execution. - - - No CommandStage is defined for actual invocation of the test or - for creation of the context. Execution may be imagined as - proceeding from the bottom of the list upwards, with cleanup - after the test running in the opposite order. - - - - - Use an application-defined default value. - - - - - Make adjustments needed before and after running - the raw test - that is, after any SetUp has run - and before TearDown. - - - - - Run SetUp and TearDown for the test. This stage is used - internally by NUnit and should not normally appear - in user-defined decorators. - - - - - Make adjustments needed before and after running - the entire test - including SetUp and TearDown. - - - - - TODO: Documentation needed for class - - - - TODO: Documentation needed for field - - - - TODO: Documentation needed for constructor - - - - - - TODO: Documentation needed for class - - - - - Initializes a new instance of the class. - - The inner command. - The max time allowed in milliseconds - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext - - The context in which the test should run. - A TestResult - - - - OneTimeSetUpCommand runs any one-time setup methods for a suite, - constructing the user test object if necessary. - - - - - Constructs a OneTimeSetUpCommand for a suite - - The suite to which the command applies - A SetUpTearDownList for use by the command - A List of TestActionItems to be run after Setup - - - - Overridden to run the one-time setup for a suite. - - The TestExecutionContext to be used. - A TestResult - - - - OneTimeTearDownCommand performs any teardown actions - specified for a suite and calls Dispose on the user - test object, if any. - - - - - Construct a OneTimeTearDownCommand - - The test suite to which the command applies - A SetUpTearDownList for use by the command - A List of TestActionItems to be run before teardown. - - - - Overridden to run the teardown methods specified on the test. - - The TestExecutionContext to be used. - A TestResult - - - - SetUpTearDownCommand runs any SetUp methods for a suite, - runs the test and then runs any TearDown methods. - - - - - Initializes a new instance of the class. - - The inner command. - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - SetUpTearDownItem holds the setup and teardown methods - for a single level of the inheritance hierarchy. - - - - - Construct a SetUpTearDownNode - - A list of setup methods for this level - A list teardown methods for this level - - - - Returns true if this level has any methods at all. - This flag is used to discard levels that do nothing. - - - - - Run SetUp on this level. - - The execution context to use for running. - - - - Run TearDown for this level. - - - - - - TODO: Documentation needed for class - - - - - Initializes a new instance of the class. - - The test being skipped. - - - - Overridden to simply set the CurrentResult to the - appropriate Skipped state. - - The execution context for the test - A TestResult - - - - TestActionCommand runs the BeforeTest actions for a test, - then runs the test and finally runs the AfterTestActions. - - - - - Initializes a new instance of the class. - - The inner command. - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - TestActionItem represents a single execution of an - ITestAction. It is used to track whether the BeforeTest - method has been called and suppress calling the - AfterTest method if it has not. - - - - - Construct a TestActionItem - - The ITestAction to be included - - - - Run the BeforeTest method of the action and remember that it has been run. - - The test to which the action applies - - - - Run the AfterTest action, but only if the BeforeTest - action was actually run. - - The test to which the action applies - - - - TestCommand is the abstract base class for all test commands - in the framework. A TestCommand represents a single stage in - the execution of a test, e.g.: SetUp/TearDown, checking for - Timeout, verifying the returned result from a method, etc. - - TestCommands may decorate other test commands so that the - execution of a lower-level command is nested within that - of a higher level command. All nested commands are executed - synchronously, as a single unit. Scheduling test execution - on separate threads is handled at a higher level, using the - task dispatcher. - - - - - Construct a TestCommand for a test. - - The test to be executed - - - - Gets the test associated with this command. - - - - - Runs the test in a specified context, returning a TestResult. - - The TestExecutionContext to be used for running the test. - A TestResult - - - - TestMethodCommand is the lowest level concrete command - used to run actual test cases. - - - - - Initializes a new instance of the class. - - The test. - - - - Runs the test, saving a TestResult in the execution context, as - well as returning it. If the test has an expected result, it - is asserts on that value. Since failed tests and errors throw - an exception, this command must be wrapped in an outer command, - will handle that exception and records the failure. This role - is usually played by the SetUpTearDown command. - - The execution context - - - - TheoryResultCommand adjusts the result of a Theory so that - it fails if all the results were inconclusive. - - - - - Constructs a TheoryResultCommand - - The command to be wrapped by this one - - - - Overridden to call the inner command and adjust the result - in case all chlid results were inconclusive. - - - - - - - CultureDetector is a helper class used by NUnit to determine - whether a test should be run based on the current culture. - - - - - Default constructor uses the current culture. - - - - - Construct a CultureDetector for a particular culture for testing. - - The culture to be used - - - - Test to determine if one of a collection of cultures - is being used currently. - - - - - - - Tests to determine if the current culture is supported - based on a culture attribute. - - The attribute to examine - - - - - Test to determine if the a particular culture or comma- - delimited set of cultures is in use. - - Name of the culture or comma-separated list of culture ids - True if the culture is in use on the system - - - - Return the last failure reason. Results are not - defined if called before IsSupported( Attribute ) - is called. - - - - - ExceptionHelper provides static methods for working with exceptions - - - - - Builds up a message, using the Message field of the specified exception - as well as any InnerExceptions. - - The exception. - A combined message string. - - - - Builds up a message, using the Message field of the specified exception - as well as any InnerExceptions. - - The exception. - A combined stack trace. - - - - Gets the stack trace of the exception. - - The exception. - A string representation of the stack trace. - - - - A utility class to create TestCommands - - - - - Gets the command to be executed before any of - the child tests are run. - - A TestCommand - - - - Gets the command to be executed after all of the - child tests are run. - - A TestCommand - - - - Creates a test command for use in running this test. - - - - - - Creates a command for skipping a test. The result returned will - depend on the test RunState. - - - - - Builds the set up tear down list. - - Type of the fixture. - Type of the set up attribute. - Type of the tear down attribute. - A list of SetUpTearDownItems - - - - A CompositeWorkItem represents a test suite and - encapsulates the execution of the suite as well - as all its child tests. - - - - - Construct a CompositeWorkItem for executing a test suite - using a filter to select child tests. - - The TestSuite to be executed - A filter used to select child tests - - - - Method that actually performs the work. Overridden - in CompositeWorkItem to do setup, run all child - items and then do teardown. - - - - - A simplified implementation of .NET 4 CountdownEvent - for use in earlier versions of .NET. Only the methods - used by NUnit are implemented. - - - - - Construct a CountdownEvent - - The initial count - - - - Gets the initial count established for the CountdownEvent - - - - - Gets the current count remaining for the CountdownEvent - - - - - Decrement the count by one - - - - - Block the thread until the count reaches zero - - - - - An IWorkItemDispatcher handles execution of work items. - - - - - Dispatch a single work item for execution. The first - work item dispatched is saved as the top-level - work item and used when stopping the run. - - The item to dispatch - - - - Cancel the ongoing run completely. - If no run is in process, the call has no effect. - - - - - A SimpleWorkItem represents a single test case and is - marked as completed immediately upon execution. This - class is also used for skipped or ignored test suites. - - - - - Construct a simple work item for a test. - - The test to be executed - The filter used to select this test - - - - Method that performs actually performs the work. - - - - - SimpleWorkItemDispatcher handles execution of WorkItems by - directly executing them. It is provided so that a dispatcher - is always available in the context, thereby simplifying the - code needed to run child tests. - - - - - Dispatch a single work item for execution. The first - work item dispatched is saved as the top-level - work item and a thread is created on which to - run it. Subsequent calls come from the top level - item or its descendants on the proper thread. - - The item to dispatch - - - - Cancel the ongoing run completely. - If no run is in process, the call has no effect. - - - - - A WorkItem may be an individual test case, a fixture or - a higher level grouping of tests. All WorkItems inherit - from the abstract WorkItem class, which uses the template - pattern to allow derived classes to perform work in - whatever way is needed. - - A WorkItem is created with a particular TestExecutionContext - and is responsible for re-establishing that context in the - current thread before it begins or resumes execution. - - - - - Creates a work item. - - The test for which this WorkItem is being created. - The filter to be used in selecting any child Tests. - - - - - Construct a WorkItem for a particular test. - - The test that the WorkItem will run - - - - Initialize the TestExecutionContext. This must be done - before executing the WorkItem. - - - Originally, the context was provided in the constructor - but delaying initialization of the context until the item - is about to be dispatched allows changes in the parent - context during OneTimeSetUp to be reflected in the child. - - The TestExecutionContext to use - - - - Event triggered when the item is complete - - - - - Gets the current state of the WorkItem - - - - - The test being executed by the work item - - - - - The execution context - - - - - The test actions to be performed before and after this test - - - - - The test result - - - - - Execute the current work item, including any - child work items. - - - - - Method that performs actually performs the work. It should - set the State to WorkItemState.Complete when done. - - - - - Method called by the derived class when all work is complete - - - - - The current state of a work item - - - - - Ready to run or continue - - - - - Work Item is executing - - - - - Complete - - - - - TextMessageWriter writes constraint descriptions and messages - in displayable form as a text stream. It tailors the display - of individual message components to form the standard message - format of NUnit assertion failure messages. - - - - - Prefix used for the expected value line of a message - - - - - Prefix used for the actual value line of a message - - - - - Length of a message prefix - - - - - Construct a TextMessageWriter - - - - - Construct a TextMessageWriter, specifying a user message - and optional formatting arguments. - - - - - - - Gets or sets the maximum line length for this writer - - - - - Method to write single line message with optional args, usually - written to precede the general failure message, at a given - indentation level. - - The indentation level of the message - The message to be written - Any arguments used in formatting the message - - - - Display Expected and Actual lines for a constraint. This - is called by MessageWriter's default implementation of - WriteMessageTo and provides the generic two-line display. - - The result of the constraint that failed - - - - Display Expected and Actual lines for given _values. This - method may be called by constraints that need more control over - the display of actual and expected _values than is provided - by the default implementation. - - The expected value - The actual value causing the failure - - - - Display Expected and Actual lines for given _values, including - a tolerance value on the expected line. - - The expected value - The actual value causing the failure - The tolerance within which the test was made - - - - Display the expected and actual string _values on separate lines. - If the mismatch parameter is >=0, an additional line is displayed - line containing a caret that points to the mismatch point. - - The expected string value - The actual string value - The point at which the strings don't match or -1 - If true, case is ignored in string comparisons - If true, clip the strings to fit the max line length - - - - Writes the text for an actual value. - - The actual value. - - - - Writes the text for a generalized value. - - The value. - - - - Writes the text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Write the generic 'Expected' line for a constraint - - The constraint that failed - - - - Write the generic 'Expected' line for a given value - - The expected value - - - - Write the generic 'Expected' line for a given value - and tolerance. - - The expected value - The tolerance within which the test was made - - - - Write the generic 'Actual' line for a constraint - - The ConstraintResult for which the actual value is to be written - - - - Write the generic 'Actual' line for a given value - - The actual value causing a failure - - - - Combines multiple filters so that a test must pass all - of them in order to pass this filter. - - - - - Constructs an empty AndFilter - - - - - Constructs an AndFilter from an array of filters - - - - - - Checks whether the AndFilter is matched by a test - - The test to be matched - True if all the component filters pass, otherwise false - - - - Checks whether the AndFilter is matched by a test - - The test to be matched - True if all the component filters match, otherwise false - - - - Gets the element name - - Element name - - - - CategoryFilter is able to select or exclude tests - based on their categories. - - - - - - Construct a CategoryFilter using a single category name - - A category name - - - - Check whether the filter matches a test - - The test to be matched - - - - - Gets the element name - - Element name - - - - ClassName filter selects tests based on the class FullName - - - - - Construct a FullNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - A base class for multi-part filters - - - - - Constructs an empty CompositeFilter - - - - - Constructs a CompositeFilter from an array of filters - - - - - - Adds a filter to the list of filters - - The filter to be added - - - - Return a list of the composing filters. - - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - FullName filter selects tests based on their FullName - - - - - Construct a FullNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - IdFilter selects tests based on their id - - - - - Construct an IdFilter for a single value - - The id the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - FullName filter selects tests based on their FullName - - - - - Construct a MethodNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - NotFilter negates the operation of another filter - - - - - Construct a not filter on another filter - - The filter to be negated - - - - Gets the base filter - - - - - Determine if a particular test passes the filter criteria. The default - implementation checks the test itself, its parents and any descendants. - - Derived classes may override this method or any of the Match methods - to change the behavior of the filter. - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Check whether the filter matches a test - - The test to be matched - True if it matches, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Combines multiple filters so that a test must pass one - of them in order to pass this filter. - - - - - Constructs an empty OrFilter - - - - - Constructs an AndFilter from an array of filters - - - - - - Checks whether the OrFilter is matched by a test - - The test to be matched - True if any of the component filters pass, otherwise false - - - - Checks whether the OrFilter is matched by a test - - The test to be matched - True if any of the component filters match, otherwise false - - - - Gets the element name - - Element name - - - - PropertyFilter is able to select or exclude tests - based on their properties. - - - - - - Construct a PropertyFilter using a property name and expected value - - A property name - The expected value of the property - - - - Check whether the filter matches a test - - The test to be matched - - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - TestName filter selects tests based on their Name - - - - - Construct a TestNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - ValueMatchFilter selects tests based on some value, which - is expected to be contained in the test. - - - - - Returns the value matched by the filter - used for testing - - - - - Indicates whether the value is a regular expression - - - - - Construct a ValueMatchFilter for a single value. - - The value to be included. - - - - Match the input provided by the derived class - - The value to be matchedT - True for a match, false otherwise. - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - GenericMethodHelper is able to deduce the Type arguments for - a generic method from the actual arguments provided. - - - - - Construct a GenericMethodHelper for a method - - MethodInfo for the method to examine - - - - Return the type argments for the method, deducing them - from the arguments actually provided. - - The arguments to the method - An array of type arguments. - - - - InvalidTestFixtureException is thrown when an appropriate test - fixture constructor using the provided arguments cannot be found. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The message. - - - - Initializes a new instance of the class. - - The message. - The inner. - - - - InvalidTestFixtureException is thrown when an appropriate test - fixture constructor using the provided arguments cannot be found. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The message. - - - - Initializes a new instance of the class. - - The message. - The inner. - - - - The MethodWrapper class wraps a MethodInfo so that it may - be used in a platform-independent manner. - - - - - Construct a MethodWrapper for a Type and a MethodInfo. - - - - - Construct a MethodInfo for a given Type and method name. - - - - - Gets the Type from which this method was reflected. - - - - - Gets the MethodInfo for this method. - - - - - Gets the name of the method. - - - - - Gets a value indicating whether the method is abstract. - - - - - Gets a value indicating whether the method is public. - - - - - Gets a value indicating whether the method contains unassigned generic type parameters. - - - - - Gets a value indicating whether the method is a generic method. - - - - - Gets a value indicating whether the MethodInfo represents the definition of a generic method. - - - - - Gets the return Type of the method. - - - - - Gets the parameters of the method. - - - - - - Returns the Type arguments of a generic method or the Type parameters of a generic method definition. - - - - - Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. - - The type arguments to be used - A new IMethodInfo with the type arguments replaced - - - - Returns an array of custom attributes of the specified type applied to this method - - - - - Gets a value indicating whether one or more attributes of the spcified type are defined on the method. - - - - - Invokes the method, converting any TargetInvocationException to an NUnitException. - - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - Override ToString() so that error messages in NUnit's own tests make sense - - - - - Thrown when an assertion failed. Here to preserve the inner - exception and hence its stack trace. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The error message that explains - the reason for the exception - - - - Initializes a new instance of the class. - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - The ParameterWrapper class wraps a ParameterInfo so that it may - be used in a platform-independent manner. - - - - - Construct a ParameterWrapper for a given method and parameter - - - - - - - Gets a value indicating whether the parameter is optional - - - - - Gets an IMethodInfo representing the method for which this is a parameter. - - - - - Gets the underlying ParameterInfo - - - - - Gets the Type of the parameter - - - - - Returns an array of custom attributes of the specified type applied to this method - - - - - Gets a value indicating whether one or more attributes of the specified type are defined on the parameter. - - - - - A PropertyBag represents a collection of name value pairs - that allows duplicate entries with the same key. Methods - are provided for adding a new pair as well as for setting - a key to a single value. All keys are strings but _values - may be of any type. Null _values are not permitted, since - a null entry represents the absence of the key. - - - - - Adds a key/value pair to the property set - - The key - The value - - - - Sets the value for a key, removing any other - _values that are already in the property set. - - - - - - - Gets a single value for a key, using the first - one if multiple _values are present and returning - null if the value is not found. - - - - - - - Gets a flag indicating whether the specified key has - any entries in the property set. - - The key to be checked - - True if their are _values present, otherwise false - - - - - Gets a collection containing all the keys in the property set - - - - - - Gets or sets the list of _values for a particular key - - - - - Returns an XmlNode representating the current PropertyBag. - - Not used - An XmlNode representing the PropertyBag - - - - Returns an XmlNode representing the PropertyBag after - adding it as a child of the supplied parent node. - - The parent node. - Not used - - - - - The PropertyNames class provides static constants for the - standard property ids that NUnit uses on tests. - - - - - The FriendlyName of the AppDomain in which the assembly is running - - - - - The selected strategy for joining parameter data into test cases - - - - - The process ID of the executing assembly - - - - - The stack trace from any data provider that threw - an exception. - - - - - The reason a test was not run - - - - - The author of the tests - - - - - The ApartmentState required for running the test - - - - - The categories applying to a test - - - - - The Description of a test - - - - - The number of threads to be used in running tests - - - - - The maximum time in ms, above which the test is considered to have failed - - - - - The ParallelScope associated with a test - - - - - The number of times the test should be repeated - - - - - Indicates that the test should be run on a separate thread - - - - - The culture to be set for a test - - - - - The UI culture to be set for a test - - - - - The type that is under test - - - - - The timeout value for the test - - - - - The test will be ignored until the given date - - - - - Randomizer returns a set of random _values in a repeatable - way, to allow re-running of tests if necessary. It extends - the .NET Random class, providing random values for a much - wider range of types. - - The class is used internally by the framework to generate - test case data and is also exposed for use by users through - the TestContext.Random property. - - - For consistency with the underlying Random Type, methods - returning a single value use the prefix "Next..." Those - without an argument return a non-negative value up to - the full positive range of the Type. Overloads are provided - for specifying a maximum or a range. Methods that return - arrays or strings use the prefix "Get..." to avoid - confusion with the single-value methods. - - - - - Initial seed used to create randomizers for this run - - - - - Get a Randomizer for a particular member, returning - one that has already been created if it exists. - This ensures that the same _values are generated - each time the tests are reloaded. - - - - - Get a randomizer for a particular parameter, returning - one that has already been created if it exists. - This ensures that the same values are generated - each time the tests are reloaded. - - - - - Create a new Randomizer using the next seed - available to ensure that each randomizer gives - a unique sequence of values. - - - - - - Default constructor - - - - - Construct based on seed value - - - - - - Returns a random unsigned int. - - - - - Returns a random unsigned int less than the specified maximum. - - - - - Returns a random unsigned int within a specified range. - - - - - Returns a non-negative random short. - - - - - Returns a non-negative random short less than the specified maximum. - - - - - Returns a non-negative random short within a specified range. - - - - - Returns a random unsigned short. - - - - - Returns a random unsigned short less than the specified maximum. - - - - - Returns a random unsigned short within a specified range. - - - - - Returns a random long. - - - - - Returns a random long less than the specified maximum. - - - - - Returns a non-negative random long within a specified range. - - - - - Returns a random ulong. - - - - - Returns a random ulong less than the specified maximum. - - - - - Returns a non-negative random long within a specified range. - - - - - Returns a random Byte - - - - - Returns a random Byte less than the specified maximum. - - - - - Returns a random Byte within a specified range - - - - - Returns a random SByte - - - - - Returns a random sbyte less than the specified maximum. - - - - - Returns a random sbyte within a specified range - - - - - Returns a random bool - - - - - Returns a random bool based on the probablility a true result - - - - - Returns a random double between 0.0 and the specified maximum. - - - - - Returns a random double within a specified range. - - - - - Returns a random float. - - - - - Returns a random float between 0.0 and the specified maximum. - - - - - Returns a random float within a specified range. - - - - - Returns a random enum value of the specified Type as an object. - - - - - Returns a random enum value of the specified Type. - - - - - Default characters for random functions. - - Default characters are the English alphabet (uppercase & lowercase), arabic numerals, and underscore - - - - Generate a random string based on the characters from the input string. - - desired length of output string. - string representing the set of characters from which to construct the resulting string - A random string of arbitrary length - - - - Generate a random string based on the characters from the input string. - - desired length of output string. - A random string of arbitrary length - Uses DefaultStringChars as the input character set - - - - Generate a random string based on the characters from the input string. - - A random string of the default length - Uses DefaultStringChars as the input character set - - - - Returns a random decimal. - - - - - Returns a random decimal between positive zero and the specified maximum. - - - - - Returns a random decimal within a specified range, which is not - permitted to exceed decimal.MaxVal in the current implementation. - - - A limitation of this implementation is that the range from min - to max must not exceed decimal.MaxVal. - - - - - Helper methods for inspecting a type by reflection. - - Many of these methods take ICustomAttributeProvider as an - argument to avoid duplication, even though certain attributes can - only appear on specific types of members, like MethodInfo or Type. - - In the case where a type is being examined for the presence of - an attribute, interface or named member, the Reflect methods - operate with the full name of the member being sought. This - removes the necessity of the caller having a reference to the - assembly that defines the item being sought and allows the - NUnit core to inspect assemblies that reference an older - version of the NUnit framework. - - - - - Examine a fixture type and return an array of methods having a - particular attribute. The array is order with base methods first. - - The type to examine - The attribute Type to look for - Specifies whether to search the fixture type inheritance chain - The array of methods found - - - - Examine a fixture type and return true if it has a method with - a particular attribute. - - The type to examine - The attribute Type to look for - True if found, otherwise false - - - - Invoke the default constructor on a Type - - The Type to be constructed - An instance of the Type - - - - Invoke a constructor on a Type with arguments - - The Type to be constructed - Arguments to the constructor - An instance of the Type - - - - Returns an array of types from an array of objects. - Used because the compact framework doesn't support - Type.GetTypeArray() - - An array of objects - An array of Types - - - - Invoke a parameterless method returning void on an object. - - A MethodInfo for the method to be invoked - The object on which to invoke the method - - - - Invoke a method, converting any TargetInvocationException to an NUnitException. - - A MethodInfo for the method to be invoked - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - Represents the result of running a single test case. - - - - - Construct a TestCaseResult based on a TestMethod - - A TestMethod to which the result applies. - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - The TestResult class represents the result of a test. - - - - - Error message for when child tests have errors - - - - - Error message for when child tests are ignored - - - - - The minimum duration for tests - - - - - List of child results - - - - - Construct a test result given a Test - - The test to be used - - - - Gets the test with which this result is associated. - - - - - Gets the ResultState of the test result, which - indicates the success or failure of the test. - - - - - Gets the name of the test result - - - - - Gets the full name of the test result - - - - - Gets or sets the elapsed time for running the test in seconds - - - - - Gets or sets the time the test started running. - - - - - Gets or sets the time the test finished running. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. - - - - - Gets or sets the count of asserts executed - when running the test. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Indicates whether this result has any child results. - Test HasChildren before accessing Children to avoid - the creation of an empty collection. - - - - - Gets the collection of child results. - - - - - Gets a TextWriter, which will write output to be included in the result. - - - - - Gets any text output written to this result. - - - - - Returns the Xml representation of the result. - - If true, descendant results are included - An XmlNode representing the result - - - - Adds the XML representation of the result as a child of the - supplied parent node.. - - The parent node. - If true, descendant results are included - - - - - Adds a child result to this result, setting this result's - ResultState to Failure if the child result failed. - - The result to be added - - - - Set the result of the test - - The ResultState to use in the result - - - - Set the result of the test - - The ResultState to use in the result - A message associated with the result state - - - - Set the result of the test - - The ResultState to use in the result - A message associated with the result state - Stack trace giving the location of the command - - - - Set the test result based on the type of exception thrown - - The exception that was thrown - - - - Set the test result based on the type of exception thrown - - The exception that was thrown - THe FailureSite to use in the result - - - - RecordTearDownException appends the message and stacktrace - from an exception arising during teardown of the test - to any previously recorded information, so that any - earlier failure information is not lost. Note that - calling Assert.Ignore, Assert.Inconclusive, etc. during - teardown is treated as an error. If the current result - represents a suite, it may show a teardown error even - though all contained tests passed. - - The Exception to be recorded - - - - Adds a reason element to a node and returns it. - - The target node. - The new reason element. - - - - Adds a failure element to a node and returns it. - - The target node. - The new failure element. - - - - Represents the result of running a test suite - - - - - Construct a TestSuiteResult base on a TestSuite - - The TestSuite to which the result applies - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Add a child result - - The child result to be added - - - - StackFilter class is used to remove internal NUnit - entries from a stack trace so that the resulting - trace provides better information about the test. - - - - - Filters a raw stack trace and returns the result. - - The original stack trace - A filtered stack trace - - - - Provides methods to support legacy string comparison methods. - - - - - Compares two strings for equality, ignoring case if requested. - - The first string. - The second string.. - if set to true, the case of the letters in the strings is ignored. - Zero if the strings are equivalent, a negative number if strA is sorted first, a positive number if - strB is sorted first - - - - Compares two strings for equality, ignoring case if requested. - - The first string. - The second string.. - if set to true, the case of the letters in the strings is ignored. - True if the strings are equivalent, false if not. - - - - The TestCaseParameters class encapsulates method arguments and - other selected parameters needed for constructing - a parameterized test case. - - - - - The expected result to be returned - - - - - Default Constructor creates an empty parameter set - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a ParameterSet from an object implementing ITestCaseData - - - - - - The expected result of the test, which - must match the method return type. - - - - - Gets a value indicating whether an expected result was specified. - - - - - Helper class used to save and restore certain static or - singleton settings in the environment that affect tests - or which might be changed by the user tests. - - An internal class is used to hold settings and a stack - of these objects is pushed and popped as Save and Restore - are called. - - - - - Link to a prior saved context - - - - - Indicates that a stop has been requested - - - - - The event listener currently receiving notifications - - - - - The number of assertions for the current test - - - - - The current culture - - - - - The current UI culture - - - - - The current test result - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - An existing instance of TestExecutionContext. - - - - The current context, head of the list of saved contexts. - - - - - Gets the current context. - - The current context. - - - - Clear the current context. This is provided to - prevent "leakage" of the CallContext containing - the current context back to any runners. - - - - - Gets or sets the current test - - - - - The time the current test started execution - - - - - The time the current test started in Ticks - - - - - Gets or sets the current test result - - - - - Gets a TextWriter that will send output to the current test result. - - - - - The current test object - that is the user fixture - object on which tests are being executed. - - - - - Get or set the working directory - - - - - Get or set indicator that run should stop on the first error - - - - - Gets an enum indicating whether a stop has been requested. - - - - - The current test event listener - - - - - The current WorkItemDispatcher - - - - - The ParallelScope to be used by tests running in this context. - For builds with out the parallel feature, it has no effect. - - - - - Gets the RandomGenerator specific to this Test - - - - - Gets the assert count. - - The assert count. - - - - Gets or sets the test case timeout value - - - - - Gets a list of ITestActions set by upstream tests - - - - - Saves or restores the CurrentCulture - - - - - Saves or restores the CurrentUICulture - - - - - Record any changes in the environment made by - the test code in the execution context so it - will be passed on to lower level tests. - - - - - Set up the execution environment to match a context. - Note that we may be running on the same thread where the - context was initially created or on a different thread. - - - - - Increments the assert count by one. - - - - - Increments the assert count by a specified amount. - - - - - Enumeration indicating whether the tests are - running normally or being cancelled. - - - - - Running normally with no stop requested - - - - - A graceful stop has been requested - - - - - A forced stop has been requested - - - - - Interface to be implemented by filters applied to tests. - The filter applies when running the test, after it has been - loaded, since this is the only time an ITest exists. - - - - - Unique Empty filter. - - - - - Indicates whether this is the EmptyFilter - - - - - Indicates whether this is a top-level filter, - not contained in any other filter. - - - - - Determine if a particular test passes the filter criteria. The default - implementation checks the test itself, its parents and any descendants. - - Derived classes may override this method or any of the Match methods - to change the behavior of the filter. - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - Determine whether the test itself matches the filter criteria, without - examining either parents or descendants. This is overridden by each - different type of filter to perform the necessary tests. - - The test to which the filter is applied - True if the filter matches the any parent of the test - - - - Determine whether any ancestor of the test matches the filter criteria - - The test to which the filter is applied - True if the filter matches the an ancestor of the test - - - - Determine whether any descendant of the test matches the filter criteria. - - The test to be matched - True if at least one descendant matches the filter criteria - - - - Create a TestFilter instance from an xml representation. - - - - - Create a TestFilter from it's TNode representation - - - - - Nested class provides an empty filter - one that always - returns true when called. It never matches explicitly. - - - - - Adds an XML node - - True if recursive - The added XML node - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - The TestCaseParameters class encapsulates method arguments and - other selected parameters needed for constructing - a parameterized test case. - - - - - Default Constructor creates an empty parameter set - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a ParameterSet from an object implementing ITestCaseData - - - - - - Type arguments used to create a generic fixture instance - - - - - TestListener provides an implementation of ITestListener that - does nothing. It is used only through its NULL property. - - - - - Called when a test has just started - - The test that is starting - - - - Called when a test case has finished - - The result of the test - - - - Construct a new TestListener - private so it may not be used. - - - - - Get a listener that does nothing - - - - - TestNameGenerator is able to create test names according to - a coded pattern. - - - - - Construct a TestNameGenerator - - The pattern used by this generator. - - - - Get the display name for a TestMethod and it's arguments - - A TestMethod - The display name - - - - Get the display name for a TestMethod and it's arguments - - A TestMethod - Arguments to be used - The display name - - - - Get the display name for a MethodInfo - - A MethodInfo - The display name - - - - Get the display name for a method with args - - A MethodInfo - Argument list for the method - The display name - - - - TestParameters is the abstract base class for all classes - that know how to provide data for constructing a test. - - - - - Default Constructor creates an empty parameter set - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a ParameterSet from an object implementing ITestData - - - - - - The RunState for this set of parameters. - - - - - The arguments to be used in running the test, - which must match the method signature. - - - - - A name to be used for this test case in lieu - of the standard generated name containing - the argument list. - - - - - Gets the property dictionary for this test - - - - - Applies ParameterSet _values to the test itself. - - A test. - - - - The original arguments provided by the user, - used for display purposes. - - - - - TestProgressReporter translates ITestListener events into - the async callbacks that are used to inform the client - software about the progress of a test run. - - - - - Initializes a new instance of the class. - - The callback handler to be used for reporting progress. - - - - Called when a test has just started - - The test that is starting - - - - Called when a test has finished. Sends a result summary to the callback. - to - - The result of the test - - - - Returns the parent test item for the targer test item if it exists - - - parent test item - - - - Makes a string safe for use as an attribute, replacing - characters characters that can't be used with their - corresponding xml representations. - - The string to be used - A new string with the _values replaced - - - - ParameterizedFixtureSuite serves as a container for the set of test - fixtures created from a given Type using various parameters. - - - - - Initializes a new instance of the class. - - The ITypeInfo for the type that represents the suite. - - - - Gets a string representing the type of test - - - - - - ParameterizedMethodSuite holds a collection of individual - TestMethods with their arguments applied. - - - - - Construct from a MethodInfo - - - - - - Gets a string representing the type of test - - - - - - SetUpFixture extends TestSuite and supports - Setup and TearDown methods. - - - - - Initializes a new instance of the class. - - The type. - - - - The Test abstract class represents a test within the framework. - - - - - Static value to seed ids. It's started at 1000 so any - uninitialized ids will stand out. - - - - - The SetUp methods. - - - - - The teardown methods - - - - - Constructs a test given its name - - The name of the test - - - - Constructs a test given the path through the - test hierarchy to its parent and a name. - - The parent tests full name - The name of the test - - - - TODO: Documentation needed for constructor - - - - - - Construct a test from a MethodInfo - - - - - - Gets or sets the id of the test - - - - - - Gets or sets the name of the test - - - - - Gets or sets the fully qualified name of the test - - - - - - Gets the name of the class containing this test. Returns - null if the test is not associated with a class. - - - - - Gets the name of the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the TypeInfo of the fixture used in running this test - or null if no fixture type is associated with it. - - - - - Gets a MethodInfo for the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Whether or not the test should be run - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Gets a string representing the type of test. Used as an attribute - value in the XML representation of a test and has no other - function in the framework. - - - - - Gets a count of test cases represented by - or contained under this test. - - - - - Gets the properties for this test - - - - - Returns true if this is a TestSuite - - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets the parent as a Test object. - Used by the core to set the parent. - - - - - Gets this test's child tests - - A list of child tests - - - - Gets or sets a fixture object for running this test. - - - - - Static prefix used for ids in this AppDomain. - Set by FrameworkController. - - - - - Gets or Sets the Int value representing the seed for the RandomGenerator - - - - - - Creates a TestResult for this test. - - A TestResult suitable for this type of test. - - - - Modify a newly constructed test by applying any of NUnit's common - attributes, based on a supplied ICustomAttributeProvider, which is - usually the reflection element from which the test was constructed, - but may not be in some instances. The attributes retrieved are - saved for use in subsequent operations. - - An object deriving from MemberInfo - - - - Modify a newly constructed test by applying any of NUnit's common - attributes, based on a supplied ICustomAttributeProvider, which is - usually the reflection element from which the test was constructed, - but may not be in some instances. The attributes retrieved are - saved for use in subsequent operations. - - An object deriving from MemberInfo - - - - Add standard attributes and members to a test node. - - - - - - - Returns the Xml representation of the test - - If true, include child tests recursively - - - - - Returns an XmlNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Compares this test to another test for sorting purposes - - The other test - Value of -1, 0 or +1 depending on whether the current test is less than, equal to or greater than the other test - - - - TestAssembly is a TestSuite that represents the execution - of tests in a managed assembly. - - - - - Initializes a new instance of the class - specifying the Assembly and the path from which it was loaded. - - The assembly this test represents. - The path used to load the assembly. - - - - Initializes a new instance of the class - for a path which could not be loaded. - - The path used to load the assembly. - - - - Gets the Assembly represented by this instance. - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - TestFixture is a surrogate for a user test fixture class, - containing one or more tests. - - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - The TestMethod class represents a Test implemented as a method. - - - - - The ParameterSet used to create this test method - - - - - Initializes a new instance of the class. - - The method to be used as a test. - - - - Initializes a new instance of the class. - - The method to be used as a test. - The suite or fixture to which the new test will be added - - - - Overridden to return a TestCaseResult. - - A TestResult for this test. - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Returns a TNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Gets this test's child tests - - A list of child tests - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Returns the name of the method - - - - - TestSuite represents a composite test, which contains other tests. - - - - - Our collection of child tests - - - - - Initializes a new instance of the class. - - The name of the suite. - - - - Initializes a new instance of the class. - - Name of the parent suite. - The name of the suite. - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - Sorts tests under this suite. - - - - - Adds a test to the suite. - - The test. - - - - Gets this test's child tests - - The list of child tests - - - - Gets a count of test cases represented by - or contained under this test. - - - - - - The arguments to use in creating the fixture - - - - - Set to true to suppress sorting this suite's contents - - - - - Overridden to return a TestSuiteResult. - - A TestResult for this test. - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Returns an XmlNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Check that setup and teardown methods marked by certain attributes - meet NUnit's requirements and mark the tests not runnable otherwise. - - The attribute type to check for - - - - TypeHelper provides static methods that operate on Types. - - - - - A special value, which is used to indicate that BestCommonType() method - was unable to find a common type for the specified arguments. - - - - - Gets the display name for a Type as used by NUnit. - - The Type for which a display name is needed. - The display name for the Type - - - - Gets the display name for a Type as used by NUnit. - - The Type for which a display name is needed. - The arglist provided. - The display name for the Type - - - - Returns the best fit for a common type to be used in - matching actual arguments to a methods Type parameters. - - The first type. - The second type. - Either type1 or type2, depending on which is more general. - - - - Determines whether the specified type is numeric. - - The type to be examined. - - true if the specified type is numeric; otherwise, false. - - - - - Convert an argument list to the required parameter types. - Currently, only widening numeric conversions are performed. - - An array of args to be converted - A ParameterInfo[] whose types will be used as targets - - - - Determines whether this instance can deduce type args for a generic type from the supplied arguments. - - The type to be examined. - The arglist. - The type args to be used. - - true if this the provided args give sufficient information to determine the type args to be used; otherwise, false. - - - - - Gets the _values for an enumeration, using Enum.GetTypes - where available, otherwise through reflection. - - - - - - - Gets the ids of the _values for an enumeration, - using Enum.GetNames where available, otherwise - through reflection. - - - - - - - The TypeWrapper class wraps a Type so it may be used in - a platform-independent manner. - - - - - Construct a TypeWrapper for a specified Type. - - - - - Gets the underlying Type on which this TypeWrapper is based. - - - - - Gets the base type of this type as an ITypeInfo - - - - - Gets the Name of the Type - - - - - Gets the FullName of the Type - - - - - Gets the assembly in which the type is declared - - - - - Gets the namespace of the Type - - - - - Gets a value indicating whether the type is abstract. - - - - - Gets a value indicating whether the Type is a generic Type - - - - - Returns true if the Type wrapped is T - - - - - Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. - - - - - Gets a value indicating whether the Type is a generic Type definition - - - - - Gets a value indicating whether the type is sealed. - - - - - Gets a value indicating whether this type represents a static class. - - - - - Get the display name for this type - - - - - Get the display name for an object of this type, constructed with the specified args. - - - - - Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments - - - - - Returns a Type representing a generic type definition from which this Type can be constructed. - - - - - Returns an array of custom attributes of the specified type applied to this type - - - - - Returns a value indicating whether the type has an attribute of the specified type. - - - - - - - - Returns a flag indicating whether this type has a method with an attribute of the specified type. - - - - - - - Returns an array of IMethodInfos for methods of this Type - that match the specified flags. - - - - - Returns a value indicating whether this Type has a public constructor taking the specified argument Types. - - - - - Construct an object of this Type, using the specified arguments. - - - - - Override ToString() so that error messages in NUnit's own tests make sense - - - - - Class used to guard against unexpected argument values - or operations by throwing an appropriate exception. - - - - - Throws an exception if an argument is null - - The value to be tested - The name of the argument - - - - Throws an exception if a string argument is null or empty - - The value to be tested - The name of the argument - - - - Throws an ArgumentOutOfRangeException if the specified condition is not met. - - The condition that must be met - The exception message to be used - The name of the argument - - - - Throws an ArgumentException if the specified condition is not met. - - The condition that must be met - The exception message to be used - The name of the argument - - - - Throws an InvalidOperationException if the specified condition is not met. - - The condition that must be met - The exception message to be used - - - - The different targets a test action attribute can be applied to - - - - - Default target, which is determined by where the action attribute is attached - - - - - Target a individual test case - - - - - Target a suite of test cases - - - - - DefaultTestAssemblyBuilder loads a single assembly and builds a TestSuite - containing test fixtures present in the assembly. - - - - - The default suite builder used by the test assembly builder. - - - - - Initializes a new instance of the class. - - - - - Build a suite of tests from a provided assembly - - The assembly from which tests are to be built - A dictionary of options to use in building the suite - - A TestSuite containing the tests found in the assembly - - - - - Build a suite of tests given the filename of an assembly - - The filename of the assembly from which tests are to be built - A dictionary of options to use in building the suite - - A TestSuite containing the tests found in the assembly - - - - - FrameworkController provides a facade for use in loading, browsing - and running tests without requiring a reference to the NUnit - framework. All calls are encapsulated in constructors for - this class and its nested classes, which only require the - types of the Common Type System as arguments. - - The controller supports four actions: Load, Explore, Count and Run. - They are intended to be called by a driver, which should allow for - proper sequencing of calls. Load must be called before any of the - other actions. The driver may support other actions, such as - reload on run, by combining these calls. - - - - - Construct a FrameworkController using the default builder and runner. - - The AssemblyName or path to the test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - - - - Construct a FrameworkController using the default builder and runner. - - The test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - - - - Construct a FrameworkController, specifying the types to be used - for the runner and builder. This constructor is provided for - purposes of development. - - The full AssemblyName or the path to the test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - The Type of the test runner - The Type of the test builder - - - - Construct a FrameworkController, specifying the types to be used - for the runner and builder. This constructor is provided for - purposes of development. - - The test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - The Type of the test runner - The Type of the test builder - - - - Gets the ITestAssemblyBuilder used by this controller instance. - - The builder. - - - - Gets the ITestAssemblyRunner used by this controller instance. - - The runner. - - - - Gets the AssemblyName or the path for which this FrameworkController was created - - - - - Gets the Assembly for which this - - - - - Gets a dictionary of settings for the FrameworkController - - - - - Inserts settings element - - Target node - Settings dictionary - The new node - - - - FrameworkControllerAction is the base class for all actions - performed against a FrameworkController. - - - - - LoadTestsAction loads a test into the FrameworkController - - - - - LoadTestsAction loads the tests in an assembly. - - The controller. - The callback handler. - - - - ExploreTestsAction returns info about the tests in an assembly - - - - - Initializes a new instance of the class. - - The controller for which this action is being performed. - Filter used to control which tests are included (NYI) - The callback handler. - - - - CountTestsAction counts the number of test cases in the loaded TestSuite - held by the FrameworkController. - - - - - Construct a CountsTestAction and perform the count of test cases. - - A FrameworkController holding the TestSuite whose cases are to be counted - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - RunTestsAction runs the loaded TestSuite held by the FrameworkController. - - - - - Construct a RunTestsAction and run all tests in the loaded TestSuite. - - A FrameworkController holding the TestSuite to run - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - RunAsyncAction initiates an asynchronous test run, returning immediately - - - - - Construct a RunAsyncAction and run all tests in the loaded TestSuite. - - A FrameworkController holding the TestSuite to run - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - StopRunAction stops an ongoing run. - - - - - Construct a StopRunAction and stop any ongoing run. If no - run is in process, no error is raised. - - The FrameworkController for which a run is to be stopped. - True the stop should be forced, false for a cooperative stop. - >A callback handler used to report results - A forced stop will cause threads and processes to be killed as needed. - - - - The ITestAssemblyBuilder interface is implemented by a class - that is able to build a suite of tests given an assembly or - an assembly filename. - - - - - Build a suite of tests from a provided assembly - - The assembly from which tests are to be built - A dictionary of options to use in building the suite - A TestSuite containing the tests found in the assembly - - - - Build a suite of tests given the filename of an assembly - - The filename of the assembly from which tests are to be built - A dictionary of options to use in building the suite - A TestSuite containing the tests found in the assembly - - - - The ITestAssemblyRunner interface is implemented by classes - that are able to execute a suite of tests loaded - from an assembly. - - - - - Gets the tree of loaded tests, or null if - no tests have been loaded. - - - - - Gets the tree of test results, if the test - run is completed, otherwise null. - - - - - Indicates whether a test has been loaded - - - - - Indicates whether a test is currently running - - - - - Indicates whether a test run is complete - - - - - Loads the tests found in an Assembly, returning an - indication of whether or not the load succeeded. - - File name of the assembly to load - Dictionary of options to use in loading the test - An ITest representing the loaded tests - - - - Loads the tests found in an Assembly, returning an - indication of whether or not the load succeeded. - - The assembly to load - Dictionary of options to use in loading the test - An ITest representing the loaded tests - - - - Count Test Cases using a filter - - The filter to apply - The number of test cases found - - - - Run selected tests and return a test result. The test is run synchronously, - and the listener interface is notified as it progresses. - - Interface to receive ITestListener notifications. - A test filter used to select tests to be run - - - - Run selected tests asynchronously, notifying the listener interface as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - - - Wait for the ongoing run to complete. - - Time to wait in milliseconds - True if the run completed, otherwise false - - - - Signal any test run that is in process to stop. Return without error if no test is running. - - If true, kill any test-running threads - - - - Implementation of ITestAssemblyRunner - - - - - Initializes a new instance of the class. - - The builder. - - - - The tree of tests that was loaded by the builder - - - - - The test result, if a run has completed - - - - - Indicates whether a test is loaded - - - - - Indicates whether a test is running - - - - - Indicates whether a test run is complete - - - - - Our settings, specified when loading the assembly - - - - - The top level WorkItem created for the assembly as a whole - - - - - The TestExecutionContext for the top level WorkItem - - - - - Loads the tests found in an Assembly - - File name of the assembly to load - Dictionary of option settings for loading the assembly - True if the load was successful - - - - Loads the tests found in an Assembly - - The assembly to load - Dictionary of option settings for loading the assembly - True if the load was successful - - - - Count Test Cases using a filter - - The filter to apply - The number of test cases found - - - - Run selected tests and return a test result. The test is run synchronously, - and the listener interface is notified as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - - - - Run selected tests asynchronously, notifying the listener interface as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - RunAsync is a template method, calling various abstract and - virtual methods to be overridden by derived classes. - - - - - Wait for the ongoing run to complete. - - Time to wait in milliseconds - True if the run completed, otherwise false - - - - Initiate the test run. - - - - - Signal any test run that is in process to stop. Return without error if no test is running. - - If true, kill any test-running threads - - - - Create the initial TestExecutionContext used to run tests - - The ITestListener specified in the RunAsync call - - - - Handle the the Completed event for the top level work item - - - - - The Assert class contains a collection of static methods that - implement the most common assertions used in NUnit. - - - - - Verifies that the first int is greater than the second - int. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first int is greater than the second - int. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - - - - Assert that a string is empty - that is equal to string.Empty - - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that a string is empty - that is equal to string.Empty - - The string to be tested - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing ICollection - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing ICollection - - - - Assert that a string is not empty - that is not equal to string.Empty - - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that a string is not empty - that is not equal to string.Empty - - The string to be tested - - - - Assert that an array, list or other collection is not empty - - An array, list or other collection implementing ICollection - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that an array, list or other collection is not empty - - An array, list or other collection implementing ICollection - - - - We don't actually want any instances of this object, but some people - like to inherit from it to add other static methods. Hence, the - protected constructor disallows any instances of this object. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - The message to initialize the with. - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - - - - Throws an with the message and arguments - that are passed in. This is used by the other Assert functions. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This is used by the other Assert functions. - - The message to initialize the with. - - - - Throws an . - This is used by the other Assert functions. - - - - - Throws an with the message and arguments - that are passed in. This causes the test to be reported as ignored. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This causes the test to be reported as ignored. - - The message to initialize the with. - - - - Throws an . - This causes the test to be reported as ignored. - - - - - Throws an with the message and arguments - that are passed in. This causes the test to be reported as inconclusive. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This causes the test to be reported as inconclusive. - - The message to initialize the with. - - - - Throws an . - This causes the test to be reported as Inconclusive. - - - - - Asserts that an object is contained in a list. - - The expected object - The list to be examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is contained in a list. - - The expected object - The list to be examined - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - - - - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. - - The value that is expected - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. - - The value that is expected - The actual value - - - - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. - - The value that is expected - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. - - The value that is expected - The actual value - - - - Asserts that two objects refer to the same object. If they - are not the same an is thrown. - - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that two objects refer to the same object. If they - are not the same an is thrown. - - The expected object - The actual object - - - - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. - - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. - - The expected object - The actual object - - - - Helper for Assert.AreEqual(double expected, double actual, ...) - allowing code generation to work consistently. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - A constraint to be satisfied by the exception - A TestSnippet delegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - A constraint to be satisfied by the exception - A TestSnippet delegate - - - - Verifies that a delegate throws a particular exception when called. - - The exception Type expected - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - The exception Type expected - A TestDelegate - - - - Verifies that a delegate throws a particular exception when called. - - Type of the expected exception - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - Type of the expected exception - A TestDelegate - - - - Verifies that a delegate throws an exception when called - and returns it. - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception when called - and returns it. - - A TestDelegate - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - A TestDelegate - - - - Verifies that a delegate does not throw an exception - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate does not throw an exception. - - A TestDelegate - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - Used as a synonym for That in rare cases where a private setter - causes a Visual Basic compilation error. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - Used as a synonym for That in rare cases where a private setter - causes a Visual Basic compilation error. - - - This method is provided for use by VB developers needing to test - the value of properties with private setters. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - - - - Delegate used by tests that execute code and - capture any thrown exception. - - - - - AssertionHelper is an optional base class for user tests, - allowing the use of shorter ids for constraints and - asserts and avoiding conflict with the definition of - , from which it inherits much of its - behavior, in certain mock object frameworks. - - - - - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to - . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to . - - The evaluated condition - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Returns a ListMapper based on a collection. - - The original collection - - - - - Provides static methods to express the assumptions - that must be met for a test to give a meaningful - result. If an assumption is not met, the test - should produce an inconclusive result. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the - method throws an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Provides the Author of a test or test fixture. - - - - - Initializes a new instance of the class. - - The name of the author. - - - - Initializes a new instance of the class. - - The name of the author. - The email address of the author. - - - - Attribute used to apply a category to a test - - - - - The name of the category - - - - - Construct attribute for a given category based on - a name. The name may not contain the characters ',', - '+', '-' or '!'. However, this is not checked in the - constructor since it would cause an error to arise at - as the test was loaded without giving a clear indication - of where the problem is located. The error is handled - in NUnitFramework.cs by marking the test as not - runnable. - - The name of the category - - - - Protected constructor uses the Type name as the name - of the category. - - - - - The name of the category - - - - - Modifies a test by adding a category to it. - - The test to modify - - - - Marks a test to use a combinatorial join of any argument - data provided. Since this is the default, the attribute is - optional. - - - - - Default constructor - - - - - Marks a test to use a particular CombiningStrategy to join - any parameter data provided. Since this is the default, the - attribute is optional. - - - - - Construct a CombiningStrategyAttribute incorporating an - ICombiningStrategy and an IParamterDataProvider. - - Combining strategy to be used in combining data - An IParameterDataProvider to supply data - - - - Construct a CombiningStrategyAttribute incorporating an object - that implements ICombiningStrategy and an IParameterDataProvider. - This constructor is provided for CLS compliance. - - Combining strategy to be used in combining data - An IParameterDataProvider to supply data - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The MethodInfo for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - Modify the test by adding the name of the combining strategy - to the properties. - - The test to modify - - - - CultureAttribute is used to mark a test fixture or an - individual method as applying to a particular Culture only. - - - - - Constructor with no cultures specified, for use - with named property syntax. - - - - - Constructor taking one or more cultures - - Comma-deliminted list of cultures - - - - Causes a test to be skipped if this CultureAttribute is not satisfied. - - The test to modify - - - - Tests to determine if the current culture is supported - based on the properties of this attribute. - - True, if the current culture is supported - - - - Test to determine if the a particular culture or comma- - delimited set of cultures is in use. - - Name of the culture or comma-separated list of culture ids - True if the culture is in use on the system - - - - Test to determine if one of a collection of cultures - is being used currently. - - - - - - - The abstract base class for all data-providing attributes - defined by NUnit. Used to select all data sources for a - method, class or parameter. - - - - - Default constructor - - - - - Used to mark a field for use as a datapoint when executing a theory - within the same fixture that requires an argument of the field's Type. - - - - - Used to mark a field, property or method providing a set of datapoints to - be used in executing any theories within the same fixture that require an - argument of the Type provided. The data source may provide an array of - the required Type or an . - Synonymous with DatapointSourceAttribute. - - - - - Used to mark a field, property or method providing a set of datapoints to - be used in executing any theories within the same fixture that require an - argument of the Type provided. The data source may provide an array of - the required Type or an . - Synonymous with DatapointsAttribute. - - - - - Attribute used to provide descriptive text about a - test case or fixture. - - - - - Construct a description Attribute - - The text of the description - - - - ExplicitAttribute marks a test or test fixture so that it will - only be run if explicitly executed from the gui or command line - or if it is included by use of a filter. The test will not be - run simply because an enclosing suite is run. - - - - - Default constructor - - - - - Constructor with a reason - - The reason test is marked explicit - - - - Modifies a test by marking it as explicit. - - The test to modify - - - - Attribute used to mark a test that is to be ignored. - Ignored tests result in a warning message when the - tests are run. - - - - - Constructs the attribute giving a reason for ignoring the test - - The reason for ignoring the test - - - - The date in the future to stop ignoring the test as a string in UTC time. - For example for a date and time, "2014-12-25 08:10:00Z" or for just a date, - "2014-12-25". If just a date is given, the Ignore will expire at midnight UTC. - - - Once the ignore until date has passed, the test will be marked - as runnable. Tests with an ignore until date will have an IgnoreUntilDate - property set which will appear in the test results. - - The string does not contain a valid string representation of a date and time. - - - - Modifies a test by marking it as Ignored. - - The test to modify - - - - Abstract base for Attributes that are used to include tests - in the test run based on environmental settings. - - - - - Constructor with no included items specified, for use - with named property syntax. - - - - - Constructor taking one or more included items - - Comma-delimited list of included items - - - - Name of the item that is needed in order for - a test to run. Multiple items may be given, - separated by a comma. - - - - - Name of the item to be excluded. Multiple items - may be given, separated by a comma. - - - - - The reason for including or excluding the test - - - - - LevelOfParallelismAttribute is used to set the number of worker threads - that may be allocated by the framework for running tests. - - - - - Construct a LevelOfParallelismAttribute. - - The number of worker threads to be created by the framework. - - - - Summary description for MaxTimeAttribute. - - - - - Construct a MaxTimeAttribute, given a time in milliseconds. - - The maximum elapsed time in milliseconds - - - - The abstract base class for all custom attributes defined by NUnit. - - - - - Default constructor - - - - - Attribute used to identify a method that is called once - to perform setup before any child tests are run. - - - - - Attribute used to identify a method that is called once - after all the child tests have run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Marks a test to use a pairwise join of any argument - data provided. Arguments will be combined in such a - way that all possible pairs of arguments are used. - - - - - Default constructor - - - - - ParallelizableAttribute is used to mark tests that may be run in parallel. - - - - - Construct a ParallelizableAttribute using default ParallelScope.Self. - - - - - Construct a ParallelizableAttribute with a specified scope. - - The ParallelScope associated with this attribute. - - - - Modify the context to be used for child tests - - The current TestExecutionContext - - - - The ParallelScope enumeration permits specifying the degree to - which a test and its descendants may be run in parallel. - - - - - No Parallelism is permitted - - - - - The test itself may be run in parallel with others at the same level - - - - - Descendants of the test may be run in parallel with one another - - - - - Descendants of the test down to the level of TestFixtures may be run in parallel - - - - - PropertyAttribute is used to attach information to a test as a name/value pair.. - - - - - Construct a PropertyAttribute with a name and string value - - The name of the property - The property value - - - - Construct a PropertyAttribute with a name and int value - - The name of the property - The property value - - - - Construct a PropertyAttribute with a name and double value - - The name of the property - The property value - - - - Constructor for derived classes that set the - property dictionary directly. - - - - - Constructor for use by derived classes that use the - name of the type as the property name. Derived classes - must ensure that the Type of the property value is - a standard type supported by the BCL. Any custom - types will cause a serialization Exception when - in the client. - - - - - Gets the property dictionary for this attribute - - - - - Modifies a test by adding properties to it. - - The test to modify - - - - RandomAttribute is used to supply a set of random _values - to a single parameter of a parameterized test. - - - - - Construct a random set of values appropriate for the Type of the - parameter on which the attribute appears, specifying only the count. - - - - - - Construct a set of ints within a specified range - - - - - Construct a set of unsigned ints within a specified range - - - - - Construct a set of longs within a specified range - - - - - Construct a set of unsigned longs within a specified range - - - - - Construct a set of shorts within a specified range - - - - - Construct a set of unsigned shorts within a specified range - - - - - Construct a set of doubles within a specified range - - - - - Construct a set of floats within a specified range - - - - - Construct a set of bytes within a specified range - - - - - Construct a set of sbytes within a specified range - - - - - Get the collection of _values to be used as arguments. - - - - - RangeAttribute is used to supply a range of _values to an - individual parameter of a parameterized test. - - - - - Construct a range of ints using default step of 1 - - - - - - - Construct a range of ints specifying the step size - - - - - - - - Construct a range of unsigned ints using default step of 1 - - - - - - - Construct a range of unsigned ints specifying the step size - - - - - - - - Construct a range of longs using a default step of 1 - - - - - - - Construct a range of longs - - - - - - - - Construct a range of unsigned longs using default step of 1 - - - - - - - Construct a range of unsigned longs specifying the step size - - - - - - - - Construct a range of doubles - - - - - - - - Construct a range of floats - - - - - - - - RepeatAttribute may be applied to test case in order - to run it multiple times. - - - - - Construct a RepeatAttribute - - The number of times to run the test - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - The test command for the RepeatAttribute - - - - - Initializes a new instance of the class. - - The inner command. - The number of repetitions - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - RepeatAttribute may be applied to test case in order - to run it multiple times. - - - - - Construct a RepeatAttribute - - The number of times to run the test - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - The test command for the RetryAttribute - - - - - Initializes a new instance of the class. - - The inner command. - The number of repetitions - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - Marks a test to use a Sequential join of any argument - data provided. Arguments will be combined into test cases, - taking the next value of each argument until all are used. - - - - - Default constructor - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - SetUpFixtureAttribute is used to identify a SetUpFixture - - - - - Build a SetUpFixture from type provided. Normally called for a Type - on which the attribute has been placed. - - The type info of the fixture to be used. - A SetUpFixture object as a TestSuite. - - - - Attribute used to identify a method that is called - immediately after each test is run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Provide actions to execute before and after tests. - - - - - Executed before each test is run - - The test that is going to be run. - - - - Executed after each test is run - - The test that has just been run. - - - - Provides the target for the action attribute - - - - - Adding this attribute to a method within a - class makes the method callable from the NUnit test runner. There is a property - called Description which is optional which you can provide a more detailed test - description. This class cannot be inherited. - - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - public void TestDescriptionMethod() - {} - } - - - - - - Descriptive text for this test - - - - - The author of this test - - - - - The type that this test is testing - - - - - Modifies a test by adding a description, if not already set. - - The test to modify - - - - Gets or sets the expected result. - - The result. - - - - Returns true if an expected result has been set - - - - - Construct a TestMethod from a given method. - - The method for which a test is to be constructed. - The suite to which the test will be added. - A TestMethod - - - - TestCaseAttribute is used to mark parameterized test cases - and provide them with their arguments. - - - - - Construct a TestCaseAttribute with a list of arguments. - This constructor is not CLS-Compliant - - - - - - Construct a TestCaseAttribute with a single argument - - - - - - Construct a TestCaseAttribute with a two arguments - - - - - - - Construct a TestCaseAttribute with a three arguments - - - - - - - - Gets or sets the name of the test. - - The name of the test. - - - - Gets or sets the RunState of this test case. - - - - - Gets the list of arguments to a test case - - - - - Gets the properties of the test case - - - - - Gets or sets the expected result. - - The result. - - - - Returns true if the expected result has been set - - - - - Gets or sets the description. - - The description. - - - - The author of this test - - - - - The type that this test is testing - - - - - Gets or sets the reason for ignoring the test - - - - - Gets or sets a value indicating whether this is explicit. - - - true if explicit; otherwise, false. - - - - - Gets or sets the reason for not running the test. - - The reason. - - - - Gets or sets the ignore reason. When set to a non-null - non-empty value, the test is marked as ignored. - - The ignore reason. - - - - Gets and sets the category for this test case. - May be a comma-separated list of categories. - - - - - Performs several special conversions allowed by NUnit in order to - permit arguments with types that cannot be used in the constructor - of an Attribute such as TestCaseAttribute or to simplify their use. - - The arguments to be converted - The ParameterInfo array for the method - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The MethodInfo for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - TestCaseSourceAttribute indicates the source to be used to - provide test cases for a test method. - - - - - Construct with the name of the method, property or field that will provide data - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - Construct with a Type - - The type that will provide data - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets or sets the category associated with every fixture created from - this attribute. May be a single category or a comma-separated list. - - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The IMethod for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - Returns a set of ITestCaseDataItems for use as arguments - to a parameterized test method. - - The method for which data is needed. - - - - - TestFixtureAttribute is used to mark a class that represents a TestFixture. - - - - - Default constructor - - - - - Construct with a object[] representing a set of arguments. - In .NET 2.0, the arguments may later be separated into - type arguments and constructor arguments. - - - - - - Gets or sets the name of the test. - - The name of the test. - - - - Gets or sets the RunState of this test fixture. - - - - - The arguments originally provided to the attribute - - - - - Properties pertaining to this fixture - - - - - Get or set the type arguments. If not set - explicitly, any leading arguments that are - Types are taken as type arguments. - - - - - Descriptive text for this fixture - - - - - The author of this fixture - - - - - The type that this fixture is testing - - - - - Gets or sets the ignore reason. May set RunState as a side effect. - - The ignore reason. - - - - Gets or sets the reason for not running the fixture. - - The reason. - - - - Gets or sets the ignore reason. When set to a non-null - non-empty value, the test is marked as ignored. - - The ignore reason. - - - - Gets or sets a value indicating whether this is explicit. - - - true if explicit; otherwise, false. - - - - - Gets and sets the category for this fixture. - May be a comma-separated list of categories. - - - - - Build a fixture from type provided. Normally called for a Type - on which the attribute has been placed. - - The type info of the fixture to be used. - A an IEnumerable holding one TestFixture object. - - - - Attribute used to identify a method that is - called before any tests in a fixture are run. - - - - - TestCaseSourceAttribute indicates the source to be used to - provide test fixture instances for a test class. - - - - - Error message string is public so the tests can use it - - - - - Construct with the name of the method, property or field that will provide data - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - Construct with a Type - - The type that will provide data - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets or sets the category associated with every fixture created from - this attribute. May be a single category or a comma-separated list. - - - - - Construct one or more TestFixtures from a given Type, - using available parameter data. - - The TypeInfo for which fixures are to be constructed. - One or more TestFixtures as TestSuite - - - - Returns a set of ITestFixtureData items for use as arguments - to a parameterized test fixture. - - The type for which data is needed. - - - - - Attribute used to identify a method that is called after - all the tests in a fixture have run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Indicates which class the test or test fixture is testing - - - - - Initializes a new instance of the class. - - The type that is being tested. - - - - Initializes a new instance of the class. - - The type that is being tested. - - - - Adding this attribute to a method within a - class makes the method callable from the NUnit test runner. There is a property - called Description which is optional which you can provide a more detailed test - description. This class cannot be inherited. - - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - public void TestDescriptionMethod() - {} - } - - - - - - Construct the attribute, specifying a combining strategy and source of parameter data. - - - - - ValuesAttribute is used to provide literal arguments for - an individual parameter of a test. - - - - - The collection of data to be returned. Must - be set by any derived attribute classes. - We use an object[] so that the individual - elements may have their type changed in GetData - if necessary - - - - - Constructs for use with an Enum parameter. Will pass every enum - value in to the test. - - - - - Construct with one argument - - - - - - Construct with two arguments - - - - - - - Construct with three arguments - - - - - - - - Construct with an array of arguments - - - - - - Get the collection of _values to be used as arguments - - - - - ValueSourceAttribute indicates the source to be used to - provide data for one parameter of a test method. - - - - - Construct with the name of the factory - for use with languages - that don't support params arrays. - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - for use with languages - that don't support params arrays. - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets an enumeration of data items for use as arguments - for a test method parameter. - - The parameter for which data is needed - - An enumeration containing individual data items - - - - - A set of Assert methods operating on one or more collections - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Asserts that all items contained in collection are of the type specified by expectedType. - - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - - - - Asserts that all items contained in collection are of the type specified by expectedType. - - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that all items contained in collection are not equal to null. - - IEnumerable containing objects to be considered - - - - Asserts that all items contained in collection are not equal to null. - - IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Ensures that every object contained in collection exists within the collection - once and only once. - - IEnumerable of objects to be considered - - - - Ensures that every object contained in collection exists within the collection - once and only once. - - IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not exactly equal. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - - - - Asserts that expected and actual are not exactly equal. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not equivalent. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are not equivalent. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that collection contains actual as an item. - - IEnumerable of objects to be considered - Object to be found within collection - - - - Asserts that collection contains actual as an item. - - IEnumerable of objects to be considered - Object to be found within collection - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that collection does not contain actual as an item. - - IEnumerable of objects to be considered - Object that cannot exist within collection - - - - Asserts that collection does not contain actual as an item. - - IEnumerable of objects to be considered - Object that cannot exist within collection - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the superset does not contain the subset - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - - - - Asserts that the superset does not contain the subset - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the superset contains the subset. - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - - - - Asserts that the superset contains the subset. - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the subset does not contain the superset - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - - - - Asserts that the subset does not contain the superset - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the subset contains the superset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - - - - Asserts that the subset contains the superset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array,list or other collection is empty - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array,list or other collection is empty - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - - - - Provides a platform-independent methods for getting attributes - for use by AttributeConstraint and AttributeExistsConstraint. - - - - - Gets the custom attributes from the given object. - - Portable libraries do not have an ICustomAttributeProvider, so we need to cast to each of - it's direct subtypes and try to get attributes off those instead. - The actual. - Type of the attribute. - if set to true [inherit]. - A list of the given attribute on the given object. - - - - Specifies flags that control binding and the way in which the search for members - and types is conducted by reflection. - - - - - Specifies no binding flag. - - - - - Specifies that only members declared at the level of the supplied type's hierarchy - should be considered. Inherited members are not considered. - - - - - Specifies that instance members are to be included in the search. - - - - - Specifies that static members are to be included in the search. - - - - - Specifies that public members are to be included in the search. - - - - - Specifies that non-public members are to be included in the search. - - - - - Specifies that public and protected static members up the hierarchy should be - returned. Private static members in inherited classes are not returned. Static - members include fields, methods, events, and properties. Nested types are not - returned. - - - - - A MarshalByRefObject that lives forever - - - - - Some path based methods that we need even in the Portable framework which - does not have the System.IO.Path class - - - - - Windows directory separator - - - - - Alternate directory separator - - - - - A volume separator character. - - - - - Get the file name and extension of the specified path string. - - The path string from which to obtain the file name and extension. - The filename as a . If the last character of is a directory or volume separator character, this method returns . If is null, this method returns null. - - - - Provides NUnit specific extensions to aid in Reflection - across multiple frameworks - - - This version of the class allows direct calls on Type on - those platforms that would normally require use of - GetTypeInfo(). - - - - - Returns an array of generic arguments for the give type - - - - - - - Gets the constructor with the given parameter types - - - - - - - - Gets the constructors for a type - - - - - - - - - - - - - - - - - - - - - - - Gets declared or inherited interfaces on this type - - - - - - - Gets the member on a given type by name. BindingFlags ARE IGNORED. - - - - - - - - - Gets all members on a given type. BindingFlags ARE IGNORED. - - - - - - - - Gets field of the given name on the type - - - - - - - - Gets property of the given name on the type - - - - - - - - Gets property of the given name on the type - - - - - - - - - Gets the method with the given name and parameter list - - - - - - - - Gets the method with the given name and parameter list - - - - - - - - - Gets the method with the given name and parameter list - - - - - - - - - Gets public methods on the given type - - - - - - - Gets methods on a type - - - - - - - - Determines if one type can be implicitly converted from another - - - - - - - - Extensions to the various MemberInfo derived classes - - - - - Returns the get method for the given property - - - - - - - - Returns an array of custom attributes of the specified type applied to this member - - Portable throws an argument exception if T does not - derive from Attribute. NUnit uses interfaces to find attributes, thus - this method - - - - Returns an array of custom attributes of the specified type applied to this parameter - - - - - Returns an array of custom attributes of the specified type applied to this assembly - - - - - Extensions for Assembly that are not available in portable - - - - - DNX does not have a version of GetCustomAttributes on Assembly that takes an inherit - parameter since it doesn't make sense on Assemblies. This version just ignores the - inherit parameter. - - The assembly - The type of attribute you are looking for - Ignored - - - - - Gets the types in a given assembly - - - - - - - This class is a System.Diagnostics.Stopwatch on operating systems that support it. On those that don't, - it replicates the functionality at the resolution supported. - - - - - Gets the total elapsed time measured by the current instance, in milliseconds. - - - - - Gets a value indicating whether the Stopwatch timer is running. - - - - - Gets the current number of ticks in the timer mechanism. - - - If the Stopwatch class uses a high-resolution performance counter, GetTimestamp returns the current - value of that counter. If the Stopwatch class uses the system timer, GetTimestamp returns the current - DateTime.Ticks property of the DateTime.Now instance. - - A long integer representing the tick counter value of the underlying timer mechanism. - - - - Stops time interval measurement and resets the elapsed time to zero. - - - - - Starts, or resumes, measuring elapsed time for an interval. - - - - - Initializes a new Stopwatch instance, sets the elapsed time property to zero, and starts measuring elapsed time. - - A Stopwatch that has just begun measuring elapsed time. - - - - Stops measuring elapsed time for an interval. - - - - - Returns a string that represents the current object. - - - A string that represents the current object. - - - - - Gets the frequency of the timer as the number of ticks per second. - - - - - Indicates whether the timer is based on a high-resolution performance counter. - - - - - AllItemsConstraint applies another constraint to each - item in a collection, succeeding if they all succeed. - - - - - Construct an AllItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - failing if any item fails. - - - - - - - AndConstraint succeeds only if both members succeed. - - - - - Create an AndConstraint from two other constraints - - The first constraint - The second constraint - - - - Gets text describing a constraint - - - - - Apply both member constraints to an actual value, succeeding - succeeding only if both of them succeed. - - The actual value - True if the constraints both succeeded - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - AssignableFromConstraint is used to test that an object - can be assigned from a given Type. - - - - - Construct an AssignableFromConstraint for the type provided - - - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - AssignableToConstraint is used to test that an object - can be assigned to a given Type. - - - - - Construct an AssignableToConstraint for the type provided - - - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - AttributeConstraint tests that a specified attribute is present - on a Type or other provider and that the value of the attribute - satisfies some other constraint. - - - - - Constructs an AttributeConstraint for a specified attribute - Type and base constraint. - - - - - - - Determines whether the Type or other provider has the - expected attribute and if its value matches the - additional constraint specified. - - - - - Returns a string representation of the constraint. - - - - - AttributeExistsConstraint tests for the presence of a - specified attribute on a Type. - - - - - Constructs an AttributeExistsConstraint for a specific attribute Type - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Tests whether the object provides the expected attribute. - - A Type, MethodInfo, or other ICustomAttributeProvider - True if the expected attribute is present, otherwise false - - - - BinaryConstraint is the abstract base of all constraints - that combine two other constraints in some fashion. - - - - - The first constraint being combined - - - - - The second constraint being combined - - - - - Construct a BinaryConstraint from two other constraints - - The first constraint - The second constraint - - - - CollectionConstraint is the abstract base class for - constraints that operate on collections. - - - - - Construct an empty CollectionConstraint - - - - - Construct a CollectionConstraint - - - - - - Determines whether the specified enumerable is empty. - - The enumerable. - - true if the specified enumerable is empty; otherwise, false. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Protected method to be implemented by derived classes - - - - - - - CollectionContainsConstraint is used to test whether a collection - contains an expected object as a member. - - - - - Construct a CollectionContainsConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Gets the expected object - - - - - Test whether the expected item is contained in the collection - - - - - - - CollectionEquivalentConstraint is used to determine whether two - collections are equivalent. - - - - - Construct a CollectionEquivalentConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether two collections are equivalent - - - - - - - CollectionItemsEqualConstraint is the abstract base class for all - collection constraints that apply some notion of item equality - as a part of their operation. - - - - - Construct an empty CollectionConstraint - - - - - Construct a CollectionConstraint - - - - - - Flag the constraint to ignore case and return self. - - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied Comparison object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Compares two collection members for equality - - - - - Return a new CollectionTally for use in making tests - - The collection to be included in the tally - - - - CollectionOrderedConstraint is used to test whether a collection is ordered. - - - - - Construct a CollectionOrderedConstraint - - - - - If used performs a reverse comparison - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use a and returns self. - - - - - Modifies the constraint to test ordering by the value of - a specified property and returns self. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the collection is ordered - - - - - - - Returns the string representation of the constraint. - - - - - - CollectionSubsetConstraint is used to determine whether - one collection is a subset of another - - - - - Construct a CollectionSubsetConstraint - - The collection that the actual value is expected to be a subset of - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the actual collection is a subset of - the expected collection provided. - - - - - - - CollectionSupersetConstraint is used to determine whether - one collection is a superset of another - - - - - Construct a CollectionSupersetConstraint - - The collection that the actual value is expected to be a superset of - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the actual collection is a superset of - the expected collection provided. - - - - - - - CollectionTally counts (tallies) the number of - occurrences of each object in one or more enumerations. - - - - - Construct a CollectionTally object from a comparer and a collection - - - - - The number of objects remaining in the tally - - - - - Try to remove an object from the tally - - The object to remove - True if successful, false if the object was not found - - - - Try to remove a set of objects from the tally - - The objects to remove - True if successful, false if any object was not found - - - - ComparisonAdapter class centralizes all comparisons of - _values in NUnit, adapting to the use of any provided - , - or . - - - - - Gets the default ComparisonAdapter, which wraps an - NUnitComparer object. - - - - - Returns a ComparisonAdapter that wraps an - - - - - Returns a ComparisonAdapter that wraps an - - - - - Returns a ComparisonAdapter that wraps a - - - - - Compares two objects - - - - - Construct a default ComparisonAdapter - - - - - Construct a ComparisonAdapter for an - - - - - Compares two objects - - - - - - - - ComparerAdapter extends and - allows use of an or - to actually perform the comparison. - - - - - Construct a ComparisonAdapter for an - - - - - Compare a Type T to an object - - - - - Construct a ComparisonAdapter for a - - - - - Compare a Type T to an object - - - - - Abstract base class for constraints that compare _values to - determine if one is greater than, equal to or less than - the other. - - - - - The value against which a comparison is to be made - - - - - If true, less than returns success - - - - - if true, equal returns success - - - - - if true, greater than returns success - - - - - ComparisonAdapter to be used in making the comparison - - - - - Initializes a new instance of the class. - - The value against which to make a comparison. - if set to true less succeeds. - if set to true equal succeeds. - if set to true greater succeeds. - String used in describing the constraint. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Modifies the constraint to use an and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Modifies the constraint to use an and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Modifies the constraint to use a and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Delegate used to delay evaluation of the actual value - to be used in evaluating a constraint - - - - - The Constraint class is the base of all built-in constraints - within NUnit. It provides the operator overloads used to combine - constraints. - - - - - Construct a constraint with optional arguments - - Arguments to be saved - - - - The display name of this Constraint for use by ToString(). - The default value is the name of the constraint with - trailing "Constraint" removed. Derived classes may set - this to another name in their constructors. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Arguments provided to this Constraint, for use in - formatting the description. - - - - - The ConstraintBuilder holding this constraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - Test whether the constraint is satisfied by a given reference. - The default implementation simply dereferences the value but - derived classes may override it to provide for delayed processing. - - A reference to the value to be tested - A ConstraintResult - - - - Default override of ToString returns the constraint DisplayName - followed by any arguments within angle brackets. - - - - - - Returns the string representation of this constraint - - - - - This operator creates a constraint that is satisfied only if both - argument constraints are satisfied. - - - - - This operator creates a constraint that is satisfied if either - of the argument constraints is satisfied. - - - - - This operator creates a constraint that is satisfied if the - argument constraint is not satisfied. - - - - - Returns a ConstraintExpression by appending And - to the current constraint. - - - - - Returns a ConstraintExpression by appending And - to the current constraint. - - - - - Returns a ConstraintExpression by appending Or - to the current constraint. - - - - - Resolves any pending operators and returns the resolved constraint. - - - - - ConstraintBuilder maintains the stacks that are used in - processing a ConstraintExpression. An OperatorStack - is used to hold operators that are waiting for their - operands to be reorganized. a ConstraintStack holds - input constraints as well as the results of each - operator applied. - - - - - OperatorStack is a type-safe stack for holding ConstraintOperators - - - - - Initializes a new instance of the class. - - The ConstraintBuilder using this stack. - - - - Gets a value indicating whether this is empty. - - true if empty; otherwise, false. - - - - Gets the topmost operator without modifying the stack. - - - - - Pushes the specified operator onto the stack. - - The operator to put onto the stack. - - - - Pops the topmost operator from the stack. - - The topmost operator on the stack - - - - ConstraintStack is a type-safe stack for holding Constraints - - - - - Initializes a new instance of the class. - - The ConstraintBuilder using this stack. - - - - Gets a value indicating whether this is empty. - - true if empty; otherwise, false. - - - - Pushes the specified constraint. As a side effect, - the constraint's Builder field is set to the - ConstraintBuilder owning this stack. - - The constraint to put onto the stack - - - - Pops this topmost constraint from the stack. - As a side effect, the constraint's Builder - field is set to null. - - The topmost contraint on the stack - - - - Initializes a new instance of the class. - - - - - Appends the specified operator to the expression by first - reducing the operator stack and then pushing the new - operator on the stack. - - The operator to push. - - - - Appends the specified constraint to the expression by pushing - it on the constraint stack. - - The constraint to push. - - - - Sets the top operator right context. - - The right context. - - - - Reduces the operator stack until the topmost item - precedence is greater than or equal to the target precedence. - - The target precedence. - - - - Resolves this instance, returning a Constraint. If the Builder - is not currently in a resolvable state, an exception is thrown. - - The resolved constraint - - - - Gets a value indicating whether this instance is resolvable. - - - true if this instance is resolvable; otherwise, false. - - - - - ConstraintExpression represents a compound constraint in the - process of being constructed from a series of syntactic elements. - - Individual elements are appended to the expression as they are - reorganized. When a constraint is appended, it is returned as the - value of the operation so that modifiers may be applied. However, - any partially built expression is attached to the constraint for - later resolution. When an operator is appended, the partial - expression is returned. If it's a self-resolving operator, then - a ResolvableConstraintExpression is returned. - - - - - The ConstraintBuilder holding the elements recognized so far - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the - class passing in a ConstraintBuilder, which may be pre-populated. - - The builder. - - - - Returns a string representation of the expression as it - currently stands. This should only be used for testing, - since it has the side-effect of resolving the expression. - - - - - - Appends an operator to the expression and returns the - resulting expression itself. - - - - - Appends a self-resolving operator to the expression and - returns a new ResolvableConstraintExpression. - - - - - Appends a constraint to the expression and returns that - constraint, which is associated with the current state - of the expression being built. Note that the constraint - is not reduced at this time. For example, if there - is a NotOperator on the stack we don't reduce and - return a NotConstraint. The original constraint must - be returned because it may support modifiers that - are yet to be applied. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - With is currently a NOP - reserved for future use. - - - - - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. - - - - - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that tests whether the actual value falls - within a specified range. - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that fails if the actual - value matches the pattern supplied as an argument. - - - - - Returns a constraint that tests whether the actual value falls - within a specified range. - - - - - ConstraintStatus represents the status of a ConstraintResult - returned by a Constraint being applied to an actual value. - - - - - The status has not yet been set - - - - - The constraint succeeded - - - - - The constraint failed - - - - - An error occured in applying the constraint (reserved for future use) - - - - - Contain the result of matching a against an actual value. - - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - The status of the new ConstraintResult. - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - If true, applies a status of Success to the result, otherwise Failure. - - - - The actual value that was passed to the method. - - - - - Gets and sets the ResultStatus for this result. - - - - - True if actual value meets the Constraint criteria otherwise false. - - - - - Display friendly name of the constraint. - - - - - Description of the constraint may be affected by the state the constraint had - when was performed against the actual value. - - - - - Write the failure message to the MessageWriter provided - as an argument. The default implementation simply passes - the result and the actual value to the writer, which - then displays the constraint description and the value. - - Constraints that need to provide additional details, - such as where the error occured can override this. - - The MessageWriter on which to display the message - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - ContainsConstraint tests a whether a string contains a substring - or a collection contains an object. It postpones the decision of - which test to use until the type of the actual argument is known. - This allows testing whether a string is contained in a collection - or as a substring of another string using the same syntax. - - - - - Initializes a new instance of the class. - - The _expected. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Flag the constraint to ignore case and return self. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - DictionaryContainsKeyConstraint is used to test whether a dictionary - contains an expected object as a key. - - - - - Construct a DictionaryContainsKeyConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the expected key is contained in the dictionary - - - - - DictionaryContainsValueConstraint is used to test whether a dictionary - contains an expected object as a value. - - - - - Construct a DictionaryContainsValueConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the expected value is contained in the dictionary - - - - - EmptyCollectionConstraint tests whether a collection is empty. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Check that the collection is empty - - - - - - - EmptyConstraint tests a whether a string or collection is empty, - postponing the decision about which test is applied until the - type of the actual argument is known. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - EmptyStringConstraint tests whether a string is empty. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - EndsWithConstraint can test whether a string ends - with an expected substring. - - - - - Initializes a new instance of the class. - - The expected string - - - - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. - - - - - - - EqualConstraint is able to compare an actual value with the - expected value provided in its constructor. Two objects are - considered equal if both are null, or if both have the same - value. NUnit has special semantics for some object types. - - - - - NUnitEqualityComparer used to test equality. - - - - - Initializes a new instance of the class. - - The expected value. - - - - Gets the tolerance for this comparison. - - - The tolerance. - - - - - Gets a value indicating whether to compare case insensitive. - - - true if comparing case insensitive; otherwise, false. - - - - - Gets a value indicating whether or not to clip strings. - - - true if set to clip strings otherwise, false. - - - - - Gets the failure points. - - - The failure points. - - - - - Flag the constraint to ignore case and return self. - - - - - Flag the constraint to suppress string clipping - and return self. - - - - - Flag the constraint to compare arrays as collections - and return self. - - - - - Flag the constraint to use a tolerance when determining equality. - - Tolerance value to be used - Self. - - - - Flags the constraint to include - property in comparison of two values. - - - Using this modifier does not allow to use the - constraint modifier. - - - - - Switches the .Within() modifier to interpret its tolerance as - a distance in representable _values (see remarks). - - Self. - - Ulp stands for "unit in the last place" and describes the minimum - amount a given value can change. For any integers, an ulp is 1 whole - digit. For floating point _values, the accuracy of which is better - for smaller numbers and worse for larger numbers, an ulp depends - on the size of the number. Using ulps for comparison of floating - point results instead of fixed tolerances is safer because it will - automatically compensate for the added inaccuracy of larger numbers. - - - - - Switches the .Within() modifier to interpret its tolerance as - a percentage that the actual _values is allowed to deviate from - the expected value. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in days. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in hours. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in minutes. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in seconds. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in milliseconds. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in clock ticks. - - Self - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied Comparison object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - The EqualConstraintResult class is tailored for formatting - and displaying the result of an EqualConstraint. - - - - - Construct an EqualConstraintResult - - - - - Write a failure message. Overridden to provide custom - failure messages for EqualConstraint. - - The MessageWriter to write to - - - - Display the failure information for two collections that did not match. - - The MessageWriter on which to display - The expected collection. - The actual collection - The depth of this failure in a set of nested collections - - - - Displays a single line showing the types and sizes of the expected - and actual collections or arrays. If both are identical, the value is - only shown once. - - The MessageWriter on which to display - The expected collection or array - The actual collection or array - The indentation level for the message line - - - - Displays a single line showing the point in the expected and actual - arrays at which the comparison failed. If the arrays have different - structures or dimensions, both _values are shown. - - The MessageWriter on which to display - The expected array - The actual array - Index of the failure point in the underlying collections - The indentation level for the message line - - - - Display the failure information for two IEnumerables that did not match. - - The MessageWriter on which to display - The expected enumeration. - The actual enumeration - The depth of this failure in a set of nested collections - - - - EqualityAdapter class handles all equality comparisons - that use an , - or a . - - - - - Compares two objects, returning true if they are equal - - - - - Returns true if the two objects can be compared by this adapter. - The base adapter cannot handle IEnumerables except for strings. - - - - - Returns an that wraps an . - - - - - that wraps an . - - - - - Returns an that wraps an . - - - - - Returns true if the two objects can be compared by this adapter. - Generic adapter requires objects of the specified type. - - - - - Returns an that wraps an . - - - - - Returns an that wraps an . - - - - - that wraps an . - - - - - Returns an that wraps a . - - - - - ExactCountConstraint applies another constraint to each - item in a collection, succeeding only if a specified - number of items succeed. - - - - - Construct an ExactCountConstraint on top of an existing constraint - - - - - - - Apply the item constraint to each item in the collection, - succeeding only if the expected number of items pass. - - - - - - - ExactTypeConstraint is used to test that an object - is of the exact type provided in the constructor - - - - - Construct an ExactTypeConstraint for a given Type - - The expected Type. - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - ExceptionTypeConstraint is a special version of ExactTypeConstraint - used to provided detailed info about the exception thrown in - an error message. - - - - - Constructs an ExceptionTypeConstraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - FalseConstraint tests that the actual value is false - - - - - Initializes a new instance of the class. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - Helper routines for working with floating point numbers - - - The floating point comparison code is based on this excellent article: - http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm - - - "ULP" means Unit in the Last Place and in the context of this library refers to - the distance between two adjacent floating point numbers. IEEE floating point - numbers can only represent a finite subset of natural numbers, with greater - accuracy for smaller numbers and lower accuracy for very large numbers. - - - If a comparison is allowed "2 ulps" of deviation, that means the _values are - allowed to deviate by up to 2 adjacent floating point _values, which might be - as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. - - - - - Union of a floating point variable and an integer - - - The union's value as a floating point variable - - - The union's value as an integer - - - The union's value as an unsigned integer - - - Union of a double precision floating point variable and a long - - - The union's value as a double precision floating point variable - - - The union's value as a long - - - The union's value as an unsigned long - - - Compares two floating point _values for equality - First floating point value to be compared - Second floating point value t be compared - - Maximum number of representable floating point _values that are allowed to - be between the left and the right floating point _values - - True if both numbers are equal or close to being equal - - - Floating point _values can only represent a finite subset of natural numbers. - For example, the _values 2.00000000 and 2.00000024 can be stored in a float, - but nothing inbetween them. - - - This comparison will count how many possible floating point _values are between - the left and the right number. If the number of possible _values between both - numbers is less than or equal to maxUlps, then the numbers are considered as - being equal. - - - Implementation partially follows the code outlined here: - http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ - - - - - Compares two double precision floating point _values for equality - First double precision floating point value to be compared - Second double precision floating point value t be compared - - Maximum number of representable double precision floating point _values that are - allowed to be between the left and the right double precision floating point _values - - True if both numbers are equal or close to being equal - - - Double precision floating point _values can only represent a limited series of - natural numbers. For example, the _values 2.0000000000000000 and 2.0000000000000004 - can be stored in a double, but nothing inbetween them. - - - This comparison will count how many possible double precision floating point - _values are between the left and the right number. If the number of possible - _values between both numbers is less than or equal to maxUlps, then the numbers - are considered as being equal. - - - Implementation partially follows the code outlined here: - http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ - - - - - - Reinterprets the memory contents of a floating point value as an integer value - - - Floating point value whose memory contents to reinterpret - - - The memory contents of the floating point value interpreted as an integer - - - - - Reinterprets the memory contents of a double precision floating point - value as an integer value - - - Double precision floating point value whose memory contents to reinterpret - - - The memory contents of the double precision floating point value - interpreted as an integer - - - - - Reinterprets the memory contents of an integer as a floating point value - - Integer value whose memory contents to reinterpret - - The memory contents of the integer value interpreted as a floating point value - - - - - Reinterprets the memory contents of an integer value as a double precision - floating point value - - Integer whose memory contents to reinterpret - - The memory contents of the integer interpreted as a double precision - floating point value - - - - - Tests whether a value is greater than the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Tests whether a value is greater than or equal to the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Interface for all constraints - - - - - The display name of this Constraint for use by ToString(). - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Arguments provided to this Constraint, for use in - formatting the description. - - - - - The ConstraintBuilder holding this constraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - Test whether the constraint is satisfied by a given reference. - The default implementation simply dereferences the value but - derived classes may override it to provide for delayed processing. - - A reference to the value to be tested - A ConstraintResult - - - - InstanceOfTypeConstraint is used to test that an object - is of the same type provided or derived from it. - - - - - Construct an InstanceOfTypeConstraint for the type provided - - The expected Type - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - The IResolveConstraint interface is implemented by all - complete and resolvable constraints and expressions. - - - - - Return the top-level constraint for this expression - - - - - - Tests whether a value is less than the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Tests whether a value is less than or equal to the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - MessageWriter is the abstract base for classes that write - constraint descriptions and messages in some form. The - class has separate methods for writing various components - of a message, allowing implementations to tailor the - presentation as needed. - - - - - Construct a MessageWriter given a culture - - - - - Abstract method to get the max line length - - - - - Method to write single line message with optional args, usually - written to precede the general failure message. - - The message to be written - Any arguments used in formatting the message - - - - Method to write single line message with optional args, usually - written to precede the general failure message, at a givel - indentation level. - - The indentation level of the message - The message to be written - Any arguments used in formatting the message - - - - Display Expected and Actual lines for a constraint. This - is called by MessageWriter's default implementation of - WriteMessageTo and provides the generic two-line display. - - The failing constraint result - - - - Display Expected and Actual lines for given _values. This - method may be called by constraints that need more control over - the display of actual and expected _values than is provided - by the default implementation. - - The expected value - The actual value causing the failure - - - - Display Expected and Actual lines for given _values, including - a tolerance value on the Expected line. - - The expected value - The actual value causing the failure - The tolerance within which the test was made - - - - Display the expected and actual string _values on separate lines. - If the mismatch parameter is >=0, an additional line is displayed - line containing a caret that points to the mismatch point. - - The expected string value - The actual string value - The point at which the strings don't match or -1 - If true, case is ignored in locating the point where the strings differ - If true, the strings should be clipped to fit the line - - - - Writes the text for an actual value. - - The actual value. - - - - Writes the text for a generalized value. - - The value. - - - - Writes the text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Static methods used in creating messages - - - - - Static string used when strings are clipped - - - - - Formatting strings used for expected and actual _values - - - - - Formats text to represent a generalized value. - - The value - The formatted text - - - - Formats text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Returns the representation of a type as used in NUnitLite. - This is the same as Type.ToString() except for arrays, - which are displayed with their declared sizes. - - - - - - - Converts any control characters in a string - to their escaped representation. - - The string to be converted - The converted string - - - - Return the a string representation for a set of indices into an array - - Array of indices for which a string is needed - - - - Get an array of indices representing the point in a collection or - array corresponding to a single int index into the collection. - - The collection to which the indices apply - Index in the collection - Array of indices - - - - Clip a string to a given length, starting at a particular offset, returning the clipped - string with ellipses representing the removed parts - - The string to be clipped - The maximum permitted length of the result string - The point at which to start clipping - The clipped string - - - - Clip the expected and actual strings in a coordinated fashion, - so that they may be displayed together. - - - - - - - - - Shows the position two strings start to differ. Comparison - starts at the start index. - - The expected string - The actual string - The index in the strings at which comparison should start - Boolean indicating whether case should be ignored - -1 if no mismatch found, or the index where mismatch found - - - - NaNConstraint tests that the actual value is a double or float NaN - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test that the actual value is an NaN - - - - - - - NoItemConstraint applies another constraint to each - item in a collection, failing if any of them succeeds. - - - - - Construct a SomeItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - failing if any item fails. - - - - - - - NotConstraint negates the effect of some other constraint - - - - - Initializes a new instance of the class. - - The base constraint to be negated. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for if the base constraint fails, false if it succeeds - - - - NullConstraint tests that the actual value is null - - - - - Initializes a new instance of the class. - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - The Numerics class contains common operations on numeric _values. - - - - - Checks the type of the object, returning true if - the object is a numeric type. - - The object to check - true if the object is a numeric type - - - - Checks the type of the object, returning true if - the object is a floating point numeric type. - - The object to check - true if the object is a floating point numeric type - - - - Checks the type of the object, returning true if - the object is a fixed point numeric type. - - The object to check - true if the object is a fixed point numeric type - - - - Test two numeric _values for equality, performing the usual numeric - conversions and using a provided or default tolerance. If the tolerance - provided is Empty, this method may set it to a default tolerance. - - The expected value - The actual value - A reference to the tolerance in effect - True if the _values are equal - - - - Compare two numeric _values, performing the usual numeric conversions. - - The expected value - The actual value - The relationship of the _values to each other - - - - NUnitComparer encapsulates NUnit's default behavior - in comparing two objects. - - - - - Returns the default NUnitComparer. - - - - - Compares two objects - - - - - - - - NUnitEqualityComparer encapsulates NUnit's handling of - equality tests between objects. - - - - - If true, all string comparisons will ignore case - - - - - If true, arrays will be treated as collections, allowing - those of different dimensions to be compared - - - - - Comparison objects used in comparisons for some constraints. - - - - - List of points at which a failure occurred. - - - - - Returns the default NUnitEqualityComparer - - - - - Gets and sets a flag indicating whether case should - be ignored in determining equality. - - - - - Gets and sets a flag indicating that arrays should be - compared as collections, without regard to their shape. - - - - - Gets the list of external comparers to be used to - test for equality. They are applied to members of - collections, in place of NUnit's own logic. - - - - - Gets the list of failure points for the last Match performed. - The list consists of objects to be interpreted by the caller. - This generally means that the caller may only make use of - objects it has placed on the list at a particular depthy. - - - - - Flags the comparer to include - property in comparison of two values. - - - Using this modifier does not allow to use the - modifier. - - - - - Compares two objects for equality within a tolerance. - - - - - Helper method to compare two arrays - - - - - FailurePoint class represents one point of failure - in an equality test. - - - - - The location of the failure - - - - - The expected value - - - - - The actual value - - - - - Indicates whether the expected value is valid - - - - - Indicates whether the actual value is valid - - - - - Represents a constraint that succeeds if all the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - they all succeed. - - - - - Operator that requires both it's arguments to succeed - - - - - Construct an AndOperator - - - - - Apply the operator to produce an AndConstraint - - - - - Operator that tests for the presence of a particular attribute - on a type and optionally applies further tests to the attribute. - - - - - Construct an AttributeOperator for a particular Type - - The Type of attribute tested - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - Abstract base class for all binary operators - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Gets the left precedence of the operator - - - - - Gets the right precedence of the operator - - - - - Abstract method that produces a constraint by applying - the operator to its left and right constraint arguments. - - - - - Abstract base for operators that indicate how to - apply a constraint to items in a collection. - - - - - Constructs a CollectionOperator - - - - - The ConstraintOperator class is used internally by a - ConstraintBuilder to represent an operator that - modifies or combines constraints. - - Constraint operators use left and right precedence - _values to determine whether the top operator on the - stack should be reduced before pushing a new operator. - - - - - The precedence value used when the operator - is about to be pushed to the stack. - - - - - The precedence value used when the operator - is on the top of the stack. - - - - - The syntax element preceding this operator - - - - - The syntax element following this operator - - - - - The precedence value used when the operator - is about to be pushed to the stack. - - - - - The precedence value used when the operator - is on the top of the stack. - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Represents a constraint that succeeds if the specified - count of members of a collection match a base constraint. - - - - - Construct an ExactCountOperator for a specified count - - The expected count - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. - - - - - Represents a constraint that succeeds if none of the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. - - - - - Negates the test of the constraint it wraps. - - - - - Constructs a new NotOperator - - - - - Returns a NotConstraint applied to its argument. - - - - - Operator that requires at least one of it's arguments to succeed - - - - - Construct an OrOperator - - - - - Apply the operator to produce an OrConstraint - - - - - PrefixOperator takes a single constraint and modifies - it's action in some way. - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Returns the constraint created by applying this - prefix to another constraint. - - - - - - - Operator used to test for the presence of a named Property - on an object and optionally apply further tests to the - value of that property. - - - - - Gets the name of the property to which the operator applies - - - - - Constructs a PropOperator for a particular named property - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Abstract base class for operators that are able to reduce to a - constraint whether or not another syntactic element follows. - - - - - Represents a constraint that succeeds if any of the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - any of them succeed. - - - - - Operator that tests that an exception is thrown and - optionally applies further tests to the exception. - - - - - Construct a ThrowsOperator - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - Represents a constraint that simply wraps the - constraint provided as an argument, without any - further functionality, but which modifies the - order of evaluation because of its precedence. - - - - - Constructor for the WithOperator - - - - - Returns a constraint that wraps its argument - - - - - OrConstraint succeeds if either member succeeds - - - - - Create an OrConstraint from two other constraints - - The first constraint - The second constraint - - - - Gets text describing a constraint - - - - - Apply the member constraints to an actual value, succeeding - succeeding as soon as one of them succeeds. - - The actual value - True if either constraint succeeded - - - - Predicate constraint wraps a Predicate in a constraint, - returning success if the predicate is true. - - - - - Construct a PredicateConstraint from a predicate - - - - - Gets text describing a constraint - - - - - Determines whether the predicate succeeds when applied - to the actual value. - - - - - Abstract base class used for prefixes - - - - - The base constraint - - - - - Prefix used in forming the constraint description - - - - - Construct given a base constraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - PropertyConstraint extracts a named property and uses - its value as the actual value for a chained constraint. - - - - - Initializes a new instance of the class. - - The name. - The constraint to apply to the property. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Returns the string representation of the constraint. - - - - - - PropertyExistsConstraint tests that a named property - exists on the object provided through Match. - - Originally, PropertyConstraint provided this feature - in addition to making optional tests on the value - of the property. The two constraints are now separate. - - - - - Initializes a new instance of the class. - - The name of the property. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the property exists for a given object - - The object to be tested - True for success, false for failure - - - - Returns the string representation of the constraint. - - - - - - RangeConstraint tests whether two _values are within a - specified range. - - - - - Initializes a new instance of the class. - - from must be less than or equal to true - Inclusive beginning of the range. Must be less than or equal to to. - Inclusive end of the range. Must be greater than or equal to from. - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use a and returns self. - - - - - RegexConstraint can test whether a string matches - the pattern provided. - - - - - Initializes a new instance of the class. - - The pattern. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - ResolvableConstraintExpression is used to represent a compound - constraint being constructed at a point where the last operator - may either terminate the expression or may have additional - qualifying constraints added to it. - - It is used, for example, for a Property element or for - an Exception element, either of which may be optionally - followed by constraints that apply to the property or - exception. - - - - - Create a new instance of ResolvableConstraintExpression - - - - - Create a new instance of ResolvableConstraintExpression, - passing in a pre-populated ConstraintBuilder. - - - - - Appends an And Operator to the expression - - - - - Appends an Or operator to the expression. - - - - - Resolve the current expression to a Constraint - - - - - ReusableConstraint wraps a constraint expression after - resolving it so that it can be reused consistently. - - - - - Construct a ReusableConstraint from a constraint expression - - The expression to be resolved and reused - - - - Converts a constraint to a ReusableConstraint - - The constraint to be converted - A ReusableConstraint - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Return the top-level constraint for this expression - - - - - - SameAsConstraint tests whether an object is identical to - the object passed to its constructor - - - - - Initializes a new instance of the class. - - The expected object. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - SomeItemsConstraint applies another constraint to each - item in a collection, succeeding if any of them succeeds. - - - - - Construct a SomeItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - succeeding if any item succeeds. - - - - - - - StartsWithConstraint can test whether a string starts - with an expected substring. - - - - - Initializes a new instance of the class. - - The expected string - - - - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. - - - - - - - StringConstraint is the abstract base for constraints - that operate on strings. It supports the IgnoreCase - modifier for string operations. - - - - - The expected value - - - - - Indicates whether tests should be case-insensitive - - - - - Description of this constraint - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Constructs a StringConstraint without an expected value - - - - - Constructs a StringConstraint given an expected value - - The expected value - - - - Modify the constraint to ignore case in matching. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Test whether the constraint is satisfied by a given string - - The string to be tested - True for success, false for failure - - - - SubstringConstraint can test whether a string contains - the expected substring. - - - - - Initializes a new instance of the class. - - The expected. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - ThrowsConstraint is used to test the exception thrown by - a delegate by applying a constraint to it. - - - - - Initializes a new instance of the class, - using a constraint to be applied to the exception. - - A constraint to apply to the caught exception. - - - - Get the actual exception thrown - used by Assert.Throws. - - - - - Gets text describing a constraint - - - - - Executes the code of the delegate and captures any exception. - If a non-null base constraint was provided, it applies that - constraint to the exception. - - A delegate representing the code to be tested - True if an exception is thrown and the constraint succeeds, otherwise false - - - - Converts an ActualValueDelegate to a TestDelegate - before calling the primary overload. - - - - - - - Write the actual value for a failing constraint test to a - MessageWriter. This override only handles the special message - used when an exception is expected but none is thrown. - - The writer on which the actual value is displayed - - - - ThrowsExceptionConstraint tests that an exception has - been thrown, without any further tests. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Executes the code and returns success if an exception is thrown. - - A delegate representing the code to be tested - True if an exception is thrown, otherwise false - - - - ThrowsNothingConstraint tests that a delegate does not - throw an exception. - - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True if no exception is thrown, otherwise false - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - The Tolerance class generalizes the notion of a tolerance - within which an equality test succeeds. Normally, it is - used with numeric types, but it can be used with any - type that supports taking a difference between two - objects and comparing that difference to a value. - - - - - Returns a default Tolerance object, equivalent to - specifying an exact match unless - is set, in which case, the - will be used. - - - - - Returns an empty Tolerance object, equivalent to - specifying an exact match even if - is set. - - - - - Constructs a linear tolerance of a specified amount - - - - - Constructs a tolerance given an amount and - - - - - Gets the for the current Tolerance - - - - - Tests that the current Tolerance is linear with a - numeric value, throwing an exception if it is not. - - - - - Gets the value of the current Tolerance instance. - - - - - Returns a new tolerance, using the current amount as a percentage. - - - - - Returns a new tolerance, using the current amount in Ulps - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of days. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of hours. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of minutes. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of seconds. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of milliseconds. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of clock ticks. - - - - - Returns true if the current tolerance has not been set or is using the . - - - - - Modes in which the tolerance value for a comparison can be interpreted. - - - - - The tolerance was created with a value, without specifying - how the value would be used. This is used to prevent setting - the mode more than once and is generally changed to Linear - upon execution of the test. - - - - - The tolerance is used as a numeric range within which - two compared _values are considered to be equal. - - - - - Interprets the tolerance as the percentage by which - the two compared _values my deviate from each other. - - - - - Compares two _values based in their distance in - representable numbers. - - - - - TrueConstraint tests that the actual value is true - - - - - Initializes a new instance of the class. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - TypeConstraint is the abstract base for constraints - that take a Type as their expected value. - - - - - The expected Type used by the constraint - - - - - The type of the actual argument to which the constraint was applied - - - - - Construct a TypeConstraint for a given Type - - The expected type for the constraint - Prefix used in forming the constraint description - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - UniqueItemsConstraint tests whether all the items in a - collection are unique. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Check that all items are unique. - - - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new DictionaryContainsKeyConstraint checking for the - presence of a particular key in the dictionary. - - - - - Returns a new DictionaryContainsValueConstraint checking for the - presence of a particular value in the dictionary. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Thrown when an assertion failed. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Gets the ResultState provided by this exception - - - - - Thrown when an assertion failed. - - - - - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Gets the ResultState provided by this exception - - - - - Thrown when a test executes inconclusively. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Gets the ResultState provided by this exception - - - - - Abstract base for Exceptions that terminate a test and provide a ResultState. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Gets the ResultState provided by this exception - - - - - Thrown when an assertion failed. - - - - - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Gets the ResultState provided by this exception - - - - - GlobalSettings is a place for setting default _values used - by the framework in performing asserts. - - - - - Default tolerance for floating point equality - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - The IApplyToContext interface is implemented by attributes - that want to make changes to the execution context before - a test is run. - - - - - Apply changes to the execution context - - The execution context - - - - The IApplyToTest interface is implemented by self-applying - attributes that modify the state of a test in some way. - - - - - Modifies a test as defined for the specific attribute. - - The test to modify - - - - CombiningStrategy is the abstract base for classes that - know how to combine values provided for individual test - parameters to create a set of test cases. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - ICommandWrapper is implemented by attributes and other - objects able to wrap a TestCommand with another command. - - - Attributes or other objects should implement one of the - derived interfaces, rather than this one, since they - indicate in which part of the command chain the wrapper - should be applied. - - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - Objects implementing this interface are used to wrap - the TestMethodCommand itself. They apply after SetUp - has been run and before TearDown. - - - - - Objects implementing this interface are used to wrap - the entire test, including SetUp and TearDown. - - - - - Any ITest that implements this interface is at a level that the implementing - class should be disposed at the end of the test run - - - - - The IFixtureBuilder interface is exposed by a class that knows how to - build a TestFixture from one or more Types. In general, it is exposed - by an attribute, but may be implemented in a helper class used by the - attribute in some cases. - - - - - Build one or more TestFixtures from type provided. At least one - non-null TestSuite must always be returned, since the method is - generally called because the user has marked the target class as - a fixture. If something prevents the fixture from being used, it - will be returned nonetheless, labelled as non-runnable. - - The type info of the fixture to be used. - A TestSuite object or one derived from TestSuite. - - - - IImplyFixture is an empty marker interface used by attributes like - TestAttribute that cause the class where they are used to be treated - as a TestFixture even without a TestFixtureAttribute. - - Marker interfaces are not usually considered a good practice, but - we use it here to avoid cluttering the attribute hierarchy with - classes that don't contain any extra implementation. - - - - - The IMethodInfo class is used to encapsulate information - about a method in a platform-independent manner. - - - - - Gets the Type from which this method was reflected. - - - - - Gets the MethodInfo for this method. - - - - - Gets the name of the method. - - - - - Gets a value indicating whether the method is abstract. - - - - - Gets a value indicating whether the method is public. - - - - - Gets a value indicating whether the method contains unassigned generic type parameters. - - - - - Gets a value indicating whether the method is a generic method. - - - - - Gets a value indicating whether the MethodInfo represents the definition of a generic method. - - - - - Gets the return Type of the method. - - - - - Gets the parameters of the method. - - - - - - Returns the Type arguments of a generic method or the Type parameters of a generic method definition. - - - - - Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. - - The type arguments to be used - A new IMethodInfo with the type arguments replaced - - - - Invokes the method, converting any TargetInvocationException to an NUnitException. - - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - The IDataPointProvider interface is used by extensions - that provide data for a single test parameter. - - - - - Determine whether any data is available for a parameter. - - An IParameterInfo representing one - argument to a parameterized test - True if any data is available, otherwise false. - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - An IEnumerable providing the required data - - - - The IParameterDataSource interface is implemented by types - that can provide data for a test method parameter. - - - - - Gets an enumeration of data items for use as arguments - for a test method parameter. - - The parameter for which data is needed - An enumeration containing individual data items - - - - The IParameterInfo interface is an abstraction of a .NET parameter. - - - - - Gets a value indicating whether the parameter is optional - - - - - Gets an IMethodInfo representing the method for which this is a parameter - - - - - Gets the underlying .NET ParameterInfo - - - - - Gets the Type of the parameter - - - - - A PropertyBag represents a collection of name/value pairs - that allows duplicate entries with the same key. Methods - are provided for adding a new pair as well as for setting - a key to a single value. All keys are strings but _values - may be of any type. Null _values are not permitted, since - a null entry represents the absence of the key. - - The entries in a PropertyBag are of two kinds: those that - take a single value and those that take multiple _values. - However, the PropertyBag has no knowledge of which entries - fall into each category and the distinction is entirely - up to the code using the PropertyBag. - - When working with multi-valued properties, client code - should use the Add method to add name/value pairs and - indexing to retrieve a list of all _values for a given - key. For example: - - bag.Add("Tag", "one"); - bag.Add("Tag", "two"); - Assert.That(bag["Tag"], - Is.EqualTo(new string[] { "one", "two" })); - - When working with single-valued propeties, client code - should use the Set method to set the value and Get to - retrieve the value. The GetSetting methods may also be - used to retrieve the value in a type-safe manner while - also providing default. For example: - - bag.Set("Priority", "low"); - bag.Set("Priority", "high"); // replaces value - Assert.That(bag.Get("Priority"), - Is.EqualTo("high")); - Assert.That(bag.GetSetting("Priority", "low"), - Is.EqualTo("high")); - - - - - Adds a key/value pair to the property bag - - The key - The value - - - - Sets the value for a key, removing any other - _values that are already in the property set. - - - - - - - Gets a single value for a key, using the first - one if multiple _values are present and returning - null if the value is not found. - - - - - Gets a flag indicating whether the specified key has - any entries in the property set. - - The key to be checked - True if their are _values present, otherwise false - - - - Gets or sets the list of _values for a particular key - - The key for which the _values are to be retrieved or set - - - - Gets a collection containing all the keys in the property set - - - - - The IReflectionInfo interface is implemented by NUnit wrapper objects that perform reflection. - - - - - Returns an array of custom attributes of the specified type applied to this object - - - - - Returns a value indicating whether an attribute of the specified type is defined on this object. - - - - - The ISimpleTestBuilder interface is exposed by a class that knows how to - build a single TestMethod from a suitable MethodInfo Types. In general, - it is exposed by an attribute, but may be implemented in a helper class - used by the attribute in some cases. - - - - - Build a TestMethod from the provided MethodInfo. - - The method to be used as a test - The TestSuite to which the method will be added - A TestMethod object - - - - The ISuiteBuilder interface is exposed by a class that knows how to - build a suite from one or more Types. - - - - - Examine the type and determine if it is suitable for - this builder to use in building a TestSuite. - - Note that returning false will cause the type to be ignored - in loading the tests. If it is desired to load the suite - but label it as non-runnable, ignored, etc., then this - method must return true. - - The type of the fixture to be used - True if the type can be used to build a TestSuite - - - - Build a TestSuite from type provided. - - The type of the fixture to be used - A TestSuite - - - - Common interface supported by all representations - of a test. Only includes informational fields. - The Run method is specifically excluded to allow - for data-only representations of a test. - - - - - Gets the id of the test - - - - - Gets the name of the test - - - - - Gets the fully qualified name of the test - - - - - Gets the name of the class containing this test. Returns - null if the test is not associated with a class. - - - - - Gets the name of the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the Type of the test fixture, if applicable, or - null if no fixture type is associated with this test. - - - - - Gets an IMethod for the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the RunState of the test, indicating whether it can be run. - - - - - Count of the test cases ( 1 if this is a test case ) - - - - - Gets the properties of the test - - - - - Gets the parent test, if any. - - The parent test or null if none exists. - - - - Returns true if this is a test suite - - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets this test's child tests - - A list of child tests - - - - Gets a fixture object for running this test. - - - - - The ITestBuilder interface is exposed by a class that knows how to - build one or more TestMethods from a MethodInfo. In general, it is exposed - by an attribute, which has additional information available to provide - the necessary test parameters to distinguish the test cases built. - - - - - Build one or more TestMethods from the provided MethodInfo. - - The method to be used as a test - The TestSuite to which the method will be added - A TestMethod object - - - - The ITestCaseBuilder interface is exposed by a class that knows how to - build a test case from certain methods. - - - This interface is not the same as the ITestCaseBuilder interface in NUnit 2.x. - We have reused the name because the two products don't interoperate at all. - - - - - Examine the method and determine if it is suitable for - this builder to use in building a TestCase to be - included in the suite being populated. - - Note that returning false will cause the method to be ignored - in loading the tests. If it is desired to load the method - but label it as non-runnable, ignored, etc., then this - method must return true. - - The test method to examine - The suite being populated - True is the builder can use this method - - - - Build a TestCase from the provided MethodInfo for - inclusion in the suite being constructed. - - The method to be used as a test case - The test suite being populated, or null - A TestCase or null - - - - The ITestCaseData interface is implemented by a class - that is able to return complete testcases for use by - a parameterized test method. - - - - - Gets the expected result of the test case - - - - - Returns true if an expected result has been set - - - - - The ITestData interface is implemented by a class that - represents a single instance of a parameterized test. - - - - - Gets the name to be used for the test - - - - - Gets the RunState for this test case. - - - - - Gets the argument list to be provided to the test - - - - - Gets the property dictionary for the test case - - - - - Interface to be implemented by filters applied to tests. - The filter applies when running the test, after it has been - loaded, since this is the only time an ITest exists. - - - - - Determine if a particular test passes the filter criteria. Pass - may examine the parents and/or descendants of a test, depending - on the semantics of the particular filter - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - The ITestCaseData interface is implemented by a class - that is able to return the data required to create an - instance of a parameterized test fixture. - - - - - Get the TypeArgs if separately set - - - - - The ITestListener interface is used internally to receive - notifications of significant events while a test is being - run. The events are propagated to clients by means of an - AsyncCallback. NUnit extensions may also monitor these events. - - - - - Called when a test has just started - - The test that is starting - - - - Called when a test has finished - - The result of the test - - - - The ITestResult interface represents the result of a test. - - - - - Gets the ResultState of the test result, which - indicates the success or failure of the test. - - - - - Gets the name of the test result - - - - - Gets the full name of the test result - - - - - Gets the elapsed time for running the test in seconds - - - - - Gets or sets the time the test started running. - - - - - Gets or sets the time the test finished running. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. Not available in - the Compact Framework 1.0. - - - - - Gets the number of asserts executed - when running the test and all its children. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Indicates whether this result has any child results. - Accessing HasChildren should not force creation of the - Children collection in classes implementing this interface. - - - - - Gets the the collection of child results. - - - - - Gets the Test to which this result applies. - - - - - Gets any text output written to this result. - - - - - The ITypeInfo interface is an abstraction of a .NET Type - - - - - Gets the underlying Type on which this ITypeInfo is based - - - - - Gets the base type of this type as an ITypeInfo - - - - - Returns true if the Type wrapped is equal to the argument - - - - - Gets the Name of the Type - - - - - Gets the FullName of the Type - - - - - Gets the assembly in which the type is declared - - - - - Gets the Namespace of the Type - - - - - Gets a value indicating whether the type is abstract. - - - - - Gets a value indicating whether the Type is a generic Type - - - - - Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. - - - - - Gets a value indicating whether the Type is a generic Type definition - - - - - Gets a value indicating whether the type is sealed. - - - - - Gets a value indicating whether this type is a static class. - - - - - Get the display name for this typeInfo. - - - - - Get the display name for an oject of this type, constructed with specific arguments - - - - - Returns a Type representing a generic type definition from which this Type can be constructed. - - - - - Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments - - - - - Returns a value indicating whether this type has a method with a specified public attribute - - - - - Returns an array of IMethodInfos for methods of this Type - that match the specified flags. - - - - - Returns a value indicating whether this Type has a public constructor taking the specified argument Types. - - - - - Construct an object of this Type, using the specified arguments. - - - - - An object implementing IXmlNodeBuilder is able to build - an XML representation of itself and any children. - - - - - Returns a TNode representing the current object. - - If true, children are included where applicable - A TNode representing the result - - - - Returns a TNode representing the current object after - adding it as a child of the supplied parent node. - - The parent node. - If true, children are included, where applicable - - - - - The ResultState class represents the outcome of running a test. - It contains two pieces of information. The Status of the test - is an enum indicating whether the test passed, failed, was - skipped or was inconclusive. The Label provides a more - detailed breakdown for use by client runners. - - - - - Initializes a new instance of the class. - - The TestStatus. - - - - Initializes a new instance of the class. - - The TestStatus. - The label. - - - - Initializes a new instance of the class. - - The TestStatus. - The stage at which the result was produced - - - - Initializes a new instance of the class. - - The TestStatus. - The label. - The stage at which the result was produced - - - - The result is inconclusive - - - - - The test has been skipped. - - - - - The test has been ignored. - - - - - The test was skipped because it is explicit - - - - - The test succeeded - - - - - The test failed - - - - - The test encountered an unexpected exception - - - - - The test was cancelled by the user - - - - - The test was not runnable. - - - - - A suite failed because one or more child tests failed or had errors - - - - - A suite failed in its OneTimeSetUp - - - - - A suite had an unexpected exception in its OneTimeSetUp - - - - - A suite had an unexpected exception in its OneTimeDown - - - - - Gets the TestStatus for the test. - - The status. - - - - Gets the label under which this test result is - categorized, if any. - - - - - Gets the stage of test execution in which - the failure or other result took place. - - - - - Get a new ResultState, which is the same as the current - one but with the FailureSite set to the specified value. - - The FailureSite to use - A new ResultState - - - - Determines whether the specified , is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - The FailureSite enum indicates the stage of a test - in which an error or failure occurred. - - - - - Failure in the test itself - - - - - Failure in the SetUp method - - - - - Failure in the TearDown method - - - - - Failure of a parent test - - - - - Failure of a child test - - - - - The RunState enum indicates whether a test can be executed. - - - - - The test is not runnable. - - - - - The test is runnable. - - - - - The test can only be run explicitly - - - - - The test has been skipped. This value may - appear on a Test when certain attributes - are used to skip the test. - - - - - The test has been ignored. May appear on - a Test, when the IgnoreAttribute is used. - - - - - The TestStatus enum indicates the result of running a test - - - - - The test was inconclusive - - - - - The test has skipped - - - - - The test succeeded - - - - - The test failed - - - - - TNode represents a single node in the XML representation - of a Test or TestResult. It replaces System.Xml.XmlNode and - System.Xml.Linq.XElement, providing a minimal set of methods - for operating on the XML in a platform-independent manner. - - - - - Constructs a new instance of TNode - - The name of the node - - - - Constructs a new instance of TNode with a value - - The name of the node - The text content of the node - - - - Constructs a new instance of TNode with a value - - The name of the node - The text content of the node - Flag indicating whether to use CDATA when writing the text - - - - Gets the name of the node - - - - - Gets the value of the node - - - - - Gets a flag indicating whether the value should be output using CDATA. - - - - - Gets the dictionary of attributes - - - - - Gets a list of child nodes - - - - - Gets the first ChildNode - - - - - Gets the XML representation of this node. - - - - - Create a TNode from it's XML text representation - - The XML text to be parsed - A TNode - - - - Adds a new element as a child of the current node and returns it. - - The element name. - The newly created child element - - - - Adds a new element with a value as a child of the current node and returns it. - - The element name - The text content of the new element - The newly created child element - - - - Adds a new element with a value as a child of the current node and returns it. - The value will be output using a CDATA section. - - The element name - The text content of the new element - The newly created child element - - - - Adds an attribute with a specified name and value to the XmlNode. - - The name of the attribute. - The value of the attribute. - - - - Finds a single descendant of this node matching an xpath - specification. The format of the specification is - limited to what is needed by NUnit and its tests. - - - - - - - Finds all descendants of this node matching an xpath - specification. The format of the specification is - limited to what is needed by NUnit and its tests. - - - - - Writes the XML representation of the node to an XmlWriter - - - - - - Class used to represent a list of XmlResults - - - - - Class used to represent the attributes of a node - - - - - Gets or sets the value associated with the specified key. - Overridden to return null if attribute is not found. - - The key. - Value of the attribute or null - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable to the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable to the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that tests whether the actual value falls - inclusively within a specified range. - - from must be less than or equal to true - Inclusive beginning of the range. Must be less than or equal to to. - Inclusive end of the range. Must be greater than or equal to from. - - - - - When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. - - - - - Executed before each test is run - - The test that is going to be run. - - - - Executed after each test is run - - The test that has just been run. - - - - Provides the target for the action attribute - - The target for the action attribute - - - - The Iz class is a synonym for Is intended for use in VB, - which regards Is as a keyword. - - - - - The List class is a helper class with properties and methods - that supply a number of constraints used with lists and collections. - - - - - List.Map returns a ListMapper, which can be used to map - the original collection to another collection. - - - - - - - ListMapper is used to transform a collection used as an actual argument - producing another collection to be used in the assertion. - - - - - Construct a ListMapper based on a collection - - The collection to be transformed - - - - Produces a collection containing all the _values of a property - - The collection of property _values - - - - - The SpecialValue enum is used to represent TestCase arguments - that cannot be used as arguments to an Attribute. - - - - - Null represents a null value, which cannot be used as an - argument to an attriute under .NET 1.x - - - - - Basic Asserts on strings. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - - - - Asserts that a string is not found within another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - - - - Asserts that a string starts with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string starts with another string. - - The expected string - The string to be examined - - - - Asserts that a string does not start with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not start with another string. - - The expected string - The string to be examined - - - - Asserts that a string ends with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string ends with another string. - - The expected string - The string to be examined - - - - Asserts that a string does not end with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not end with another string. - - The expected string - The string to be examined - - - - Asserts that two strings are equal, without regard to case. - - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that two strings are equal, without regard to case. - - The expected string - The actual string - - - - Asserts that two strings are not equal, without regard to case. - - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that two strings are not equal, without regard to case. - - The expected string - The actual string - - - - Asserts that a string matches an expected regular expression pattern. - - The regex pattern to be matched - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string matches an expected regular expression pattern. - - The regex pattern to be matched - The actual string - - - - Asserts that a string does not match an expected regular expression pattern. - - The regex pattern to be used - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not match an expected regular expression pattern. - - The regex pattern to be used - The actual string - - - - The TestCaseData class represents a set of arguments - and other parameter info to be used for a parameterized - test case. It is derived from TestCaseParameters and adds a - fluent syntax for use in initializing the test case. - - - - - Initializes a new instance of the class. - - The arguments. - - - - Initializes a new instance of the class. - - The argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - The third argument. - - - - Sets the expected result for the test - - The expected result - A modified TestCaseData - - - - Sets the name of the test case - - The modified TestCaseData instance - - - - Sets the description for the test case - being constructed. - - The description. - The modified TestCaseData instance. - - - - Applies a category to the test - - - - - - - Applies a named property to the test - - - - - - - - Applies a named property to the test - - - - - - - - Applies a named property to the test - - - - - - - - Marks the test case as explicit. - - - - - Marks the test case as explicit, specifying the reason. - - - - - Ignores this TestCase, specifying the reason. - - The reason. - - - - - Provide the context information of the current test. - This is an adapter for the internal ExecutionContext - class, hiding the internals from the user test. - - - - - Construct a TestContext for an ExecutionContext - - The ExecutionContext to adapt - - - - Get the current test context. This is created - as needed. The user may save the context for - use within a test, but it should not be used - outside the test for which it is created. - - - - - Gets a TextWriter that will send output to the current test result. - - - - - Get a representation of the current test. - - - - - Gets a Representation of the TestResult for the current test. - - - - - Gets the directory to be used for outputting files created - by this test run. - - - - - Gets the random generator. - - - The random generator. - - - - Write the string representation of a boolean value to the current result - - - Write a char to the current result - - - Write a char array to the current result - - - Write the string representation of a double to the current result - - - Write the string representation of an Int32 value to the current result - - - Write the string representation of an Int64 value to the current result - - - Write the string representation of a decimal value to the current result - - - Write the string representation of an object to the current result - - - Write the string representation of a Single value to the current result - - - Write a string to the current result - - - Write the string representation of a UInt32 value to the current result - - - Write the string representation of a UInt64 value to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a line terminator to the current result - - - Write the string representation of a boolean value to the current result followed by a line terminator - - - Write a char to the current result followed by a line terminator - - - Write a char array to the current result followed by a line terminator - - - Write the string representation of a double to the current result followed by a line terminator - - - Write the string representation of an Int32 value to the current result followed by a line terminator - - - Write the string representation of an Int64 value to the current result followed by a line terminator - - - Write the string representation of a decimal value to the current result followed by a line terminator - - - Write the string representation of an object to the current result followed by a line terminator - - - Write the string representation of a Single value to the current result followed by a line terminator - - - Write a string to the current result followed by a line terminator - - - Write the string representation of a UInt32 value to the current result followed by a line terminator - - - Write the string representation of a UInt64 value to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - - TestAdapter adapts a Test for consumption by - the user test code. - - - - - Construct a TestAdapter for a Test - - The Test to be adapted - - - - Gets the unique Id of a test - - - - - The name of the test, which may or may not be - the same as the method name. - - - - - The name of the method representing the test. - - - - - The FullName of the test - - - - - The ClassName of the test - - - - - The properties of the test. - - - - - ResultAdapter adapts a TestResult for consumption by - the user test code. - - - - - Construct a ResultAdapter for a TestResult - - The TestResult to be adapted - - - - Gets a ResultState representing the outcome of the test. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - The TestFixtureData class represents a set of arguments - and other parameter info to be used for a parameterized - fixture. It is derived from TestFixtureParameters and adds a - fluent syntax for use in initializing the fixture. - - - - - Initializes a new instance of the class. - - The arguments. - - - - Initializes a new instance of the class. - - The argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - The third argument. - - - - Marks the test fixture as explicit. - - - - - Marks the test fixture as explicit, specifying the reason. - - - - - Ignores this TestFixture, specifying the reason. - - The reason. - - - - - Helper class with properties and methods that supply - constraints that operate on exceptions. - - - - - Creates a constraint specifying an expected exception - - - - - Creates a constraint specifying an exception with a given InnerException - - - - - Creates a constraint specifying an expected TargetInvocationException - - - - - Creates a constraint specifying an expected ArgumentException - - - - - Creates a constraint specifying an expected ArgumentNUllException - - - - - Creates a constraint specifying an expected InvalidOperationException - - - - - Creates a constraint specifying that no exception is thrown - - - - - Creates a constraint specifying the exact type of exception expected - - - - - Creates a constraint specifying the exact type of exception expected - - - - - Creates a constraint specifying the type of exception expected - - - - - Creates a constraint specifying the type of exception expected - - - - - Env is a static class that provides some of the features of - System.Environment that are not available under all runtimes - - - - - The newline sequence in the current environment. - - - - - Path to the 'My Documents' folder - - - - - Directory used for file output if not specified on commandline. - - - - - PackageSettings is a static class containing constant values that - are used as keys in setting up a TestPackage. These values are used in - the engine and framework. Setting values may be a string, int or bool. - - - - - Flag (bool) indicating whether tests are being debugged. - - - - - Flag (bool) indicating whether to pause execution of tests to allow - the user to attache a debugger. - - - - - The InternalTraceLevel for this run. Values are: "Default", - "Off", "Error", "Warning", "Info", "Debug", "Verbose". - Default is "Off". "Debug" and "Verbose" are synonyms. - - - - - Full path of the directory to be used for work and result files. - This path is provided to tests by the frameowrk TestContext. - - - - - The name of the config to use in loading a project. - If not specified, the first config found is used. - - - - - Bool indicating whether the engine should determine the private - bin path by examining the paths to all the tests. Defaults to - true unless PrivateBinPath is specified. - - - - - The ApplicationBase to use in loading the tests. If not - specified, and each assembly has its own process, then the - location of the assembly is used. For multiple assemblies - in a single process, the closest common root directory is used. - - - - - Path to the config file to use in running the tests. - - - - - Bool flag indicating whether a debugger should be launched at agent - startup. Used only for debugging NUnit itself. - - - - - Indicates how to load tests across AppDomains. Values are: - "Default", "None", "Single", "Multiple". Default is "Multiple" - if more than one assembly is loaded in a process. Otherwise, - it is "Single". - - - - - The private binpath used to locate assemblies. Directory paths - is separated by a semicolon. It's an error to specify this and - also set AutoBinPath to true. - - - - - The maximum number of test agents permitted to run simultneously. - Ignored if the ProcessModel is not set or defaulted to Multiple. - - - - - Indicates how to allocate assemblies to processes. Values are: - "Default", "Single", "Separate", "Multiple". Default is "Multiple" - for more than one assembly, "Separate" for a single assembly. - - - - - Indicates the desired runtime to use for the tests. Values - are strings like "net-4.5", "mono-4.0", etc. Default is to - use the target framework for which an assembly was built. - - - - - Bool flag indicating that the test should be run in a 32-bit process - on a 64-bit system. By default, NUNit runs in a 64-bit process on - a 64-bit system. Ignored if set on a 32-bit system. - - - - - Indicates that test runners should be disposed after the tests are executed - - - - - Bool flag indicating that the test assemblies should be shadow copied. - Defaults to false. - - - - - Integer value in milliseconds for the default timeout value - for test cases. If not specified, there is no timeout except - as specified by attributes on the tests themselves. - - - - - A TextWriter to which the internal trace will be sent. - - - - - A list of tests to be loaded. - - - - - The number of test threads to run for the assembly. If set to - 1, a single queue is used. If set to 0, tests are executed - directly, without queuing. - - - - - The random seed to be used for this assembly. If specified - as the value reported from a prior run, the framework should - generate identical random values for tests as were used for - that run, provided that no change has been made to the test - assembly. Default is a random value itself. - - - - - If true, execution stops after the first error or failure. - - - - - If true, use of the event queue is suppressed and test events are synchronous. - - - - - A shim of the .NET interface for platforms that do not support it. - Used to indicate that a control can be the target of a callback event on the server. - - - - - Processes a callback event that targets a control. - - - - - - Returns the results of a callback event that targets a control. - - - - - - A shim of the .NET attribute for platforms that do not support it. - - - - diff --git a/packages/NUnit.3.0.1/lib/net20/nunit.framework.xml b/packages/NUnit.3.0.1/lib/net20/nunit.framework.xml deleted file mode 100644 index 5d48d53..0000000 --- a/packages/NUnit.3.0.1/lib/net20/nunit.framework.xml +++ /dev/null @@ -1,16883 +0,0 @@ - - - - nunit.framework - - - - - AssemblyHelper provides static methods for working - with assemblies. - - - - - Gets the path from which the assembly defining a type was loaded. - - The Type. - The path. - - - - Gets the path from which an assembly was loaded. - - The assembly. - The path. - - - - Gets the path to the directory from which an assembly was loaded. - - The assembly. - The path. - - - - Gets the AssemblyName of an assembly. - - The assembly - An AssemblyName - - - - Loads an assembly given a string, which may be the - path to the assembly or the AssemblyName - - - - - - - Gets the assembly path from code base. - - Public for testing purposes - The code base. - - - - - Interface for logging within the engine - - - - - Logs the specified message at the error level. - - The message. - - - - Logs the specified message at the error level. - - The message. - The arguments. - - - - Logs the specified message at the warning level. - - The message. - - - - Logs the specified message at the warning level. - - The message. - The arguments. - - - - Logs the specified message at the info level. - - The message. - - - - Logs the specified message at the info level. - - The message. - The arguments. - - - - Logs the specified message at the debug level. - - The message. - - - - Logs the specified message at the debug level. - - The message. - The arguments. - - - - InternalTrace provides facilities for tracing the execution - of the NUnit framework. Tests and classes under test may make use - of Console writes, System.Diagnostics.Trace or various loggers and - NUnit itself traps and processes each of them. For that reason, a - separate internal trace is needed. - - Note: - InternalTrace uses a global lock to allow multiple threads to write - trace messages. This can easily make it a bottleneck so it must be - used sparingly. Keep the trace Level as low as possible and only - insert InternalTrace writes where they are needed. - TODO: add some buffering and a separate writer thread as an option. - TODO: figure out a way to turn on trace in specific classes only. - - - - - Gets a flag indicating whether the InternalTrace is initialized - - - - - Initialize the internal trace facility using the name of the log - to be written to and the trace level. - - The log name - The trace level - - - - Initialize the internal trace using a provided TextWriter and level - - A TextWriter - The InternalTraceLevel - - - - Get a named Logger - - - - - - Get a logger named for a particular Type. - - - - - InternalTraceLevel is an enumeration controlling the - level of detailed presented in the internal log. - - - - - Use the default settings as specified by the user. - - - - - Do not display any trace messages - - - - - Display Error messages only - - - - - Display Warning level and higher messages - - - - - Display informational and higher messages - - - - - Display debug messages and higher - i.e. all messages - - - - - Display debug messages and higher - i.e. all messages - - - - - A trace listener that writes to a separate file per domain - and process using it. - - - - - Construct an InternalTraceWriter that writes to a file. - - Path to the file to use - - - - Construct an InternalTraceWriter that writes to a - TextWriter provided by the caller. - - - - - - Returns the character encoding in which the output is written. - - The character encoding in which the output is written. - - - - Writes a character to the text string or stream. - - The character to write to the text stream. - - - - Writes a string to the text string or stream. - - The string to write. - - - - Writes a string followed by a line terminator to the text string or stream. - - The string to write. If is null, only the line terminator is written. - - - - Releases the unmanaged resources used by the and optionally releases the managed resources. - - true to release both managed and unmanaged resources; false to release only unmanaged resources. - - - - Clears all buffers for the current writer and causes any buffered data to be written to the underlying device. - - - - - Provides internal logging to the NUnit framework - - - - - Initializes a new instance of the class. - - The name. - The log level. - The writer where logs are sent. - - - - Logs the message at error level. - - The message. - - - - Logs the message at error level. - - The message. - The message arguments. - - - - Logs the message at warm level. - - The message. - - - - Logs the message at warning level. - - The message. - The message arguments. - - - - Logs the message at info level. - - The message. - - - - Logs the message at info level. - - The message. - The message arguments. - - - - Logs the message at debug level. - - The message. - - - - Logs the message at debug level. - - The message. - The message arguments. - - - - The ParameterDataProvider class implements IParameterDataProvider - and hosts one or more individual providers. - - - - - Construct with a collection of individual providers - - - - - Determine whether any data is available for a parameter. - - An IParameterInfo representing one - argument to a parameterized test - True if any data is available, otherwise false. - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - An IEnumerable providing the required data - - - - Built-in SuiteBuilder for all types of test classes. - - - - - Checks to see if the provided Type is a fixture. - To be considered a fixture, it must be a non-abstract - class with one or more attributes implementing the - IFixtureBuilder interface or one or more methods - marked as tests. - - The fixture type to check - True if the fixture can be built, false if not - - - - Build a TestSuite from TypeInfo provided. - - The fixture type to build - A TestSuite built from that type - - - - We look for attributes implementing IFixtureBuilder at one level - of inheritance at a time. Attributes on base classes are not used - unless there are no fixture builder attributes at all on the derived - class. This is by design. - - The type being examined for attributes - A list of the attributes found. - - - - NUnitTestCaseBuilder is a utility class used by attributes - that build test cases. - - - - - Constructs an - - - - - Builds a single NUnitTestMethod, either as a child of the fixture - or as one of a set of test cases under a ParameterizedTestMethodSuite. - - The MethodInfo from which to construct the TestMethod - The suite or fixture to which the new test will be added - The ParameterSet to be used, or null - - - - - Helper method that checks the signature of a TestMethod and - any supplied parameters to determine if the test is valid. - - Currently, NUnitTestMethods are required to be public, - non-abstract methods, either static or instance, - returning void. They may take arguments but the _values must - be provided or the TestMethod is not considered runnable. - - Methods not meeting these criteria will be marked as - non-runnable and the method will return false in that case. - - The TestMethod to be checked. If it - is found to be non-runnable, it will be modified. - Parameters to be used for this test, or null - True if the method signature is valid, false if not - - The return value is no longer used internally, but is retained - for testing purposes. - - - - - Class that can build a tree of automatic namespace - suites from a group of fixtures. - - - - - NamespaceDictionary of all test suites we have created to represent - namespaces. Used to locate namespace parent suites for fixtures. - - - - - The root of the test suite being created by this builder. - - - - - Initializes a new instance of the class. - - The root suite. - - - - Gets the root entry in the tree created by the NamespaceTreeBuilder. - - The root suite. - - - - Adds the specified fixtures to the tree. - - The fixtures to be added. - - - - Adds the specified fixture to the tree. - - The fixture to be added. - - - - CombinatorialStrategy creates test cases by using all possible - combinations of the parameter data. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - Provides data from fields marked with the DatapointAttribute or the - DatapointsAttribute. - - - - - Determine whether any data is available for a parameter. - - A ParameterInfo representing one - argument to a parameterized test - - True if any data is available, otherwise false. - - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - A ParameterInfo representing one - argument to a parameterized test - - An IEnumerable providing the required data - - - - - Class to build ether a parameterized or a normal NUnitTestMethod. - There are four cases that the builder must deal with: - 1. The method needs no params and none are provided - 2. The method needs params and they are provided - 3. The method needs no params but they are provided in error - 4. The method needs params but they are not provided - This could have been done using two different builders, but it - turned out to be simpler to have just one. The BuildFrom method - takes a different branch depending on whether any parameters are - provided, but all four cases are dealt with in lower-level methods - - - - - Determines if the method can be used to build an NUnit test - test method of some kind. The method must normally be marked - with an identifying attribute for this to be true. - - Note that this method does not check that the signature - of the method for validity. If we did that here, any - test methods with invalid signatures would be passed - over in silence in the test run. Since we want such - methods to be reported, the check for validity is made - in BuildFrom rather than here. - - An IMethodInfo for the method being used as a test method - True if the builder can create a test case from this method - - - - Build a Test from the provided MethodInfo. Depending on - whether the method takes arguments and on the availability - of test case data, this method may return a single test - or a group of tests contained in a ParameterizedMethodSuite. - - The method for which a test is to be built - A Test representing one or more method invocations - - - - Determines if the method can be used to build an NUnit test - test method of some kind. The method must normally be marked - with an identifying attribute for this to be true. - - Note that this method does not check that the signature - of the method for validity. If we did that here, any - test methods with invalid signatures would be passed - over in silence in the test run. Since we want such - methods to be reported, the check for validity is made - in BuildFrom rather than here. - - An IMethodInfo for the method being used as a test method - The test suite being built, to which the new test would be added - True if the builder can create a test case from this method - - - - Build a Test from the provided MethodInfo. Depending on - whether the method takes arguments and on the availability - of test case data, this method may return a single test - or a group of tests contained in a ParameterizedMethodSuite. - - The method for which a test is to be built - The test fixture being populated, or null - A Test representing one or more method invocations - - - - Builds a ParameterizedMethodSuite containing individual test cases. - - The method for which a test is to be built. - The list of test cases to include. - A ParameterizedMethodSuite populated with test cases - - - - Build a simple, non-parameterized TestMethod for this method. - - The MethodInfo for which a test is to be built - The test suite for which the method is being built - A TestMethod. - - - - NUnitTestFixtureBuilder is able to build a fixture given - a class marked with a TestFixtureAttribute or an unmarked - class containing test methods. In the first case, it is - called by the attribute and in the second directly by - NUnitSuiteBuilder. - - - - - Build a TestFixture from type provided. A non-null TestSuite - must always be returned, since the method is generally called - because the user has marked the target class as a fixture. - If something prevents the fixture from being used, it should - be returned nonetheless, labelled as non-runnable. - - An ITypeInfo for the fixture to be used. - A TestSuite object or one derived from TestSuite. - - - - Overload of BuildFrom called by tests that have arguments. - Builds a fixture using the provided type and information - in the ITestFixtureData object. - - The TypeInfo for which to construct a fixture. - An object implementing ITestFixtureData or null. - - - - - Method to add test cases to the newly constructed fixture. - - The fixture to which cases should be added - - - - Method to create a test case from a MethodInfo and add - it to the fixture being built. It first checks to see if - any global TestCaseBuilder addin wants to build the - test case. If not, it uses the internal builder - collection maintained by this fixture builder. - - The default implementation has no test case builders. - Derived classes should add builders to the collection - in their constructor. - - The method for which a test is to be created - The test suite being built. - A newly constructed Test - - - - PairwiseStrategy creates test cases by combining the parameter - data so that all possible pairs of data items are used. - - - - The number of test cases that cover all possible pairs of test function - parameters values is significantly less than the number of test cases - that cover all possible combination of test function parameters values. - And because different studies show that most of software failures are - caused by combination of no more than two parameters, pairwise testing - can be an effective ways to test the system when it's impossible to test - all combinations of parameters. - - - The PairwiseStrategy code is based on "jenny" tool by Bob Jenkins: - http://burtleburtle.net/bob/math/jenny.html - - - - - - FleaRand is a pseudo-random number generator developed by Bob Jenkins: - http://burtleburtle.net/bob/rand/talksmall.html#flea - - - - - Initializes a new instance of the FleaRand class. - - The seed. - - - - FeatureInfo represents coverage of a single value of test function - parameter, represented as a pair of indices, Dimension and Feature. In - terms of unit testing, Dimension is the index of the test parameter and - Feature is the index of the supplied value in that parameter's list of - sources. - - - - - Initializes a new instance of FeatureInfo class. - - Index of a dimension. - Index of a feature. - - - - A FeatureTuple represents a combination of features, one per test - parameter, which should be covered by a test case. In the - PairwiseStrategy, we are only trying to cover pairs of features, so the - tuples actually may contain only single feature or pair of features, but - the algorithm itself works with triplets, quadruples and so on. - - - - - Initializes a new instance of FeatureTuple class for a single feature. - - Single feature. - - - - Initializes a new instance of FeatureTuple class for a pair of features. - - First feature. - Second feature. - - - - TestCase represents a single test case covering a list of features. - - - - - Initializes a new instance of TestCaseInfo class. - - A number of features in the test case. - - - - PairwiseTestCaseGenerator class implements an algorithm which generates - a set of test cases which covers all pairs of possible values of test - function. - - - - The algorithm starts with creating a set of all feature tuples which we - will try to cover (see method). This set - includes every single feature and all possible pairs of features. We - store feature tuples in the 3-D collection (where axes are "dimension", - "feature", and "all combinations which includes this feature"), and for - every two feature (e.g. "A" and "B") we generate both ("A", "B") and - ("B", "A") pairs. This data structure extremely reduces the amount of - time needed to calculate coverage for a single test case (this - calculation is the most time-consuming part of the algorithm). - - - Then the algorithm picks one tuple from the uncovered tuple, creates a - test case that covers this tuple, and then removes this tuple and all - other tuples covered by this test case from the collection of uncovered - tuples. - - - Picking a tuple to cover - - - There are no any special rules defined for picking tuples to cover. We - just pick them one by one, in the order they were generated. - - - Test generation - - - Test generation starts from creating a completely random test case which - covers, nevertheless, previously selected tuple. Then the algorithm - tries to maximize number of tuples which this test covers. - - - Test generation and maximization process repeats seven times for every - selected tuple and then the algorithm picks the best test case ("seven" - is a magic number which provides good results in acceptable time). - - Maximizing test coverage - - To maximize tests coverage, the algorithm walks thru the list of mutable - dimensions (mutable dimension is a dimension that are not included in - the previously selected tuple). Then for every dimension, the algorithm - walks thru the list of features and checks if this feature provides - better coverage than randomly selected feature, and if yes keeps this - feature. - - - This process repeats while it shows progress. If the last iteration - doesn't improve coverage, the process ends. - - - In addition, for better results, before start every iteration, the - algorithm "scrambles" dimensions - so for every iteration dimension - probes in a different order. - - - - - - Creates a set of test cases for specified dimensions. - - - An array which contains information about dimensions. Each element of - this array represents a number of features in the specific dimension. - - - A set of test cases. - - - - - Gets the test cases generated by this strategy instance. - - A set of test cases. - - - - ParameterDataSourceProvider supplies individual argument _values for - single parameters using attributes implementing IParameterDataSource. - - - - - Determine whether any data is available for a parameter. - - A ParameterInfo representing one - argument to a parameterized test - - True if any data is available, otherwise false. - - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - - An IEnumerable providing the required data - - - - - SequentialStrategy creates test cases by using all of the - parameter data sources in parallel, substituting null - when any of them run out of data. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - A base class for multi-part filters - - - - - Constructs an empty CompositeFilter - - - - - Constructs a CompositeFilter from an array of filters - - - - - - Adds a filter to the list of filters - - The filter to be added - - - - Return a list of the composing filters. - - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - PropertyFilter is able to select or exclude tests - based on their properties. - - - - - - Construct a PropertyFilter using a property name and expected value - - A property name - The expected value of the property - - - - Check whether the filter matches a test - - The test to be matched - - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - TestName filter selects tests based on their Name - - - - - Construct a TestNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - ClassName filter selects tests based on the class FullName - - - - - Construct a FullNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - FullName filter selects tests based on their FullName - - - - - Construct a MethodNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - IdFilter selects tests based on their id - - - - - Construct an IdFilter for a single value - - The id the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - ValueMatchFilter selects tests based on some value, which - is expected to be contained in the test. - - - - - Returns the value matched by the filter - used for testing - - - - - Indicates whether the value is a regular expression - - - - - Construct a ValueMatchFilter for a single value. - - The value to be included. - - - - Match the input provided by the derived class - - The value to be matchedT - True for a match, false otherwise. - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - Combines multiple filters so that a test must pass all - of them in order to pass this filter. - - - - - Constructs an empty AndFilter - - - - - Constructs an AndFilter from an array of filters - - - - - - Checks whether the AndFilter is matched by a test - - The test to be matched - True if all the component filters pass, otherwise false - - - - Checks whether the AndFilter is matched by a test - - The test to be matched - True if all the component filters match, otherwise false - - - - Gets the element name - - Element name - - - - CategoryFilter is able to select or exclude tests - based on their categories. - - - - - - Construct a CategoryFilter using a single category name - - A category name - - - - Check whether the filter matches a test - - The test to be matched - - - - - Gets the element name - - Element name - - - - NotFilter negates the operation of another filter - - - - - Construct a not filter on another filter - - The filter to be negated - - - - Gets the base filter - - - - - Determine if a particular test passes the filter criteria. The default - implementation checks the test itself, its parents and any descendants. - - Derived classes may override this method or any of the Match methods - to change the behavior of the filter. - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Check whether the filter matches a test - - The test to be matched - True if it matches, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Combines multiple filters so that a test must pass one - of them in order to pass this filter. - - - - - Constructs an empty OrFilter - - - - - Constructs an AndFilter from an array of filters - - - - - - Checks whether the OrFilter is matched by a test - - The test to be matched - True if any of the component filters pass, otherwise false - - - - Checks whether the OrFilter is matched by a test - - The test to be matched - True if any of the component filters match, otherwise false - - - - Gets the element name - - Element name - - - - FullName filter selects tests based on their FullName - - - - - Construct a FullNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - The MethodWrapper class wraps a MethodInfo so that it may - be used in a platform-independent manner. - - - - - Construct a MethodWrapper for a Type and a MethodInfo. - - - - - Construct a MethodInfo for a given Type and method name. - - - - - Gets the Type from which this method was reflected. - - - - - Gets the MethodInfo for this method. - - - - - Gets the name of the method. - - - - - Gets a value indicating whether the method is abstract. - - - - - Gets a value indicating whether the method is public. - - - - - Gets a value indicating whether the method contains unassigned generic type parameters. - - - - - Gets a value indicating whether the method is a generic method. - - - - - Gets a value indicating whether the MethodInfo represents the definition of a generic method. - - - - - Gets the return Type of the method. - - - - - Gets the parameters of the method. - - - - - - Returns the Type arguments of a generic method or the Type parameters of a generic method definition. - - - - - Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. - - The type arguments to be used - A new IMethodInfo with the type arguments replaced - - - - Returns an array of custom attributes of the specified type applied to this method - - - - - Gets a value indicating whether one or more attributes of the spcified type are defined on the method. - - - - - Invokes the method, converting any TargetInvocationException to an NUnitException. - - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - Override ToString() so that error messages in NUnit's own tests make sense - - - - - The ParameterWrapper class wraps a ParameterInfo so that it may - be used in a platform-independent manner. - - - - - Construct a ParameterWrapper for a given method and parameter - - - - - - - Gets a value indicating whether the parameter is optional - - - - - Gets an IMethodInfo representing the method for which this is a parameter. - - - - - Gets the underlying ParameterInfo - - - - - Gets the Type of the parameter - - - - - Returns an array of custom attributes of the specified type applied to this method - - - - - Gets a value indicating whether one or more attributes of the specified type are defined on the parameter. - - - - - TestNameGenerator is able to create test names according to - a coded pattern. - - - - - Construct a TestNameGenerator - - The pattern used by this generator. - - - - Get the display name for a TestMethod and it's arguments - - A TestMethod - The display name - - - - Get the display name for a TestMethod and it's arguments - - A TestMethod - Arguments to be used - The display name - - - - Get the display name for a MethodInfo - - A MethodInfo - The display name - - - - Get the display name for a method with args - - A MethodInfo - Argument list for the method - The display name - - - - The TypeWrapper class wraps a Type so it may be used in - a platform-independent manner. - - - - - Construct a TypeWrapper for a specified Type. - - - - - Gets the underlying Type on which this TypeWrapper is based. - - - - - Gets the base type of this type as an ITypeInfo - - - - - Gets the Name of the Type - - - - - Gets the FullName of the Type - - - - - Gets the assembly in which the type is declared - - - - - Gets the namespace of the Type - - - - - Gets a value indicating whether the type is abstract. - - - - - Gets a value indicating whether the Type is a generic Type - - - - - Returns true if the Type wrapped is T - - - - - Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. - - - - - Gets a value indicating whether the Type is a generic Type definition - - - - - Gets a value indicating whether the type is sealed. - - - - - Gets a value indicating whether this type represents a static class. - - - - - Get the display name for this type - - - - - Get the display name for an object of this type, constructed with the specified args. - - - - - Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments - - - - - Returns a Type representing a generic type definition from which this Type can be constructed. - - - - - Returns an array of custom attributes of the specified type applied to this type - - - - - Returns a value indicating whether the type has an attribute of the specified type. - - - - - - - - Returns a flag indicating whether this type has a method with an attribute of the specified type. - - - - - - - Returns an array of IMethodInfos for methods of this Type - that match the specified flags. - - - - - Returns a value indicating whether this Type has a public constructor taking the specified argument Types. - - - - - Construct an object of this Type, using the specified arguments. - - - - - Override ToString() so that error messages in NUnit's own tests make sense - - - - - SetUpTearDownItem holds the setup and teardown methods - for a single level of the inheritance hierarchy. - - - - - Construct a SetUpTearDownNode - - A list of setup methods for this level - A list teardown methods for this level - - - - Returns true if this level has any methods at all. - This flag is used to discard levels that do nothing. - - - - - Run SetUp on this level. - - The execution context to use for running. - - - - Run TearDown for this level. - - - - - - TestActionCommand runs the BeforeTest actions for a test, - then runs the test and finally runs the AfterTestActions. - - - - - Initializes a new instance of the class. - - The inner command. - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - TestActionItem represents a single execution of an - ITestAction. It is used to track whether the BeforeTest - method has been called and suppress calling the - AfterTest method if it has not. - - - - - Construct a TestActionItem - - The ITestAction to be included - - - - Run the BeforeTest method of the action and remember that it has been run. - - The test to which the action applies - - - - Run the AfterTest action, but only if the BeforeTest - action was actually run. - - The test to which the action applies - - - - ContextSettingsCommand applies specified changes to the - TestExecutionContext prior to running a test. No special - action is needed after the test runs, since the prior - context will be restored automatically. - - - - - TODO: Documentation needed for class - - - - TODO: Documentation needed for field - - - - TODO: Documentation needed for constructor - - - - - - TODO: Documentation needed for class - - - - - Initializes a new instance of the class. - - The inner command. - The max time allowed in milliseconds - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext - - The context in which the test should run. - A TestResult - - - - OneTimeSetUpCommand runs any one-time setup methods for a suite, - constructing the user test object if necessary. - - - - - Constructs a OneTimeSetUpCommand for a suite - - The suite to which the command applies - A SetUpTearDownList for use by the command - A List of TestActionItems to be run after Setup - - - - Overridden to run the one-time setup for a suite. - - The TestExecutionContext to be used. - A TestResult - - - - OneTimeTearDownCommand performs any teardown actions - specified for a suite and calls Dispose on the user - test object, if any. - - - - - Construct a OneTimeTearDownCommand - - The test suite to which the command applies - A SetUpTearDownList for use by the command - A List of TestActionItems to be run before teardown. - - - - Overridden to run the teardown methods specified on the test. - - The TestExecutionContext to be used. - A TestResult - - - - SetUpTearDownCommand runs any SetUp methods for a suite, - runs the test and then runs any TearDown methods. - - - - - Initializes a new instance of the class. - - The inner command. - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - TODO: Documentation needed for class - - - - - Initializes a new instance of the class. - - The test being skipped. - - - - Overridden to simply set the CurrentResult to the - appropriate Skipped state. - - The execution context for the test - A TestResult - - - - TestCommand is the abstract base class for all test commands - in the framework. A TestCommand represents a single stage in - the execution of a test, e.g.: SetUp/TearDown, checking for - Timeout, verifying the returned result from a method, etc. - - TestCommands may decorate other test commands so that the - execution of a lower-level command is nested within that - of a higher level command. All nested commands are executed - synchronously, as a single unit. Scheduling test execution - on separate threads is handled at a higher level, using the - task dispatcher. - - - - - Construct a TestCommand for a test. - - The test to be executed - - - - Gets the test associated with this command. - - - - - Runs the test in a specified context, returning a TestResult. - - The TestExecutionContext to be used for running the test. - A TestResult - - - - TestMethodCommand is the lowest level concrete command - used to run actual test cases. - - - - - Initializes a new instance of the class. - - The test. - - - - Runs the test, saving a TestResult in the execution context, as - well as returning it. If the test has an expected result, it - is asserts on that value. Since failed tests and errors throw - an exception, this command must be wrapped in an outer command, - will handle that exception and records the failure. This role - is usually played by the SetUpTearDown command. - - The execution context - - - - TheoryResultCommand adjusts the result of a Theory so that - it fails if all the results were inconclusive. - - - - - Constructs a TheoryResultCommand - - The command to be wrapped by this one - - - - Overridden to call the inner command and adjust the result - in case all chlid results were inconclusive. - - - - - - - The CommandStage enumeration represents the defined stages - of execution for a series of TestCommands. The int _values - of the enum are used to apply decorators in the proper - order. Lower _values are applied first and are therefore - "closer" to the actual test execution. - - - No CommandStage is defined for actual invocation of the test or - for creation of the context. Execution may be imagined as - proceeding from the bottom of the list upwards, with cleanup - after the test running in the opposite order. - - - - - Use an application-defined default value. - - - - - Make adjustments needed before and after running - the raw test - that is, after any SetUp has run - and before TearDown. - - - - - Run SetUp and TearDown for the test. This stage is used - internally by NUnit and should not normally appear - in user-defined decorators. - - - - - Make adjustments needed before and after running - the entire test - including SetUp and TearDown. - - - - - A utility class to create TestCommands - - - - - Gets the command to be executed before any of - the child tests are run. - - A TestCommand - - - - Gets the command to be executed after all of the - child tests are run. - - A TestCommand - - - - Creates a test command for use in running this test. - - - - - - Creates a command for skipping a test. The result returned will - depend on the test RunState. - - - - - Builds the set up tear down list. - - Type of the fixture. - Type of the set up attribute. - Type of the tear down attribute. - A list of SetUpTearDownItems - - - - An IWorkItemDispatcher handles execution of work items. - - - - - Dispatch a single work item for execution. The first - work item dispatched is saved as the top-level - work item and used when stopping the run. - - The item to dispatch - - - - Cancel the ongoing run completely. - If no run is in process, the call has no effect. - - - - - SimpleWorkItemDispatcher handles execution of WorkItems by - directly executing them. It is provided so that a dispatcher - is always available in the context, thereby simplifying the - code needed to run child tests. - - - - - Dispatch a single work item for execution. The first - work item dispatched is saved as the top-level - work item and a thread is created on which to - run it. Subsequent calls come from the top level - item or its descendants on the proper thread. - - The item to dispatch - - - - Cancel the ongoing run completely. - If no run is in process, the call has no effect. - - - - - The TextCapture class intercepts console output and writes it - to the current execution context, if one is present on the thread. - If no execution context is found, the output is written to a - default destination, normally the original destination of the - intercepted output. - - - - - Construct a TextCapture object - - The default destination for non-intercepted output - - - - Gets the Encoding in use by this TextWriter - - - - - Writes a single character - - The char to write - - - - Writes a string - - The string to write - - - - Writes a string followed by a line terminator - - The string to write - - - - The dispatcher needs to do different things at different, - non-overlapped times. For example, non-parallel tests may - not be run at the same time as parallel tests. We model - this using the metaphor of a working shift. The WorkShift - class associates one or more WorkItemQueues with one or - more TestWorkers. - - Work in the queues is processed until all queues are empty - and all workers are idle. Both tests are needed because a - worker that is busy may end up adding more work to one of - the queues. At that point, the shift is over and another - shift may begin. This cycle continues until all the tests - have been run. - - - - - Construct a WorkShift - - - - - Event that fires when the shift has ended - - - - - Gets a flag indicating whether the shift is currently active - - - - - Gets a list of the queues associated with this shift. - - Used for testing - - - - Gets the list of workers associated with this shift. - - - - - Gets a bool indicating whether this shift has any work to do - - - - - Add a WorkItemQueue to the shift, starting it if the - shift is currently active. - - - - - Assign a worker to the shift. - - - - - - Start or restart processing for the shift - - - - - End the shift, pausing all queues and raising - the EndOfShift event. - - - - - Shut down the shift. - - - - - Cancel the shift without completing all work - - - - - A CompositeWorkItem represents a test suite and - encapsulates the execution of the suite as well - as all its child tests. - - - - - Construct a CompositeWorkItem for executing a test suite - using a filter to select child tests. - - The TestSuite to be executed - A filter used to select child tests - - - - Method that actually performs the work. Overridden - in CompositeWorkItem to do setup, run all child - items and then do teardown. - - - - - A simplified implementation of .NET 4 CountdownEvent - for use in earlier versions of .NET. Only the methods - used by NUnit are implemented. - - - - - Construct a CountdownEvent - - The initial count - - - - Gets the initial count established for the CountdownEvent - - - - - Gets the current count remaining for the CountdownEvent - - - - - Decrement the count by one - - - - - Block the thread until the count reaches zero - - - - - The EventPumpState enum represents the state of an - EventPump. - - - - - The pump is stopped - - - - - The pump is pumping events with no stop requested - - - - - The pump is pumping events but a stop has been requested - - - - - EventPump pulls events out of an EventQueue and sends - them to a listener. It is used to send events back to - the client without using the CallContext of the test - runner thread. - - - - - The handle on which a thread enqueuing an event with == true - waits, until the EventPump has sent the event to its listeners. - - - - - The downstream listener to which we send events - - - - - The queue that holds our events - - - - - Thread to do the pumping - - - - - The current state of the eventpump - - - - - Constructor - - The EventListener to receive events - The event queue to pull events from - - - - Gets or sets the current state of the pump - - - On volatile and , see - "http://www.albahari.com/threading/part4.aspx". - - - - - Gets or sets the name of this EventPump - (used only internally and for testing). - - - - - Dispose stops the pump - Disposes the used WaitHandle, too. - - - - - Start the pump - - - - - Tell the pump to stop after emptying the queue. - - - - - Our thread proc for removing items from the event - queue and sending them on. Note that this would - need to do more locking if any other thread were - removing events from the queue. - - - - - NUnit.Core.Event is the abstract base for all stored events. - An Event is the stored representation of a call to the - ITestListener interface and is used to record such calls - or to queue them for forwarding on another thread or at - a later time. - - - - - The Send method is implemented by derived classes to send the event to the specified listener. - - The listener. - - - - Gets a value indicating whether this event is delivered synchronously by the NUnit . - - If true, and if has been used to - set a WaitHandle, blocks its calling thread until the - thread has delivered the event and sets the WaitHandle. - - - - - - TestStartedEvent holds information needed to call the TestStarted method. - - - - - Initializes a new instance of the class. - - The test. - - - - Calls TestStarted on the specified listener. - - The listener. - - - - TestFinishedEvent holds information needed to call the TestFinished method. - - - - - Initializes a new instance of the class. - - The result. - - - - Calls TestFinished on the specified listener. - - The listener. - - - - Implements a queue of work items each of which - is queued as a WaitCallback. - - - - - Construct a new EventQueue - - - - - WaitHandle for synchronous event delivery in . - - Having just one handle for the whole implies that - there may be only one producer (the test thread) for synchronous events. - If there can be multiple producers for synchronous events, one would have - to introduce one WaitHandle per event. - - - - - - Gets the count of items in the queue. - - - - - Sets a handle on which to wait, when is called - for an with == true. - - - The wait handle on which to wait, when is called - for an with == true. - The caller is responsible for disposing this wait handle. - - - - - Enqueues the specified event - - The event to enqueue. - - - - Removes the first element from the queue and returns it (or null). - - - If true and the queue is empty, the calling thread is blocked until - either an element is enqueued, or is called. - - - - - If the queue not empty - the first element. - - - otherwise, if ==false - or has been called - null. - - - - - - - Stop processing of the queue - - - - - QueuingEventListener uses an EventQueue to store any - events received on its EventListener interface. - - - - - The EvenQueue created and filled by this listener - - - - - A test has started - - The test that is starting - - - - A test case finished - - Result of the test case - - - - A SimpleWorkItem represents a single test case and is - marked as completed immediately upon execution. This - class is also used for skipped or ignored test suites. - - - - - Construct a simple work item for a test. - - The test to be executed - The filter used to select this test - - - - Method that performs actually performs the work. - - - - - A TestWorker pulls work items from a queue - and executes them. - - - - - Event signaled immediately before executing a WorkItem - - - - - Event signaled immediately after executing a WorkItem - - - - - Construct a new TestWorker. - - The queue from which to pull work items - The name of this worker - The apartment state to use for running tests - - - - The name of this worker - also used for the thread - - - - - Indicates whether the worker thread is running - - - - - Our ThreadProc, which pulls and runs tests in a loop - - - - - Start processing work items. - - - - - Stop the thread, either immediately or after finishing the current WorkItem - - - - - A WorkItem may be an individual test case, a fixture or - a higher level grouping of tests. All WorkItems inherit - from the abstract WorkItem class, which uses the template - pattern to allow derived classes to perform work in - whatever way is needed. - - A WorkItem is created with a particular TestExecutionContext - and is responsible for re-establishing that context in the - current thread before it begins or resumes execution. - - - - - Creates a work item. - - The test for which this WorkItem is being created. - The filter to be used in selecting any child Tests. - - - - - Construct a WorkItem for a particular test. - - The test that the WorkItem will run - - - - Initialize the TestExecutionContext. This must be done - before executing the WorkItem. - - - Originally, the context was provided in the constructor - but delaying initialization of the context until the item - is about to be dispatched allows changes in the parent - context during OneTimeSetUp to be reflected in the child. - - The TestExecutionContext to use - - - - Event triggered when the item is complete - - - - - Gets the current state of the WorkItem - - - - - The test being executed by the work item - - - - - The execution context - - - - - The test actions to be performed before and after this test - - - - - Indicates whether this WorkItem may be run in parallel - - - - - The test result - - - - - Execute the current work item, including any - child work items. - - - - - Method that performs actually performs the work. It should - set the State to WorkItemState.Complete when done. - - - - - Method called by the derived class when all work is complete - - - - - ParallelWorkItemDispatcher handles execution of work items by - queuing them for worker threads to process. - - - - - Construct a ParallelWorkItemDispatcher - - Number of workers to use - - - - Enumerates all the shifts supported by the dispatcher - - - - - Dispatch a single work item for execution. The first - work item dispatched is saved as the top-level - work item and used when stopping the run. - - The item to dispatch - - - - Cancel the ongoing run completely. - If no run is in process, the call has no effect. - - - - - WorkItemQueueState indicates the current state of a WorkItemQueue - - - - - The queue is paused - - - - - The queue is running - - - - - The queue is stopped - - - - - A WorkItemQueue holds work items that are ready to - be run, either initially or after some dependency - has been satisfied. - - - - - Initializes a new instance of the class. - - The name of the queue. - - - - Gets the name of the work item queue. - - - - - Gets the total number of items processed so far - - - - - Gets the maximum number of work items. - - - - - Gets the current state of the queue - - - - - Get a bool indicating whether the queue is empty. - - - - - Enqueue a WorkItem to be processed - - The WorkItem to process - - - - Dequeue a WorkItem for processing - - A WorkItem or null if the queue has stopped - - - - Start or restart processing of items from the queue - - - - - Signal the queue to stop - - - - - Pause the queue for restarting later - - - - - The current state of a work item - - - - - Ready to run or continue - - - - - Work Item is executing - - - - - Complete - - - - - TextMessageWriter writes constraint descriptions and messages - in displayable form as a text stream. It tailors the display - of individual message components to form the standard message - format of NUnit assertion failure messages. - - - - - Prefix used for the expected value line of a message - - - - - Prefix used for the actual value line of a message - - - - - Length of a message prefix - - - - - Construct a TextMessageWriter - - - - - Construct a TextMessageWriter, specifying a user message - and optional formatting arguments. - - - - - - - Gets or sets the maximum line length for this writer - - - - - Method to write single line message with optional args, usually - written to precede the general failure message, at a given - indentation level. - - The indentation level of the message - The message to be written - Any arguments used in formatting the message - - - - Display Expected and Actual lines for a constraint. This - is called by MessageWriter's default implementation of - WriteMessageTo and provides the generic two-line display. - - The result of the constraint that failed - - - - Display Expected and Actual lines for given _values. This - method may be called by constraints that need more control over - the display of actual and expected _values than is provided - by the default implementation. - - The expected value - The actual value causing the failure - - - - Display Expected and Actual lines for given _values, including - a tolerance value on the expected line. - - The expected value - The actual value causing the failure - The tolerance within which the test was made - - - - Display the expected and actual string _values on separate lines. - If the mismatch parameter is >=0, an additional line is displayed - line containing a caret that points to the mismatch point. - - The expected string value - The actual string value - The point at which the strings don't match or -1 - If true, case is ignored in string comparisons - If true, clip the strings to fit the max line length - - - - Writes the text for an actual value. - - The actual value. - - - - Writes the text for a generalized value. - - The value. - - - - Writes the text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Write the generic 'Expected' line for a constraint - - The constraint that failed - - - - Write the generic 'Expected' line for a given value - - The expected value - - - - Write the generic 'Expected' line for a given value - and tolerance. - - The expected value - The tolerance within which the test was made - - - - Write the generic 'Actual' line for a constraint - - The ConstraintResult for which the actual value is to be written - - - - Write the generic 'Actual' line for a given value - - The actual value causing a failure - - - - GenericMethodHelper is able to deduce the Type arguments for - a generic method from the actual arguments provided. - - - - - Construct a GenericMethodHelper for a method - - MethodInfo for the method to examine - - - - Return the type argments for the method, deducing them - from the arguments actually provided. - - The arguments to the method - An array of type arguments. - - - - InvalidTestFixtureException is thrown when an appropriate test - fixture constructor using the provided arguments cannot be found. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The message. - - - - Initializes a new instance of the class. - - The message. - The inner. - - - - Serialization Constructor - - - - - Randomizer returns a set of random _values in a repeatable - way, to allow re-running of tests if necessary. It extends - the .NET Random class, providing random values for a much - wider range of types. - - The class is used internally by the framework to generate - test case data and is also exposed for use by users through - the TestContext.Random property. - - - For consistency with the underlying Random Type, methods - returning a single value use the prefix "Next..." Those - without an argument return a non-negative value up to - the full positive range of the Type. Overloads are provided - for specifying a maximum or a range. Methods that return - arrays or strings use the prefix "Get..." to avoid - confusion with the single-value methods. - - - - - Initial seed used to create randomizers for this run - - - - - Get a Randomizer for a particular member, returning - one that has already been created if it exists. - This ensures that the same _values are generated - each time the tests are reloaded. - - - - - Get a randomizer for a particular parameter, returning - one that has already been created if it exists. - This ensures that the same values are generated - each time the tests are reloaded. - - - - - Create a new Randomizer using the next seed - available to ensure that each randomizer gives - a unique sequence of values. - - - - - - Default constructor - - - - - Construct based on seed value - - - - - - Returns a random unsigned int. - - - - - Returns a random unsigned int less than the specified maximum. - - - - - Returns a random unsigned int within a specified range. - - - - - Returns a non-negative random short. - - - - - Returns a non-negative random short less than the specified maximum. - - - - - Returns a non-negative random short within a specified range. - - - - - Returns a random unsigned short. - - - - - Returns a random unsigned short less than the specified maximum. - - - - - Returns a random unsigned short within a specified range. - - - - - Returns a random long. - - - - - Returns a random long less than the specified maximum. - - - - - Returns a non-negative random long within a specified range. - - - - - Returns a random ulong. - - - - - Returns a random ulong less than the specified maximum. - - - - - Returns a non-negative random long within a specified range. - - - - - Returns a random Byte - - - - - Returns a random Byte less than the specified maximum. - - - - - Returns a random Byte within a specified range - - - - - Returns a random SByte - - - - - Returns a random sbyte less than the specified maximum. - - - - - Returns a random sbyte within a specified range - - - - - Returns a random bool - - - - - Returns a random bool based on the probablility a true result - - - - - Returns a random double between 0.0 and the specified maximum. - - - - - Returns a random double within a specified range. - - - - - Returns a random float. - - - - - Returns a random float between 0.0 and the specified maximum. - - - - - Returns a random float within a specified range. - - - - - Returns a random enum value of the specified Type as an object. - - - - - Returns a random enum value of the specified Type. - - - - - Default characters for random functions. - - Default characters are the English alphabet (uppercase & lowercase), arabic numerals, and underscore - - - - Generate a random string based on the characters from the input string. - - desired length of output string. - string representing the set of characters from which to construct the resulting string - A random string of arbitrary length - - - - Generate a random string based on the characters from the input string. - - desired length of output string. - A random string of arbitrary length - Uses DefaultStringChars as the input character set - - - - Generate a random string based on the characters from the input string. - - A random string of the default length - Uses DefaultStringChars as the input character set - - - - Returns a random decimal. - - - - - Returns a random decimal between positive zero and the specified maximum. - - - - - Returns a random decimal within a specified range, which is not - permitted to exceed decimal.MaxVal in the current implementation. - - - A limitation of this implementation is that the range from min - to max must not exceed decimal.MaxVal. - - - - - StackFilter class is used to remove internal NUnit - entries from a stack trace so that the resulting - trace provides better information about the test. - - - - - Filters a raw stack trace and returns the result. - - The original stack trace - A filtered stack trace - - - - Provides methods to support legacy string comparison methods. - - - - - Compares two strings for equality, ignoring case if requested. - - The first string. - The second string.. - if set to true, the case of the letters in the strings is ignored. - Zero if the strings are equivalent, a negative number if strA is sorted first, a positive number if - strB is sorted first - - - - Compares two strings for equality, ignoring case if requested. - - The first string. - The second string.. - if set to true, the case of the letters in the strings is ignored. - True if the strings are equivalent, false if not. - - - - The TestCaseParameters class encapsulates method arguments and - other selected parameters needed for constructing - a parameterized test case. - - - - - Default Constructor creates an empty parameter set - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a ParameterSet from an object implementing ITestCaseData - - - - - - Type arguments used to create a generic fixture instance - - - - - TestParameters is the abstract base class for all classes - that know how to provide data for constructing a test. - - - - - Default Constructor creates an empty parameter set - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a ParameterSet from an object implementing ITestData - - - - - - The RunState for this set of parameters. - - - - - The arguments to be used in running the test, - which must match the method signature. - - - - - A name to be used for this test case in lieu - of the standard generated name containing - the argument list. - - - - - Gets the property dictionary for this test - - - - - Applies ParameterSet _values to the test itself. - - A test. - - - - The original arguments provided by the user, - used for display purposes. - - - - - Enumeration indicating whether the tests are - running normally or being cancelled. - - - - - Running normally with no stop requested - - - - - A graceful stop has been requested - - - - - A forced stop has been requested - - - - - The PropertyNames class provides static constants for the - standard property ids that NUnit uses on tests. - - - - - The FriendlyName of the AppDomain in which the assembly is running - - - - - The selected strategy for joining parameter data into test cases - - - - - The process ID of the executing assembly - - - - - The stack trace from any data provider that threw - an exception. - - - - - The reason a test was not run - - - - - The author of the tests - - - - - The ApartmentState required for running the test - - - - - The categories applying to a test - - - - - The Description of a test - - - - - The number of threads to be used in running tests - - - - - The maximum time in ms, above which the test is considered to have failed - - - - - The ParallelScope associated with a test - - - - - The number of times the test should be repeated - - - - - Indicates that the test should be run on a separate thread - - - - - The culture to be set for a test - - - - - The UI culture to be set for a test - - - - - The type that is under test - - - - - The timeout value for the test - - - - - The test will be ignored until the given date - - - - - CultureDetector is a helper class used by NUnit to determine - whether a test should be run based on the current culture. - - - - - Default constructor uses the current culture. - - - - - Construct a CultureDetector for a particular culture for testing. - - The culture to be used - - - - Test to determine if one of a collection of cultures - is being used currently. - - - - - - - Tests to determine if the current culture is supported - based on a culture attribute. - - The attribute to examine - - - - - Test to determine if the a particular culture or comma- - delimited set of cultures is in use. - - Name of the culture or comma-separated list of culture ids - True if the culture is in use on the system - - - - Return the last failure reason. Results are not - defined if called before IsSupported( Attribute ) - is called. - - - - - ExceptionHelper provides static methods for working with exceptions - - - - - Builds up a message, using the Message field of the specified exception - as well as any InnerExceptions. - - The exception. - A combined message string. - - - - Builds up a message, using the Message field of the specified exception - as well as any InnerExceptions. - - The exception. - A combined stack trace. - - - - Gets the stack trace of the exception. - - The exception. - A string representation of the stack trace. - - - - InvalidTestFixtureException is thrown when an appropriate test - fixture constructor using the provided arguments cannot be found. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The message. - - - - Initializes a new instance of the class. - - The message. - The inner. - - - - Serialization Constructor - - - - - Thrown when an assertion failed. Here to preserve the inner - exception and hence its stack trace. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The error message that explains - the reason for the exception - - - - Initializes a new instance of the class. - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - OSPlatform represents a particular operating system platform - - - - - Platform ID for Unix as defined by Microsoft .NET 2.0 and greater - - - - - Platform ID for Unix as defined by Mono - - - - - Platform ID for XBox as defined by .NET and Mono, but not CF - - - - - Platform ID for MacOSX as defined by .NET and Mono, but not CF - - - - - Get the OSPlatform under which we are currently running - - - - - Gets the actual OS Version, not the incorrect value that might be - returned for Win 8.1 and Win 10 - - - If an application is not manifested as Windows 8.1 or Windows 10, - the version returned from Environment.OSVersion will not be 6.3 and 10.0 - respectively, but will be 6.2 and 6.3. The correct value can be found in - the registry. - - The original version - The correct OS version - - - - Product Type Enumeration used for Windows - - - - - Product type is unknown or unspecified - - - - - Product type is Workstation - - - - - Product type is Domain Controller - - - - - Product type is Server - - - - - Construct from a platform ID and version - - - - - Construct from a platform ID, version and product type - - - - - Get the platform ID of this instance - - - - - Get the Version of this instance - - - - - Get the Product Type of this instance - - - - - Return true if this is a windows platform - - - - - Return true if this is a Unix or Linux platform - - - - - Return true if the platform is Win32S - - - - - Return true if the platform is Win32Windows - - - - - Return true if the platform is Win32NT - - - - - Return true if the platform is Windows CE - - - - - Return true if the platform is Xbox - - - - - Return true if the platform is MacOSX - - - - - Return true if the platform is Windows 95 - - - - - Return true if the platform is Windows 98 - - - - - Return true if the platform is Windows ME - - - - - Return true if the platform is NT 3 - - - - - Return true if the platform is NT 4 - - - - - Return true if the platform is NT 5 - - - - - Return true if the platform is Windows 2000 - - - - - Return true if the platform is Windows XP - - - - - Return true if the platform is Windows 2003 Server - - - - - Return true if the platform is NT 6 - - - - - Return true if the platform is NT 6.0 - - - - - Return true if the platform is NT 6.1 - - - - - Return true if the platform is NT 6.2 - - - - - Return true if the platform is NT 6.3 - - - - - Return true if the platform is Vista - - - - - Return true if the platform is Windows 2008 Server (original or R2) - - - - - Return true if the platform is Windows 2008 Server (original) - - - - - Return true if the platform is Windows 2008 Server R2 - - - - - Return true if the platform is Windows 2012 Server (original or R2) - - - - - Return true if the platform is Windows 2012 Server (original) - - - - - Return true if the platform is Windows 2012 Server R2 - - - - - Return true if the platform is Windows 7 - - - - - Return true if the platform is Windows 8 - - - - - Return true if the platform is Windows 8.1 - - - - - Return true if the platform is Windows 10 - - - - - Return true if the platform is Windows Server. This is named Windows - Server 10 to distinguish it from previous versions of Windows Server. - - - - - The TestCaseParameters class encapsulates method arguments and - other selected parameters needed for constructing - a parameterized test case. - - - - - The expected result to be returned - - - - - Default Constructor creates an empty parameter set - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a ParameterSet from an object implementing ITestCaseData - - - - - - The expected result of the test, which - must match the method return type. - - - - - Gets a value indicating whether an expected result was specified. - - - - - PlatformHelper class is used by the PlatformAttribute class to - determine whether a platform is supported. - - - - - Comma-delimited list of all supported OS platform constants - - - - - Comma-delimited list of all supported Runtime platform constants - - - - - Default constructor uses the operating system and - common language runtime of the system. - - - - - Construct a PlatformHelper for a particular operating - system and common language runtime. Used in testing. - - OperatingSystem to be used - RuntimeFramework to be used - - - - Test to determine if one of a collection of platforms - is being used currently. - - - - - - - Tests to determine if the current platform is supported - based on a platform attribute. - - The attribute to examine - - - - - Tests to determine if the current platform is supported - based on a platform attribute. - - The attribute to examine - - - - - Test to determine if the a particular platform or comma- - delimited set of platforms is in use. - - Name of the platform or comma-separated list of platform ids - True if the platform is in use on the system - - - - Return the last failure reason. Results are not - defined if called before IsSupported( Attribute ) - is called. - - - - - A PropertyBag represents a collection of name value pairs - that allows duplicate entries with the same key. Methods - are provided for adding a new pair as well as for setting - a key to a single value. All keys are strings but _values - may be of any type. Null _values are not permitted, since - a null entry represents the absence of the key. - - - - - Adds a key/value pair to the property set - - The key - The value - - - - Sets the value for a key, removing any other - _values that are already in the property set. - - - - - - - Gets a single value for a key, using the first - one if multiple _values are present and returning - null if the value is not found. - - - - - - - Gets a flag indicating whether the specified key has - any entries in the property set. - - The key to be checked - - True if their are _values present, otherwise false - - - - - Gets a collection containing all the keys in the property set - - - - - - Gets or sets the list of _values for a particular key - - - - - Returns an XmlNode representating the current PropertyBag. - - Not used - An XmlNode representing the PropertyBag - - - - Returns an XmlNode representing the PropertyBag after - adding it as a child of the supplied parent node. - - The parent node. - Not used - - - - - Helper methods for inspecting a type by reflection. - - Many of these methods take ICustomAttributeProvider as an - argument to avoid duplication, even though certain attributes can - only appear on specific types of members, like MethodInfo or Type. - - In the case where a type is being examined for the presence of - an attribute, interface or named member, the Reflect methods - operate with the full name of the member being sought. This - removes the necessity of the caller having a reference to the - assembly that defines the item being sought and allows the - NUnit core to inspect assemblies that reference an older - version of the NUnit framework. - - - - - Examine a fixture type and return an array of methods having a - particular attribute. The array is order with base methods first. - - The type to examine - The attribute Type to look for - Specifies whether to search the fixture type inheritance chain - The array of methods found - - - - Examine a fixture type and return true if it has a method with - a particular attribute. - - The type to examine - The attribute Type to look for - True if found, otherwise false - - - - Invoke the default constructor on a Type - - The Type to be constructed - An instance of the Type - - - - Invoke a constructor on a Type with arguments - - The Type to be constructed - Arguments to the constructor - An instance of the Type - - - - Returns an array of types from an array of objects. - Used because the compact framework doesn't support - Type.GetTypeArray() - - An array of objects - An array of Types - - - - Invoke a parameterless method returning void on an object. - - A MethodInfo for the method to be invoked - The object on which to invoke the method - - - - Invoke a method, converting any TargetInvocationException to an NUnitException. - - A MethodInfo for the method to be invoked - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - The TestResult class represents the result of a test. - - - - - Error message for when child tests have errors - - - - - Error message for when child tests are ignored - - - - - The minimum duration for tests - - - - - List of child results - - - - - Construct a test result given a Test - - The test to be used - - - - Gets the test with which this result is associated. - - - - - Gets the ResultState of the test result, which - indicates the success or failure of the test. - - - - - Gets the name of the test result - - - - - Gets the full name of the test result - - - - - Gets or sets the elapsed time for running the test in seconds - - - - - Gets or sets the time the test started running. - - - - - Gets or sets the time the test finished running. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. - - - - - Gets or sets the count of asserts executed - when running the test. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Indicates whether this result has any child results. - Test HasChildren before accessing Children to avoid - the creation of an empty collection. - - - - - Gets the collection of child results. - - - - - Gets a TextWriter, which will write output to be included in the result. - - - - - Gets any text output written to this result. - - - - - Returns the Xml representation of the result. - - If true, descendant results are included - An XmlNode representing the result - - - - Adds the XML representation of the result as a child of the - supplied parent node.. - - The parent node. - If true, descendant results are included - - - - - Adds a child result to this result, setting this result's - ResultState to Failure if the child result failed. - - The result to be added - - - - Set the result of the test - - The ResultState to use in the result - - - - Set the result of the test - - The ResultState to use in the result - A message associated with the result state - - - - Set the result of the test - - The ResultState to use in the result - A message associated with the result state - Stack trace giving the location of the command - - - - Set the test result based on the type of exception thrown - - The exception that was thrown - - - - Set the test result based on the type of exception thrown - - The exception that was thrown - THe FailureSite to use in the result - - - - RecordTearDownException appends the message and stacktrace - from an exception arising during teardown of the test - to any previously recorded information, so that any - earlier failure information is not lost. Note that - calling Assert.Ignore, Assert.Inconclusive, etc. during - teardown is treated as an error. If the current result - represents a suite, it may show a teardown error even - though all contained tests passed. - - The Exception to be recorded - - - - Adds a reason element to a node and returns it. - - The target node. - The new reason element. - - - - Adds a failure element to a node and returns it. - - The target node. - The new failure element. - - - - Enumeration identifying a common language - runtime implementation. - - - - Any supported runtime framework - - - Microsoft .NET Framework - - - Microsoft .NET Compact Framework - - - Microsoft Shared Source CLI - - - Mono - - - Silverlight - - - MonoTouch - - - - RuntimeFramework represents a particular version - of a common language runtime implementation. - - - - - DefaultVersion is an empty Version, used to indicate that - NUnit should select the CLR version to use for the test. - - - - - Construct from a runtime type and version. If the version has - two parts, it is taken as a framework version. If it has three - or more, it is taken as a CLR version. In either case, the other - version is deduced based on the runtime type and provided version. - - The runtime type of the framework - The version of the framework - - - - Static method to return a RuntimeFramework object - for the framework that is currently in use. - - - - - The type of this runtime framework - - - - - The framework version for this runtime framework - - - - - The CLR version for this runtime framework - - - - - Return true if any CLR version may be used in - matching this RuntimeFramework object. - - - - - Returns the Display name for this framework - - - - - Parses a string representing a RuntimeFramework. - The string may be just a RuntimeType name or just - a Version or a hyphenated RuntimeType-Version or - a Version prefixed by 'versionString'. - - - - - - - Overridden to return the short name of the framework - - - - - - Returns true if the current framework matches the - one supplied as an argument. Two frameworks match - if their runtime types are the same or either one - is RuntimeType.Any and all specified version components - are equal. Negative (i.e. unspecified) version - components are ignored. - - The RuntimeFramework to be matched. - True on match, otherwise false - - - - Helper class used to save and restore certain static or - singleton settings in the environment that affect tests - or which might be changed by the user tests. - - An internal class is used to hold settings and a stack - of these objects is pushed and popped as Save and Restore - are called. - - - - - Link to a prior saved context - - - - - Indicates that a stop has been requested - - - - - The event listener currently receiving notifications - - - - - The number of assertions for the current test - - - - - The current culture - - - - - The current UI culture - - - - - The current test result - - - - - The current Principal. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - An existing instance of TestExecutionContext. - - - - The current context, head of the list of saved contexts. - - - - - Gets the current context. - - The current context. - - - - Get the current context or return null if none is found. - - - - - Clear the current context. This is provided to - prevent "leakage" of the CallContext containing - the current context back to any runners. - - - - - Gets or sets the current test - - - - - The time the current test started execution - - - - - The time the current test started in Ticks - - - - - Gets or sets the current test result - - - - - Gets a TextWriter that will send output to the current test result. - - - - - The current test object - that is the user fixture - object on which tests are being executed. - - - - - Get or set the working directory - - - - - Get or set indicator that run should stop on the first error - - - - - Gets an enum indicating whether a stop has been requested. - - - - - The current test event listener - - - - - The current WorkItemDispatcher - - - - - The ParallelScope to be used by tests running in this context. - For builds with out the parallel feature, it has no effect. - - - - - Gets the RandomGenerator specific to this Test - - - - - Gets the assert count. - - The assert count. - - - - Gets or sets the test case timeout value - - - - - Gets a list of ITestActions set by upstream tests - - - - - Saves or restores the CurrentCulture - - - - - Saves or restores the CurrentUICulture - - - - - Gets or sets the current for the Thread. - - - - - Record any changes in the environment made by - the test code in the execution context so it - will be passed on to lower level tests. - - - - - Set up the execution environment to match a context. - Note that we may be running on the same thread where the - context was initially created or on a different thread. - - - - - Increments the assert count by one. - - - - - Increments the assert count by a specified amount. - - - - - Obtain lifetime service object - - - - - - Interface to be implemented by filters applied to tests. - The filter applies when running the test, after it has been - loaded, since this is the only time an ITest exists. - - - - - Unique Empty filter. - - - - - Indicates whether this is the EmptyFilter - - - - - Indicates whether this is a top-level filter, - not contained in any other filter. - - - - - Determine if a particular test passes the filter criteria. The default - implementation checks the test itself, its parents and any descendants. - - Derived classes may override this method or any of the Match methods - to change the behavior of the filter. - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - Determine whether the test itself matches the filter criteria, without - examining either parents or descendants. This is overridden by each - different type of filter to perform the necessary tests. - - The test to which the filter is applied - True if the filter matches the any parent of the test - - - - Determine whether any ancestor of the test matches the filter criteria - - The test to which the filter is applied - True if the filter matches the an ancestor of the test - - - - Determine whether any descendant of the test matches the filter criteria. - - The test to be matched - True if at least one descendant matches the filter criteria - - - - Create a TestFilter instance from an xml representation. - - - - - Create a TestFilter from it's TNode representation - - - - - Nested class provides an empty filter - one that always - returns true when called. It never matches explicitly. - - - - - Adds an XML node - - True if recursive - The added XML node - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - TestListener provides an implementation of ITestListener that - does nothing. It is used only through its NULL property. - - - - - Called when a test has just started - - The test that is starting - - - - Called when a test case has finished - - The result of the test - - - - Construct a new TestListener - private so it may not be used. - - - - - Get a listener that does nothing - - - - - TestProgressReporter translates ITestListener events into - the async callbacks that are used to inform the client - software about the progress of a test run. - - - - - Initializes a new instance of the class. - - The callback handler to be used for reporting progress. - - - - Called when a test has just started - - The test that is starting - - - - Called when a test has finished. Sends a result summary to the callback. - to - - The result of the test - - - - Returns the parent test item for the targer test item if it exists - - - parent test item - - - - Makes a string safe for use as an attribute, replacing - characters characters that can't be used with their - corresponding xml representations. - - The string to be used - A new string with the _values replaced - - - - ParameterizedFixtureSuite serves as a container for the set of test - fixtures created from a given Type using various parameters. - - - - - Initializes a new instance of the class. - - The ITypeInfo for the type that represents the suite. - - - - Gets a string representing the type of test - - - - - - ParameterizedMethodSuite holds a collection of individual - TestMethods with their arguments applied. - - - - - Construct from a MethodInfo - - - - - - Gets a string representing the type of test - - - - - - SetUpFixture extends TestSuite and supports - Setup and TearDown methods. - - - - - Initializes a new instance of the class. - - The type. - - - - The Test abstract class represents a test within the framework. - - - - - Static value to seed ids. It's started at 1000 so any - uninitialized ids will stand out. - - - - - The SetUp methods. - - - - - The teardown methods - - - - - Constructs a test given its name - - The name of the test - - - - Constructs a test given the path through the - test hierarchy to its parent and a name. - - The parent tests full name - The name of the test - - - - TODO: Documentation needed for constructor - - - - - - Construct a test from a MethodInfo - - - - - - Gets or sets the id of the test - - - - - - Gets or sets the name of the test - - - - - Gets or sets the fully qualified name of the test - - - - - - Gets the name of the class containing this test. Returns - null if the test is not associated with a class. - - - - - Gets the name of the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the TypeInfo of the fixture used in running this test - or null if no fixture type is associated with it. - - - - - Gets a MethodInfo for the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Whether or not the test should be run - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Gets a string representing the type of test. Used as an attribute - value in the XML representation of a test and has no other - function in the framework. - - - - - Gets a count of test cases represented by - or contained under this test. - - - - - Gets the properties for this test - - - - - Returns true if this is a TestSuite - - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets the parent as a Test object. - Used by the core to set the parent. - - - - - Gets this test's child tests - - A list of child tests - - - - Gets or sets a fixture object for running this test. - - - - - Static prefix used for ids in this AppDomain. - Set by FrameworkController. - - - - - Gets or Sets the Int value representing the seed for the RandomGenerator - - - - - - Creates a TestResult for this test. - - A TestResult suitable for this type of test. - - - - Modify a newly constructed test by applying any of NUnit's common - attributes, based on a supplied ICustomAttributeProvider, which is - usually the reflection element from which the test was constructed, - but may not be in some instances. The attributes retrieved are - saved for use in subsequent operations. - - An object implementing ICustomAttributeProvider - - - - Add standard attributes and members to a test node. - - - - - - - Returns the Xml representation of the test - - If true, include child tests recursively - - - - - Returns an XmlNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Compares this test to another test for sorting purposes - - The other test - Value of -1, 0 or +1 depending on whether the current test is less than, equal to or greater than the other test - - - - TestAssembly is a TestSuite that represents the execution - of tests in a managed assembly. - - - - - Initializes a new instance of the class - specifying the Assembly and the path from which it was loaded. - - The assembly this test represents. - The path used to load the assembly. - - - - Initializes a new instance of the class - for a path which could not be loaded. - - The path used to load the assembly. - - - - Gets the Assembly represented by this instance. - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - TestFixture is a surrogate for a user test fixture class, - containing one or more tests. - - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - The TestMethod class represents a Test implemented as a method. - - - - - The ParameterSet used to create this test method - - - - - Initializes a new instance of the class. - - The method to be used as a test. - - - - Initializes a new instance of the class. - - The method to be used as a test. - The suite or fixture to which the new test will be added - - - - Overridden to return a TestCaseResult. - - A TestResult for this test. - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Returns a TNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Gets this test's child tests - - A list of child tests - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Returns the name of the method - - - - - TestSuite represents a composite test, which contains other tests. - - - - - Our collection of child tests - - - - - Initializes a new instance of the class. - - The name of the suite. - - - - Initializes a new instance of the class. - - Name of the parent suite. - The name of the suite. - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - Sorts tests under this suite. - - - - - Adds a test to the suite. - - The test. - - - - Gets this test's child tests - - The list of child tests - - - - Gets a count of test cases represented by - or contained under this test. - - - - - - The arguments to use in creating the fixture - - - - - Set to true to suppress sorting this suite's contents - - - - - Overridden to return a TestSuiteResult. - - A TestResult for this test. - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Returns an XmlNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Check that setup and teardown methods marked by certain attributes - meet NUnit's requirements and mark the tests not runnable otherwise. - - The attribute type to check for - - - - ThreadUtility provides a set of static methods convenient - for working with threads. - - - - - Do our best to Kill a thread - - The thread to kill - - - - Do our best to kill a thread, passing state info - - The thread to kill - Info for the ThreadAbortException handler - - - - TypeHelper provides static methods that operate on Types. - - - - - A special value, which is used to indicate that BestCommonType() method - was unable to find a common type for the specified arguments. - - - - - Gets the display name for a Type as used by NUnit. - - The Type for which a display name is needed. - The display name for the Type - - - - Gets the display name for a Type as used by NUnit. - - The Type for which a display name is needed. - The arglist provided. - The display name for the Type - - - - Returns the best fit for a common type to be used in - matching actual arguments to a methods Type parameters. - - The first type. - The second type. - Either type1 or type2, depending on which is more general. - - - - Determines whether the specified type is numeric. - - The type to be examined. - - true if the specified type is numeric; otherwise, false. - - - - - Convert an argument list to the required parameter types. - Currently, only widening numeric conversions are performed. - - An array of args to be converted - A ParameterInfo[] whose types will be used as targets - - - - Determines whether this instance can deduce type args for a generic type from the supplied arguments. - - The type to be examined. - The arglist. - The type args to be used. - - true if this the provided args give sufficient information to determine the type args to be used; otherwise, false. - - - - - Gets the _values for an enumeration, using Enum.GetTypes - where available, otherwise through reflection. - - - - - - - Gets the ids of the _values for an enumeration, - using Enum.GetNames where available, otherwise - through reflection. - - - - - - - Represents the result of running a single test case. - - - - - Construct a TestCaseResult based on a TestMethod - - A TestMethod to which the result applies. - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Represents the result of running a test suite - - - - - Construct a TestSuiteResult base on a TestSuite - - The TestSuite to which the result applies - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Add a child result - - The child result to be added - - - - Class used to guard against unexpected argument values - or operations by throwing an appropriate exception. - - - - - Throws an exception if an argument is null - - The value to be tested - The name of the argument - - - - Throws an exception if a string argument is null or empty - - The value to be tested - The name of the argument - - - - Throws an ArgumentOutOfRangeException if the specified condition is not met. - - The condition that must be met - The exception message to be used - The name of the argument - - - - Throws an ArgumentException if the specified condition is not met. - - The condition that must be met - The exception message to be used - The name of the argument - - - - Throws an InvalidOperationException if the specified condition is not met. - - The condition that must be met - The exception message to be used - - - - The different targets a test action attribute can be applied to - - - - - Default target, which is determined by where the action attribute is attached - - - - - Target a individual test case - - - - - Target a suite of test cases - - - - - FrameworkController provides a facade for use in loading, browsing - and running tests without requiring a reference to the NUnit - framework. All calls are encapsulated in constructors for - this class and its nested classes, which only require the - types of the Common Type System as arguments. - - The controller supports four actions: Load, Explore, Count and Run. - They are intended to be called by a driver, which should allow for - proper sequencing of calls. Load must be called before any of the - other actions. The driver may support other actions, such as - reload on run, by combining these calls. - - - - - Construct a FrameworkController using the default builder and runner. - - The AssemblyName or path to the test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - - - - Construct a FrameworkController using the default builder and runner. - - The test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - - - - Construct a FrameworkController, specifying the types to be used - for the runner and builder. This constructor is provided for - purposes of development. - - The full AssemblyName or the path to the test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - The Type of the test runner - The Type of the test builder - - - - Construct a FrameworkController, specifying the types to be used - for the runner and builder. This constructor is provided for - purposes of development. - - The test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - The Type of the test runner - The Type of the test builder - - - - Gets the ITestAssemblyBuilder used by this controller instance. - - The builder. - - - - Gets the ITestAssemblyRunner used by this controller instance. - - The runner. - - - - Gets the AssemblyName or the path for which this FrameworkController was created - - - - - Gets the Assembly for which this - - - - - Gets a dictionary of settings for the FrameworkController - - - - - Inserts environment element - - Target node - The new node - - - - Inserts settings element - - Target node - Settings dictionary - The new node - - - - FrameworkControllerAction is the base class for all actions - performed against a FrameworkController. - - - - - LoadTestsAction loads a test into the FrameworkController - - - - - LoadTestsAction loads the tests in an assembly. - - The controller. - The callback handler. - - - - ExploreTestsAction returns info about the tests in an assembly - - - - - Initializes a new instance of the class. - - The controller for which this action is being performed. - Filter used to control which tests are included (NYI) - The callback handler. - - - - CountTestsAction counts the number of test cases in the loaded TestSuite - held by the FrameworkController. - - - - - Construct a CountsTestAction and perform the count of test cases. - - A FrameworkController holding the TestSuite whose cases are to be counted - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - RunTestsAction runs the loaded TestSuite held by the FrameworkController. - - - - - Construct a RunTestsAction and run all tests in the loaded TestSuite. - - A FrameworkController holding the TestSuite to run - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - RunAsyncAction initiates an asynchronous test run, returning immediately - - - - - Construct a RunAsyncAction and run all tests in the loaded TestSuite. - - A FrameworkController holding the TestSuite to run - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - StopRunAction stops an ongoing run. - - - - - Construct a StopRunAction and stop any ongoing run. If no - run is in process, no error is raised. - - The FrameworkController for which a run is to be stopped. - True the stop should be forced, false for a cooperative stop. - >A callback handler used to report results - A forced stop will cause threads and processes to be killed as needed. - - - - Implementation of ITestAssemblyRunner - - - - - Initializes a new instance of the class. - - The builder. - - - - Gets the default level of parallel execution (worker threads) - - - - - The tree of tests that was loaded by the builder - - - - - The test result, if a run has completed - - - - - Indicates whether a test is loaded - - - - - Indicates whether a test is running - - - - - Indicates whether a test run is complete - - - - - Our settings, specified when loading the assembly - - - - - The top level WorkItem created for the assembly as a whole - - - - - The TestExecutionContext for the top level WorkItem - - - - - Loads the tests found in an Assembly - - File name of the assembly to load - Dictionary of option settings for loading the assembly - True if the load was successful - - - - Loads the tests found in an Assembly - - The assembly to load - Dictionary of option settings for loading the assembly - True if the load was successful - - - - Count Test Cases using a filter - - The filter to apply - The number of test cases found - - - - Run selected tests and return a test result. The test is run synchronously, - and the listener interface is notified as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - - - - Run selected tests asynchronously, notifying the listener interface as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - RunAsync is a template method, calling various abstract and - virtual methods to be overridden by derived classes. - - - - - Wait for the ongoing run to complete. - - Time to wait in milliseconds - True if the run completed, otherwise false - - - - Initiate the test run. - - - - - Signal any test run that is in process to stop. Return without error if no test is running. - - If true, kill any test-running threads - - - - Create the initial TestExecutionContext used to run tests - - The ITestListener specified in the RunAsync call - - - - Handle the the Completed event for the top level work item - - - - - The ITestAssemblyBuilder interface is implemented by a class - that is able to build a suite of tests given an assembly or - an assembly filename. - - - - - Build a suite of tests from a provided assembly - - The assembly from which tests are to be built - A dictionary of options to use in building the suite - A TestSuite containing the tests found in the assembly - - - - Build a suite of tests given the filename of an assembly - - The filename of the assembly from which tests are to be built - A dictionary of options to use in building the suite - A TestSuite containing the tests found in the assembly - - - - The ITestAssemblyRunner interface is implemented by classes - that are able to execute a suite of tests loaded - from an assembly. - - - - - Gets the tree of loaded tests, or null if - no tests have been loaded. - - - - - Gets the tree of test results, if the test - run is completed, otherwise null. - - - - - Indicates whether a test has been loaded - - - - - Indicates whether a test is currently running - - - - - Indicates whether a test run is complete - - - - - Loads the tests found in an Assembly, returning an - indication of whether or not the load succeeded. - - File name of the assembly to load - Dictionary of options to use in loading the test - An ITest representing the loaded tests - - - - Loads the tests found in an Assembly, returning an - indication of whether or not the load succeeded. - - The assembly to load - Dictionary of options to use in loading the test - An ITest representing the loaded tests - - - - Count Test Cases using a filter - - The filter to apply - The number of test cases found - - - - Run selected tests and return a test result. The test is run synchronously, - and the listener interface is notified as it progresses. - - Interface to receive ITestListener notifications. - A test filter used to select tests to be run - - - - Run selected tests asynchronously, notifying the listener interface as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - - - Wait for the ongoing run to complete. - - Time to wait in milliseconds - True if the run completed, otherwise false - - - - Signal any test run that is in process to stop. Return without error if no test is running. - - If true, kill any test-running threads - - - - DefaultTestAssemblyBuilder loads a single assembly and builds a TestSuite - containing test fixtures present in the assembly. - - - - - The default suite builder used by the test assembly builder. - - - - - Initializes a new instance of the class. - - - - - Build a suite of tests from a provided assembly - - The assembly from which tests are to be built - A dictionary of options to use in building the suite - - A TestSuite containing the tests found in the assembly - - - - - Build a suite of tests given the filename of an assembly - - The filename of the assembly from which tests are to be built - A dictionary of options to use in building the suite - - A TestSuite containing the tests found in the assembly - - - - - Marks a test that must run in a particular threading apartment state, causing it - to run in a separate thread if necessary. - - - - - Construct an ApartmentAttribute - - The apartment state that this test must be run under. You must pass in a valid apartment state. - - - - Provides the Author of a test or test fixture. - - - - - Initializes a new instance of the class. - - The name of the author. - - - - Initializes a new instance of the class. - - The name of the author. - The email address of the author. - - - - Marks a test to use a particular CombiningStrategy to join - any parameter data provided. Since this is the default, the - attribute is optional. - - - - - Construct a CombiningStrategyAttribute incorporating an - ICombiningStrategy and an IParamterDataProvider. - - Combining strategy to be used in combining data - An IParameterDataProvider to supply data - - - - Construct a CombiningStrategyAttribute incorporating an object - that implements ICombiningStrategy and an IParameterDataProvider. - This constructor is provided for CLS compliance. - - Combining strategy to be used in combining data - An IParameterDataProvider to supply data - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The MethodInfo for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - Modify the test by adding the name of the combining strategy - to the properties. - - The test to modify - - - - RepeatAttribute may be applied to test case in order - to run it multiple times. - - - - - Construct a RepeatAttribute - - The number of times to run the test - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - The test command for the RetryAttribute - - - - - Initializes a new instance of the class. - - The inner command. - The number of repetitions - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - Attribute used to identify a method that is called once - after all the child tests have run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Attribute used to identify a method that is called once - to perform setup before any child tests are run. - - - - - LevelOfParallelismAttribute is used to set the number of worker threads - that may be allocated by the framework for running tests. - - - - - Construct a LevelOfParallelismAttribute. - - The number of worker threads to be created by the framework. - - - - ParallelizableAttribute is used to mark tests that may be run in parallel. - - - - - Construct a ParallelizableAttribute using default ParallelScope.Self. - - - - - Construct a ParallelizableAttribute with a specified scope. - - The ParallelScope associated with this attribute. - - - - Modify the context to be used for child tests - - The current TestExecutionContext - - - - The ParallelScope enumeration permits specifying the degree to - which a test and its descendants may be run in parallel. - - - - - No Parallelism is permitted - - - - - The test itself may be run in parallel with others at the same level - - - - - Descendants of the test may be run in parallel with one another - - - - - Descendants of the test down to the level of TestFixtures may be run in parallel - - - - - Provide actions to execute before and after tests. - - - - - Executed before each test is run - - The test that is going to be run. - - - - Executed after each test is run - - The test that has just been run. - - - - Provides the target for the action attribute - - - - - TestCaseSourceAttribute indicates the source to be used to - provide test fixture instances for a test class. - - - - - Error message string is public so the tests can use it - - - - - Construct with the name of the method, property or field that will provide data - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - Construct with a Type - - The type that will provide data - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets or sets the category associated with every fixture created from - this attribute. May be a single category or a comma-separated list. - - - - - Construct one or more TestFixtures from a given Type, - using available parameter data. - - The TypeInfo for which fixures are to be constructed. - One or more TestFixtures as TestSuite - - - - Returns a set of ITestFixtureData items for use as arguments - to a parameterized test fixture. - - The type for which data is needed. - - - - - Indicates which class the test or test fixture is testing - - - - - Initializes a new instance of the class. - - The type that is being tested. - - - - Initializes a new instance of the class. - - The type that is being tested. - - - - Provides a platform-independent methods for getting attributes - for use by AttributeConstraint and AttributeExistsConstraint. - - - - - Gets the custom attributes from the given object. - - Portable libraries do not have an ICustomAttributeProvider, so we need to cast to each of - it's direct subtypes and try to get attributes off those instead. - The actual. - Type of the attribute. - if set to true [inherit]. - A list of the given attribute on the given object. - - - - A MarshalByRefObject that lives forever - - - - - Obtains a lifetime service object to control the lifetime policy for this instance. - - - - - Provides NUnit specific extensions to aid in Reflection - across multiple frameworks - - - This version of the class supplies GetTypeInfo() on platforms - that don't support it. - - - - - GetTypeInfo gives access to most of the Type information we take for granted - on .NET Core and Windows Runtime. Rather than #ifdef different code for different - platforms, it is easiest to just code all platforms as if they worked this way, - thus the simple passthrough. - - - - - - - This class is a System.Diagnostics.Stopwatch on operating systems that support it. On those that don't, - it replicates the functionality at the resolution supported. - - - - - CollectionSupersetConstraint is used to determine whether - one collection is a superset of another - - - - - Construct a CollectionSupersetConstraint - - The collection that the actual value is expected to be a superset of - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the actual collection is a superset of - the expected collection provided. - - - - - - - DictionaryContainsValueConstraint is used to test whether a dictionary - contains an expected object as a value. - - - - - Construct a DictionaryContainsValueConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the expected value is contained in the dictionary - - - - - The EqualConstraintResult class is tailored for formatting - and displaying the result of an EqualConstraint. - - - - - Construct an EqualConstraintResult - - - - - Write a failure message. Overridden to provide custom - failure messages for EqualConstraint. - - The MessageWriter to write to - - - - Display the failure information for two collections that did not match. - - The MessageWriter on which to display - The expected collection. - The actual collection - The depth of this failure in a set of nested collections - - - - Displays a single line showing the types and sizes of the expected - and actual collections or arrays. If both are identical, the value is - only shown once. - - The MessageWriter on which to display - The expected collection or array - The actual collection or array - The indentation level for the message line - - - - Displays a single line showing the point in the expected and actual - arrays at which the comparison failed. If the arrays have different - structures or dimensions, both _values are shown. - - The MessageWriter on which to display - The expected array - The actual array - Index of the failure point in the underlying collections - The indentation level for the message line - - - - Display the failure information for two IEnumerables that did not match. - - The MessageWriter on which to display - The expected enumeration. - The actual enumeration - The depth of this failure in a set of nested collections - - - - FileExistsConstraint is used to determine if a file exists - - - - - Initializes a new instance of the class. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - FileOrDirectoryExistsConstraint is used to determine if a file or directory exists - - - - - If true, the constraint will only check if files exist, not directories - - - - - If true, the constraint will only check if directories exist, not files - - - - - Initializes a new instance of the class that - will check files and directories. - - - - - Initializes a new instance of the class that - will only check files if ignoreDirectories is true. - - if set to true [ignore directories]. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Interface for all constraints - - - - - The display name of this Constraint for use by ToString(). - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Arguments provided to this Constraint, for use in - formatting the description. - - - - - The ConstraintBuilder holding this constraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - Test whether the constraint is satisfied by a given reference. - The default implementation simply dereferences the value but - derived classes may override it to provide for delayed processing. - - A reference to the value to be tested - A ConstraintResult - - - - Represents a constraint that succeeds if all the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - they all succeed. - - - - - Represents a constraint that succeeds if none of the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. - - - - - Represents a constraint that succeeds if any of the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - any of them succeed. - - - - - SubPathConstraint tests that the actual path is under the expected path - - - - - Initializes a new instance of the class. - - The expected path - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - ThrowsExceptionConstraint tests that an exception has - been thrown, without any further tests. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Executes the code and returns success if an exception is thrown. - - A delegate representing the code to be tested - True if an exception is thrown, otherwise false - - - - AllItemsConstraint applies another constraint to each - item in a collection, succeeding if they all succeed. - - - - - Construct an AllItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - failing if any item fails. - - - - - - - AndConstraint succeeds only if both members succeed. - - - - - Create an AndConstraint from two other constraints - - The first constraint - The second constraint - - - - Gets text describing a constraint - - - - - Apply both member constraints to an actual value, succeeding - succeeding only if both of them succeed. - - The actual value - True if the constraints both succeeded - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - AssignableFromConstraint is used to test that an object - can be assigned from a given Type. - - - - - Construct an AssignableFromConstraint for the type provided - - - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - AssignableToConstraint is used to test that an object - can be assigned to a given Type. - - - - - Construct an AssignableToConstraint for the type provided - - - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - AttributeConstraint tests that a specified attribute is present - on a Type or other provider and that the value of the attribute - satisfies some other constraint. - - - - - Constructs an AttributeConstraint for a specified attribute - Type and base constraint. - - - - - - - Determines whether the Type or other provider has the - expected attribute and if its value matches the - additional constraint specified. - - - - - Returns a string representation of the constraint. - - - - - AttributeExistsConstraint tests for the presence of a - specified attribute on a Type. - - - - - Constructs an AttributeExistsConstraint for a specific attribute Type - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Tests whether the object provides the expected attribute. - - A Type, MethodInfo, or other ICustomAttributeProvider - True if the expected attribute is present, otherwise false - - - - BinaryConstraint is the abstract base of all constraints - that combine two other constraints in some fashion. - - - - - The first constraint being combined - - - - - The second constraint being combined - - - - - Construct a BinaryConstraint from two other constraints - - The first constraint - The second constraint - - - - BinarySerializableConstraint tests whether - an object is serializable in binary format. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Returns the string representation - - - - - CollectionConstraint is the abstract base class for - constraints that operate on collections. - - - - - Construct an empty CollectionConstraint - - - - - Construct a CollectionConstraint - - - - - - Determines whether the specified enumerable is empty. - - The enumerable. - - true if the specified enumerable is empty; otherwise, false. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Protected method to be implemented by derived classes - - - - - - - CollectionContainsConstraint is used to test whether a collection - contains an expected object as a member. - - - - - Construct a CollectionContainsConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Gets the expected object - - - - - Test whether the expected item is contained in the collection - - - - - - - CollectionEquivalentConstraint is used to determine whether two - collections are equivalent. - - - - - Construct a CollectionEquivalentConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether two collections are equivalent - - - - - - - CollectionItemsEqualConstraint is the abstract base class for all - collection constraints that apply some notion of item equality - as a part of their operation. - - - - - Construct an empty CollectionConstraint - - - - - Construct a CollectionConstraint - - - - - - Flag the constraint to ignore case and return self. - - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied Comparison object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Compares two collection members for equality - - - - - Return a new CollectionTally for use in making tests - - The collection to be included in the tally - - - - CollectionOrderedConstraint is used to test whether a collection is ordered. - - - - - Construct a CollectionOrderedConstraint - - - - - If used performs a reverse comparison - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use a and returns self. - - - - - Modifies the constraint to test ordering by the value of - a specified property and returns self. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the collection is ordered - - - - - - - Returns the string representation of the constraint. - - - - - - CollectionSubsetConstraint is used to determine whether - one collection is a subset of another - - - - - Construct a CollectionSubsetConstraint - - The collection that the actual value is expected to be a subset of - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the actual collection is a subset of - the expected collection provided. - - - - - - - CollectionTally counts (tallies) the number of - occurrences of each object in one or more enumerations. - - - - - Construct a CollectionTally object from a comparer and a collection - - - - - The number of objects remaining in the tally - - - - - Try to remove an object from the tally - - The object to remove - True if successful, false if the object was not found - - - - Try to remove a set of objects from the tally - - The objects to remove - True if successful, false if any object was not found - - - - ComparisonAdapter class centralizes all comparisons of - _values in NUnit, adapting to the use of any provided - , - or . - - - - - Gets the default ComparisonAdapter, which wraps an - NUnitComparer object. - - - - - Returns a ComparisonAdapter that wraps an - - - - - Returns a ComparisonAdapter that wraps an - - - - - Returns a ComparisonAdapter that wraps a - - - - - Compares two objects - - - - - Construct a default ComparisonAdapter - - - - - Construct a ComparisonAdapter for an - - - - - Compares two objects - - - - - - - - ComparerAdapter extends and - allows use of an or - to actually perform the comparison. - - - - - Construct a ComparisonAdapter for an - - - - - Compare a Type T to an object - - - - - Construct a ComparisonAdapter for a - - - - - Compare a Type T to an object - - - - - Abstract base class for constraints that compare _values to - determine if one is greater than, equal to or less than - the other. - - - - - The value against which a comparison is to be made - - - - - If true, less than returns success - - - - - if true, equal returns success - - - - - if true, greater than returns success - - - - - ComparisonAdapter to be used in making the comparison - - - - - Initializes a new instance of the class. - - The value against which to make a comparison. - if set to true less succeeds. - if set to true equal succeeds. - if set to true greater succeeds. - String used in describing the constraint. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Modifies the constraint to use an and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Modifies the constraint to use an and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Modifies the constraint to use a and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Delegate used to delay evaluation of the actual value - to be used in evaluating a constraint - - - - - The Constraint class is the base of all built-in constraints - within NUnit. It provides the operator overloads used to combine - constraints. - - - - - Construct a constraint with optional arguments - - Arguments to be saved - - - - The display name of this Constraint for use by ToString(). - The default value is the name of the constraint with - trailing "Constraint" removed. Derived classes may set - this to another name in their constructors. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Arguments provided to this Constraint, for use in - formatting the description. - - - - - The ConstraintBuilder holding this constraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - Test whether the constraint is satisfied by a given reference. - The default implementation simply dereferences the value but - derived classes may override it to provide for delayed processing. - - A reference to the value to be tested - A ConstraintResult - - - - Default override of ToString returns the constraint DisplayName - followed by any arguments within angle brackets. - - - - - - Returns the string representation of this constraint - - - - - This operator creates a constraint that is satisfied only if both - argument constraints are satisfied. - - - - - This operator creates a constraint that is satisfied if either - of the argument constraints is satisfied. - - - - - This operator creates a constraint that is satisfied if the - argument constraint is not satisfied. - - - - - Returns a ConstraintExpression by appending And - to the current constraint. - - - - - Returns a ConstraintExpression by appending And - to the current constraint. - - - - - Returns a ConstraintExpression by appending Or - to the current constraint. - - - - - Returns a DelayedConstraint with the specified delay time. - - The delay in milliseconds. - - - - - Returns a DelayedConstraint with the specified delay time - and polling interval. - - The delay in milliseconds. - The interval at which to test the constraint. - - - - - Resolves any pending operators and returns the resolved constraint. - - - - - ConstraintBuilder maintains the stacks that are used in - processing a ConstraintExpression. An OperatorStack - is used to hold operators that are waiting for their - operands to be reorganized. a ConstraintStack holds - input constraints as well as the results of each - operator applied. - - - - - OperatorStack is a type-safe stack for holding ConstraintOperators - - - - - Initializes a new instance of the class. - - The ConstraintBuilder using this stack. - - - - Gets a value indicating whether this is empty. - - true if empty; otherwise, false. - - - - Gets the topmost operator without modifying the stack. - - - - - Pushes the specified operator onto the stack. - - The operator to put onto the stack. - - - - Pops the topmost operator from the stack. - - The topmost operator on the stack - - - - ConstraintStack is a type-safe stack for holding Constraints - - - - - Initializes a new instance of the class. - - The ConstraintBuilder using this stack. - - - - Gets a value indicating whether this is empty. - - true if empty; otherwise, false. - - - - Pushes the specified constraint. As a side effect, - the constraint's Builder field is set to the - ConstraintBuilder owning this stack. - - The constraint to put onto the stack - - - - Pops this topmost constraint from the stack. - As a side effect, the constraint's Builder - field is set to null. - - The topmost contraint on the stack - - - - Initializes a new instance of the class. - - - - - Appends the specified operator to the expression by first - reducing the operator stack and then pushing the new - operator on the stack. - - The operator to push. - - - - Appends the specified constraint to the expression by pushing - it on the constraint stack. - - The constraint to push. - - - - Sets the top operator right context. - - The right context. - - - - Reduces the operator stack until the topmost item - precedence is greater than or equal to the target precedence. - - The target precedence. - - - - Resolves this instance, returning a Constraint. If the Builder - is not currently in a resolvable state, an exception is thrown. - - The resolved constraint - - - - Gets a value indicating whether this instance is resolvable. - - - true if this instance is resolvable; otherwise, false. - - - - - ConstraintExpression represents a compound constraint in the - process of being constructed from a series of syntactic elements. - - Individual elements are appended to the expression as they are - reorganized. When a constraint is appended, it is returned as the - value of the operation so that modifiers may be applied. However, - any partially built expression is attached to the constraint for - later resolution. When an operator is appended, the partial - expression is returned. If it's a self-resolving operator, then - a ResolvableConstraintExpression is returned. - - - - - The ConstraintBuilder holding the elements recognized so far - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the - class passing in a ConstraintBuilder, which may be pre-populated. - - The builder. - - - - Returns a string representation of the expression as it - currently stands. This should only be used for testing, - since it has the side-effect of resolving the expression. - - - - - - Appends an operator to the expression and returns the - resulting expression itself. - - - - - Appends a self-resolving operator to the expression and - returns a new ResolvableConstraintExpression. - - - - - Appends a constraint to the expression and returns that - constraint, which is associated with the current state - of the expression being built. Note that the constraint - is not reduced at this time. For example, if there - is a NotOperator on the stack we don't reduce and - return a NotConstraint. The original constraint must - be returned because it may support modifiers that - are yet to be applied. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - With is currently a NOP - reserved for future use. - - - - - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. - - - - - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests whether an object graph is serializable in binary format. - - - - - Returns a constraint that tests whether an object graph is serializable in xml format. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the a subpath of the expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the actual value falls - within a specified range. - - - - - Returns a constraint that succeeds if the value - is a file or directory and it exists. - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests whether an object graph is serializable in binary format. - - - - - Returns a constraint that tests whether an object graph is serializable in xml format. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that fails if the actual - value matches the pattern supplied as an argument. - - - - - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is a subpath of the expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the actual value falls - within a specified range. - - - - - ContainsConstraint tests a whether a string contains a substring - or a collection contains an object. It postpones the decision of - which test to use until the type of the actual argument is known. - This allows testing whether a string is contained in a collection - or as a substring of another string using the same syntax. - - - - - Initializes a new instance of the class. - - The _expected. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Flag the constraint to ignore case and return self. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Applies a delay to the match so that a match can be evaluated in the future. - - - - - Creates a new DelayedConstraint - - The inner constraint to decorate - The time interval after which the match is performed - If the value of is less than 0 - - - - Creates a new DelayedConstraint - - The inner constraint to decorate - The time interval after which the match is performed, in milliseconds - The time interval used for polling, in milliseconds - If the value of is less than 0 - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for if the base constraint fails, false if it succeeds - - - - Test whether the constraint is satisfied by a delegate - - The delegate whose value is to be tested - A ConstraintResult - - - - Test whether the constraint is satisfied by a given reference. - Overridden to wait for the specified delay period before - calling the base constraint with the dereferenced value. - - A reference to the value to be tested - True for success, false for failure - - - - Returns the string representation of the constraint. - - - - - Adjusts a Timestamp by a given TimeSpan - - - - - - - - Returns the difference between two Timestamps as a TimeSpan - - - - - - - - DictionaryContainsKeyConstraint is used to test whether a dictionary - contains an expected object as a key. - - - - - Construct a DictionaryContainsKeyConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the expected key is contained in the dictionary - - - - - EmptyCollectionConstraint tests whether a collection is empty. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Check that the collection is empty - - - - - - - EmptyConstraint tests a whether a string or collection is empty, - postponing the decision about which test is applied until the - type of the actual argument is known. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - EmptyDirectoryConstraint is used to test that a directory is empty - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - EmptyStringConstraint tests whether a string is empty. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - EndsWithConstraint can test whether a string ends - with an expected substring. - - - - - Initializes a new instance of the class. - - The expected string - - - - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. - - - - - - - EqualConstraint is able to compare an actual value with the - expected value provided in its constructor. Two objects are - considered equal if both are null, or if both have the same - value. NUnit has special semantics for some object types. - - - - - NUnitEqualityComparer used to test equality. - - - - - Initializes a new instance of the class. - - The expected value. - - - - Gets the tolerance for this comparison. - - - The tolerance. - - - - - Gets a value indicating whether to compare case insensitive. - - - true if comparing case insensitive; otherwise, false. - - - - - Gets a value indicating whether or not to clip strings. - - - true if set to clip strings otherwise, false. - - - - - Gets the failure points. - - - The failure points. - - - - - Flag the constraint to ignore case and return self. - - - - - Flag the constraint to suppress string clipping - and return self. - - - - - Flag the constraint to compare arrays as collections - and return self. - - - - - Flag the constraint to use a tolerance when determining equality. - - Tolerance value to be used - Self. - - - - Flags the constraint to include - property in comparison of two values. - - - Using this modifier does not allow to use the - constraint modifier. - - - - - Switches the .Within() modifier to interpret its tolerance as - a distance in representable _values (see remarks). - - Self. - - Ulp stands for "unit in the last place" and describes the minimum - amount a given value can change. For any integers, an ulp is 1 whole - digit. For floating point _values, the accuracy of which is better - for smaller numbers and worse for larger numbers, an ulp depends - on the size of the number. Using ulps for comparison of floating - point results instead of fixed tolerances is safer because it will - automatically compensate for the added inaccuracy of larger numbers. - - - - - Switches the .Within() modifier to interpret its tolerance as - a percentage that the actual _values is allowed to deviate from - the expected value. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in days. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in hours. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in minutes. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in seconds. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in milliseconds. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in clock ticks. - - Self - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied Comparison object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - EqualityAdapter class handles all equality comparisons - that use an , - or a . - - - - - Compares two objects, returning true if they are equal - - - - - Returns true if the two objects can be compared by this adapter. - The base adapter cannot handle IEnumerables except for strings. - - - - - Returns an that wraps an . - - - - - that wraps an . - - - - - Returns an that wraps an . - - - - - Returns true if the two objects can be compared by this adapter. - Generic adapter requires objects of the specified type. - - - - - Returns an that wraps an . - - - - - Returns an that wraps an . - - - - - that wraps an . - - - - - Returns an that wraps a . - - - - - ExactTypeConstraint is used to test that an object - is of the exact type provided in the constructor - - - - - Construct an ExactTypeConstraint for a given Type - - The expected Type. - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - FalseConstraint tests that the actual value is false - - - - - Initializes a new instance of the class. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - Helper routines for working with floating point numbers - - - The floating point comparison code is based on this excellent article: - http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm - - - "ULP" means Unit in the Last Place and in the context of this library refers to - the distance between two adjacent floating point numbers. IEEE floating point - numbers can only represent a finite subset of natural numbers, with greater - accuracy for smaller numbers and lower accuracy for very large numbers. - - - If a comparison is allowed "2 ulps" of deviation, that means the _values are - allowed to deviate by up to 2 adjacent floating point _values, which might be - as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. - - - - - Union of a floating point variable and an integer - - - The union's value as a floating point variable - - - The union's value as an integer - - - The union's value as an unsigned integer - - - Union of a double precision floating point variable and a long - - - The union's value as a double precision floating point variable - - - The union's value as a long - - - The union's value as an unsigned long - - - Compares two floating point _values for equality - First floating point value to be compared - Second floating point value t be compared - - Maximum number of representable floating point _values that are allowed to - be between the left and the right floating point _values - - True if both numbers are equal or close to being equal - - - Floating point _values can only represent a finite subset of natural numbers. - For example, the _values 2.00000000 and 2.00000024 can be stored in a float, - but nothing inbetween them. - - - This comparison will count how many possible floating point _values are between - the left and the right number. If the number of possible _values between both - numbers is less than or equal to maxUlps, then the numbers are considered as - being equal. - - - Implementation partially follows the code outlined here: - http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ - - - - - Compares two double precision floating point _values for equality - First double precision floating point value to be compared - Second double precision floating point value t be compared - - Maximum number of representable double precision floating point _values that are - allowed to be between the left and the right double precision floating point _values - - True if both numbers are equal or close to being equal - - - Double precision floating point _values can only represent a limited series of - natural numbers. For example, the _values 2.0000000000000000 and 2.0000000000000004 - can be stored in a double, but nothing inbetween them. - - - This comparison will count how many possible double precision floating point - _values are between the left and the right number. If the number of possible - _values between both numbers is less than or equal to maxUlps, then the numbers - are considered as being equal. - - - Implementation partially follows the code outlined here: - http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ - - - - - - Reinterprets the memory contents of a floating point value as an integer value - - - Floating point value whose memory contents to reinterpret - - - The memory contents of the floating point value interpreted as an integer - - - - - Reinterprets the memory contents of a double precision floating point - value as an integer value - - - Double precision floating point value whose memory contents to reinterpret - - - The memory contents of the double precision floating point value - interpreted as an integer - - - - - Reinterprets the memory contents of an integer as a floating point value - - Integer value whose memory contents to reinterpret - - The memory contents of the integer value interpreted as a floating point value - - - - - Reinterprets the memory contents of an integer value as a double precision - floating point value - - Integer whose memory contents to reinterpret - - The memory contents of the integer interpreted as a double precision - floating point value - - - - - Tests whether a value is greater than the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Tests whether a value is greater than or equal to the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - ConstraintStatus represents the status of a ConstraintResult - returned by a Constraint being applied to an actual value. - - - - - The status has not yet been set - - - - - The constraint succeeded - - - - - The constraint failed - - - - - An error occured in applying the constraint (reserved for future use) - - - - - Contain the result of matching a against an actual value. - - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - The status of the new ConstraintResult. - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - If true, applies a status of Success to the result, otherwise Failure. - - - - The actual value that was passed to the method. - - - - - Gets and sets the ResultStatus for this result. - - - - - True if actual value meets the Constraint criteria otherwise false. - - - - - Display friendly name of the constraint. - - - - - Description of the constraint may be affected by the state the constraint had - when was performed against the actual value. - - - - - Write the failure message to the MessageWriter provided - as an argument. The default implementation simply passes - the result and the actual value to the writer, which - then displays the constraint description and the value. - - Constraints that need to provide additional details, - such as where the error occured can override this. - - The MessageWriter on which to display the message - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - InstanceOfTypeConstraint is used to test that an object - is of the same type provided or derived from it. - - - - - Construct an InstanceOfTypeConstraint for the type provided - - The expected Type - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - The IResolveConstraint interface is implemented by all - complete and resolvable constraints and expressions. - - - - - Return the top-level constraint for this expression - - - - - - Tests whether a value is less than the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Tests whether a value is less than or equal to the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - MessageWriter is the abstract base for classes that write - constraint descriptions and messages in some form. The - class has separate methods for writing various components - of a message, allowing implementations to tailor the - presentation as needed. - - - - - Construct a MessageWriter given a culture - - - - - Abstract method to get the max line length - - - - - Method to write single line message with optional args, usually - written to precede the general failure message. - - The message to be written - Any arguments used in formatting the message - - - - Method to write single line message with optional args, usually - written to precede the general failure message, at a givel - indentation level. - - The indentation level of the message - The message to be written - Any arguments used in formatting the message - - - - Display Expected and Actual lines for a constraint. This - is called by MessageWriter's default implementation of - WriteMessageTo and provides the generic two-line display. - - The failing constraint result - - - - Display Expected and Actual lines for given _values. This - method may be called by constraints that need more control over - the display of actual and expected _values than is provided - by the default implementation. - - The expected value - The actual value causing the failure - - - - Display Expected and Actual lines for given _values, including - a tolerance value on the Expected line. - - The expected value - The actual value causing the failure - The tolerance within which the test was made - - - - Display the expected and actual string _values on separate lines. - If the mismatch parameter is >=0, an additional line is displayed - line containing a caret that points to the mismatch point. - - The expected string value - The actual string value - The point at which the strings don't match or -1 - If true, case is ignored in locating the point where the strings differ - If true, the strings should be clipped to fit the line - - - - Writes the text for an actual value. - - The actual value. - - - - Writes the text for a generalized value. - - The value. - - - - Writes the text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Static methods used in creating messages - - - - - Static string used when strings are clipped - - - - - Formatting strings used for expected and actual _values - - - - - Formats text to represent a generalized value. - - The value - The formatted text - - - - Formats text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Returns the representation of a type as used in NUnitLite. - This is the same as Type.ToString() except for arrays, - which are displayed with their declared sizes. - - - - - - - Converts any control characters in a string - to their escaped representation. - - The string to be converted - The converted string - - - - Return the a string representation for a set of indices into an array - - Array of indices for which a string is needed - - - - Get an array of indices representing the point in a collection or - array corresponding to a single int index into the collection. - - The collection to which the indices apply - Index in the collection - Array of indices - - - - Clip a string to a given length, starting at a particular offset, returning the clipped - string with ellipses representing the removed parts - - The string to be clipped - The maximum permitted length of the result string - The point at which to start clipping - The clipped string - - - - Clip the expected and actual strings in a coordinated fashion, - so that they may be displayed together. - - - - - - - - - Shows the position two strings start to differ. Comparison - starts at the start index. - - The expected string - The actual string - The index in the strings at which comparison should start - Boolean indicating whether case should be ignored - -1 if no mismatch found, or the index where mismatch found - - - - NaNConstraint tests that the actual value is a double or float NaN - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test that the actual value is an NaN - - - - - - - NoItemConstraint applies another constraint to each - item in a collection, failing if any of them succeeds. - - - - - Construct a SomeItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - failing if any item fails. - - - - - - - NotConstraint negates the effect of some other constraint - - - - - Initializes a new instance of the class. - - The base constraint to be negated. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for if the base constraint fails, false if it succeeds - - - - NullConstraint tests that the actual value is null - - - - - Initializes a new instance of the class. - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - The Numerics class contains common operations on numeric _values. - - - - - Checks the type of the object, returning true if - the object is a numeric type. - - The object to check - true if the object is a numeric type - - - - Checks the type of the object, returning true if - the object is a floating point numeric type. - - The object to check - true if the object is a floating point numeric type - - - - Checks the type of the object, returning true if - the object is a fixed point numeric type. - - The object to check - true if the object is a fixed point numeric type - - - - Test two numeric _values for equality, performing the usual numeric - conversions and using a provided or default tolerance. If the tolerance - provided is Empty, this method may set it to a default tolerance. - - The expected value - The actual value - A reference to the tolerance in effect - True if the _values are equal - - - - Compare two numeric _values, performing the usual numeric conversions. - - The expected value - The actual value - The relationship of the _values to each other - - - - NUnitComparer encapsulates NUnit's default behavior - in comparing two objects. - - - - - Returns the default NUnitComparer. - - - - - Compares two objects - - - - - - - - NUnitEqualityComparer encapsulates NUnit's handling of - equality tests between objects. - - - - - If true, all string comparisons will ignore case - - - - - If true, arrays will be treated as collections, allowing - those of different dimensions to be compared - - - - - Comparison objects used in comparisons for some constraints. - - - - - List of points at which a failure occurred. - - - - - Returns the default NUnitEqualityComparer - - - - - Gets and sets a flag indicating whether case should - be ignored in determining equality. - - - - - Gets and sets a flag indicating that arrays should be - compared as collections, without regard to their shape. - - - - - Gets the list of external comparers to be used to - test for equality. They are applied to members of - collections, in place of NUnit's own logic. - - - - - Gets the list of failure points for the last Match performed. - The list consists of objects to be interpreted by the caller. - This generally means that the caller may only make use of - objects it has placed on the list at a particular depthy. - - - - - Flags the comparer to include - property in comparison of two values. - - - Using this modifier does not allow to use the - modifier. - - - - - Compares two objects for equality within a tolerance. - - - - - Helper method to compare two arrays - - - - - Method to compare two DirectoryInfo objects - - first directory to compare - second directory to compare - true if equivalent, false if not - - - - FailurePoint class represents one point of failure - in an equality test. - - - - - The location of the failure - - - - - The expected value - - - - - The actual value - - - - - Indicates whether the expected value is valid - - - - - Indicates whether the actual value is valid - - - - - Operator that requires both it's arguments to succeed - - - - - Construct an AndOperator - - - - - Apply the operator to produce an AndConstraint - - - - - Operator that tests for the presence of a particular attribute - on a type and optionally applies further tests to the attribute. - - - - - Construct an AttributeOperator for a particular Type - - The Type of attribute tested - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - Abstract base class for all binary operators - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Gets the left precedence of the operator - - - - - Gets the right precedence of the operator - - - - - Abstract method that produces a constraint by applying - the operator to its left and right constraint arguments. - - - - - Abstract base for operators that indicate how to - apply a constraint to items in a collection. - - - - - Constructs a CollectionOperator - - - - - The ConstraintOperator class is used internally by a - ConstraintBuilder to represent an operator that - modifies or combines constraints. - - Constraint operators use left and right precedence - _values to determine whether the top operator on the - stack should be reduced before pushing a new operator. - - - - - The precedence value used when the operator - is about to be pushed to the stack. - - - - - The precedence value used when the operator - is on the top of the stack. - - - - - The syntax element preceding this operator - - - - - The syntax element following this operator - - - - - The precedence value used when the operator - is about to be pushed to the stack. - - - - - The precedence value used when the operator - is on the top of the stack. - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Negates the test of the constraint it wraps. - - - - - Constructs a new NotOperator - - - - - Returns a NotConstraint applied to its argument. - - - - - Operator that requires at least one of it's arguments to succeed - - - - - Construct an OrOperator - - - - - Apply the operator to produce an OrConstraint - - - - - PrefixOperator takes a single constraint and modifies - it's action in some way. - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Returns the constraint created by applying this - prefix to another constraint. - - - - - - - Operator used to test for the presence of a named Property - on an object and optionally apply further tests to the - value of that property. - - - - - Gets the name of the property to which the operator applies - - - - - Constructs a PropOperator for a particular named property - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Abstract base class for operators that are able to reduce to a - constraint whether or not another syntactic element follows. - - - - - Operator that tests that an exception is thrown and - optionally applies further tests to the exception. - - - - - Construct a ThrowsOperator - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - Represents a constraint that simply wraps the - constraint provided as an argument, without any - further functionality, but which modifies the - order of evaluation because of its precedence. - - - - - Constructor for the WithOperator - - - - - Returns a constraint that wraps its argument - - - - - OrConstraint succeeds if either member succeeds - - - - - Create an OrConstraint from two other constraints - - The first constraint - The second constraint - - - - Gets text describing a constraint - - - - - Apply the member constraints to an actual value, succeeding - succeeding as soon as one of them succeeds. - - The actual value - True if either constraint succeeded - - - - PathConstraint serves as the abstract base of constraints - that operate on paths and provides several helper methods. - - - - - Construct a PathConstraint for a give expected path - - The expected path - - - - Modifies the current instance to be case-sensitive - and returns it. - - - - - Returns the string representation of this constraint - - - - - Canonicalize the provided path - - - The path in standardized form - - - - Test whether one path in canonical form is a subpath of another path - - The first path - supposed to be the parent path - The second path - supposed to be the child path - - - - - Predicate constraint wraps a Predicate in a constraint, - returning success if the predicate is true. - - - - - Construct a PredicateConstraint from a predicate - - - - - Gets text describing a constraint - - - - - Determines whether the predicate succeeds when applied - to the actual value. - - - - - Abstract base class used for prefixes - - - - - The base constraint - - - - - Prefix used in forming the constraint description - - - - - Construct given a base constraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - PropertyConstraint extracts a named property and uses - its value as the actual value for a chained constraint. - - - - - Initializes a new instance of the class. - - The name. - The constraint to apply to the property. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Returns the string representation of the constraint. - - - - - - PropertyExistsConstraint tests that a named property - exists on the object provided through Match. - - Originally, PropertyConstraint provided this feature - in addition to making optional tests on the value - of the property. The two constraints are now separate. - - - - - Initializes a new instance of the class. - - The name of the property. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the property exists for a given object - - The object to be tested - True for success, false for failure - - - - Returns the string representation of the constraint. - - - - - - RangeConstraint tests whether two _values are within a - specified range. - - - - - Initializes a new instance of the class. - - from must be less than or equal to true - Inclusive beginning of the range. Must be less than or equal to to. - Inclusive end of the range. Must be greater than or equal to from. - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use a and returns self. - - - - - RegexConstraint can test whether a string matches - the pattern provided. - - - - - Initializes a new instance of the class. - - The pattern. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - ResolvableConstraintExpression is used to represent a compound - constraint being constructed at a point where the last operator - may either terminate the expression or may have additional - qualifying constraints added to it. - - It is used, for example, for a Property element or for - an Exception element, either of which may be optionally - followed by constraints that apply to the property or - exception. - - - - - Create a new instance of ResolvableConstraintExpression - - - - - Create a new instance of ResolvableConstraintExpression, - passing in a pre-populated ConstraintBuilder. - - - - - Appends an And Operator to the expression - - - - - Appends an Or operator to the expression. - - - - - Resolve the current expression to a Constraint - - - - - ReusableConstraint wraps a constraint expression after - resolving it so that it can be reused consistently. - - - - - Construct a ReusableConstraint from a constraint expression - - The expression to be resolved and reused - - - - Converts a constraint to a ReusableConstraint - - The constraint to be converted - A ReusableConstraint - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Return the top-level constraint for this expression - - - - - - SameAsConstraint tests whether an object is identical to - the object passed to its constructor - - - - - Initializes a new instance of the class. - - The expected object. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Summary description for SamePathConstraint. - - - - - Initializes a new instance of the class. - - The expected path - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - SamePathOrUnderConstraint tests that one path is under another - - - - - Initializes a new instance of the class. - - The expected path - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - SomeItemsConstraint applies another constraint to each - item in a collection, succeeding if any of them succeeds. - - - - - Construct a SomeItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - succeeding if any item succeeds. - - - - - - - StartsWithConstraint can test whether a string starts - with an expected substring. - - - - - Initializes a new instance of the class. - - The expected string - - - - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. - - - - - - - StringConstraint is the abstract base for constraints - that operate on strings. It supports the IgnoreCase - modifier for string operations. - - - - - The expected value - - - - - Indicates whether tests should be case-insensitive - - - - - Description of this constraint - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Constructs a StringConstraint without an expected value - - - - - Constructs a StringConstraint given an expected value - - The expected value - - - - Modify the constraint to ignore case in matching. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Test whether the constraint is satisfied by a given string - - The string to be tested - True for success, false for failure - - - - SubstringConstraint can test whether a string contains - the expected substring. - - - - - Initializes a new instance of the class. - - The expected. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - ThrowsConstraint is used to test the exception thrown by - a delegate by applying a constraint to it. - - - - - Initializes a new instance of the class, - using a constraint to be applied to the exception. - - A constraint to apply to the caught exception. - - - - Get the actual exception thrown - used by Assert.Throws. - - - - - Gets text describing a constraint - - - - - Executes the code of the delegate and captures any exception. - If a non-null base constraint was provided, it applies that - constraint to the exception. - - A delegate representing the code to be tested - True if an exception is thrown and the constraint succeeds, otherwise false - - - - Converts an ActualValueDelegate to a TestDelegate - before calling the primary overload. - - - - - - - Write the actual value for a failing constraint test to a - MessageWriter. This override only handles the special message - used when an exception is expected but none is thrown. - - The writer on which the actual value is displayed - - - - ThrowsNothingConstraint tests that a delegate does not - throw an exception. - - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True if no exception is thrown, otherwise false - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - The Tolerance class generalizes the notion of a tolerance - within which an equality test succeeds. Normally, it is - used with numeric types, but it can be used with any - type that supports taking a difference between two - objects and comparing that difference to a value. - - - - - Returns a default Tolerance object, equivalent to - specifying an exact match unless - is set, in which case, the - will be used. - - - - - Returns an empty Tolerance object, equivalent to - specifying an exact match even if - is set. - - - - - Constructs a linear tolerance of a specified amount - - - - - Constructs a tolerance given an amount and - - - - - Gets the for the current Tolerance - - - - - Tests that the current Tolerance is linear with a - numeric value, throwing an exception if it is not. - - - - - Gets the value of the current Tolerance instance. - - - - - Returns a new tolerance, using the current amount as a percentage. - - - - - Returns a new tolerance, using the current amount in Ulps - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of days. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of hours. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of minutes. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of seconds. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of milliseconds. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of clock ticks. - - - - - Returns true if the current tolerance has not been set or is using the . - - - - - Modes in which the tolerance value for a comparison can be interpreted. - - - - - The tolerance was created with a value, without specifying - how the value would be used. This is used to prevent setting - the mode more than once and is generally changed to Linear - upon execution of the test. - - - - - The tolerance is used as a numeric range within which - two compared _values are considered to be equal. - - - - - Interprets the tolerance as the percentage by which - the two compared _values my deviate from each other. - - - - - Compares two _values based in their distance in - representable numbers. - - - - - TrueConstraint tests that the actual value is true - - - - - Initializes a new instance of the class. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - TypeConstraint is the abstract base for constraints - that take a Type as their expected value. - - - - - The expected Type used by the constraint - - - - - The type of the actual argument to which the constraint was applied - - - - - Construct a TypeConstraint for a given Type - - The expected type for the constraint - Prefix used in forming the constraint description - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - UniqueItemsConstraint tests whether all the items in a - collection are unique. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Check that all items are unique. - - - - - - - XmlSerializableConstraint tests whether - an object is serializable in xml format. - - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Returns the string representation of this constraint - - - - - ExactCountConstraint applies another constraint to each - item in a collection, succeeding only if a specified - number of items succeed. - - - - - Construct an ExactCountConstraint on top of an existing constraint - - - - - - - Apply the item constraint to each item in the collection, - succeeding only if the expected number of items pass. - - - - - - - Represents a constraint that succeeds if the specified - count of members of a collection match a base constraint. - - - - - Construct an ExactCountOperator for a specified count - - The expected count - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. - - - - - ExceptionTypeConstraint is a special version of ExactTypeConstraint - used to provided detailed info about the exception thrown in - an error message. - - - - - Constructs an ExceptionTypeConstraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - The Assert class contains a collection of static methods that - implement the most common assertions used in NUnit. - - - - - Verifies that a delegate throws a particular exception when called. - - A constraint to be satisfied by the exception - A TestSnippet delegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - A constraint to be satisfied by the exception - A TestSnippet delegate - - - - Verifies that a delegate throws a particular exception when called. - - The exception Type expected - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - The exception Type expected - A TestDelegate - - - - Verifies that a delegate throws a particular exception when called. - - Type of the expected exception - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - Type of the expected exception - A TestDelegate - - - - Verifies that a delegate throws an exception when called - and returns it. - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception when called - and returns it. - - A TestDelegate - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - A TestDelegate - - - - Verifies that a delegate does not throw an exception - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate does not throw an exception. - - A TestDelegate - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - - - - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. - - The value that is expected - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. - - The value that is expected - The actual value - - - - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. - - The value that is expected - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. - - The value that is expected - The actual value - - - - Asserts that two objects refer to the same object. If they - are not the same an is thrown. - - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that two objects refer to the same object. If they - are not the same an is thrown. - - The expected object - The actual object - - - - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. - - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. - - The expected object - The actual object - - - - Helper for Assert.AreEqual(double expected, double actual, ...) - allowing code generation to work consistently. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - Used as a synonym for That in rare cases where a private setter - causes a Visual Basic compilation error. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - Used as a synonym for That in rare cases where a private setter - causes a Visual Basic compilation error. - - - This method is provided for use by VB developers needing to test - the value of properties with private setters. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that the first int is greater than the second - int. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first int is greater than the second - int. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - - - - Assert that a string is empty - that is equal to string.Empty - - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that a string is empty - that is equal to string.Empty - - The string to be tested - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing ICollection - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing ICollection - - - - Assert that a string is not empty - that is not equal to string.Empty - - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that a string is not empty - that is not equal to string.Empty - - The string to be tested - - - - Assert that an array, list or other collection is not empty - - An array, list or other collection implementing ICollection - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that an array, list or other collection is not empty - - An array, list or other collection implementing ICollection - - - - We don't actually want any instances of this object, but some people - like to inherit from it to add other static methods. Hence, the - protected constructor disallows any instances of this object. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - The message to initialize the with. - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - - - - Throws an with the message and arguments - that are passed in. This is used by the other Assert functions. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This is used by the other Assert functions. - - The message to initialize the with. - - - - Throws an . - This is used by the other Assert functions. - - - - - Throws an with the message and arguments - that are passed in. This causes the test to be reported as ignored. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This causes the test to be reported as ignored. - - The message to initialize the with. - - - - Throws an . - This causes the test to be reported as ignored. - - - - - Throws an with the message and arguments - that are passed in. This causes the test to be reported as inconclusive. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This causes the test to be reported as inconclusive. - - The message to initialize the with. - - - - Throws an . - This causes the test to be reported as Inconclusive. - - - - - Asserts that an object is contained in a list. - - The expected object - The list to be examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is contained in a list. - - The expected object - The list to be examined - - - - Any ITest that implements this interface is at a level that the implementing - class should be disposed at the end of the test run - - - - - The IMethodInfo class is used to encapsulate information - about a method in a platform-independent manner. - - - - - Gets the Type from which this method was reflected. - - - - - Gets the MethodInfo for this method. - - - - - Gets the name of the method. - - - - - Gets a value indicating whether the method is abstract. - - - - - Gets a value indicating whether the method is public. - - - - - Gets a value indicating whether the method contains unassigned generic type parameters. - - - - - Gets a value indicating whether the method is a generic method. - - - - - Gets a value indicating whether the MethodInfo represents the definition of a generic method. - - - - - Gets the return Type of the method. - - - - - Gets the parameters of the method. - - - - - - Returns the Type arguments of a generic method or the Type parameters of a generic method definition. - - - - - Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. - - The type arguments to be used - A new IMethodInfo with the type arguments replaced - - - - Invokes the method, converting any TargetInvocationException to an NUnitException. - - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - The IParameterInfo interface is an abstraction of a .NET parameter. - - - - - Gets a value indicating whether the parameter is optional - - - - - Gets an IMethodInfo representing the method for which this is a parameter - - - - - Gets the underlying .NET ParameterInfo - - - - - Gets the Type of the parameter - - - - - The IReflectionInfo interface is implemented by NUnit wrapper objects that perform reflection. - - - - - Returns an array of custom attributes of the specified type applied to this object - - - - - Returns a value indicating whether an attribute of the specified type is defined on this object. - - - - - The ITypeInfo interface is an abstraction of a .NET Type - - - - - Gets the underlying Type on which this ITypeInfo is based - - - - - Gets the base type of this type as an ITypeInfo - - - - - Returns true if the Type wrapped is equal to the argument - - - - - Gets the Name of the Type - - - - - Gets the FullName of the Type - - - - - Gets the assembly in which the type is declared - - - - - Gets the Namespace of the Type - - - - - Gets a value indicating whether the type is abstract. - - - - - Gets a value indicating whether the Type is a generic Type - - - - - Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. - - - - - Gets a value indicating whether the Type is a generic Type definition - - - - - Gets a value indicating whether the type is sealed. - - - - - Gets a value indicating whether this type is a static class. - - - - - Get the display name for this typeInfo. - - - - - Get the display name for an oject of this type, constructed with specific arguments - - - - - Returns a Type representing a generic type definition from which this Type can be constructed. - - - - - Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments - - - - - Returns a value indicating whether this type has a method with a specified public attribute - - - - - Returns an array of IMethodInfos for methods of this Type - that match the specified flags. - - - - - Returns a value indicating whether this Type has a public constructor taking the specified argument Types. - - - - - Construct an object of this Type, using the specified arguments. - - - - - CombiningStrategy is the abstract base for classes that - know how to combine values provided for individual test - parameters to create a set of test cases. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - The ISimpleTestBuilder interface is exposed by a class that knows how to - build a single TestMethod from a suitable MethodInfo Types. In general, - it is exposed by an attribute, but may be implemented in a helper class - used by the attribute in some cases. - - - - - Build a TestMethod from the provided MethodInfo. - - The method to be used as a test - The TestSuite to which the method will be added - A TestMethod object - - - - The ITestBuilder interface is exposed by a class that knows how to - build one or more TestMethods from a MethodInfo. In general, it is exposed - by an attribute, which has additional information available to provide - the necessary test parameters to distinguish the test cases built. - - - - - Build one or more TestMethods from the provided MethodInfo. - - The method to be used as a test - The TestSuite to which the method will be added - A TestMethod object - - - - The IDataPointProvider interface is used by extensions - that provide data for a single test parameter. - - - - - Determine whether any data is available for a parameter. - - An IParameterInfo representing one - argument to a parameterized test - True if any data is available, otherwise false. - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - An IEnumerable providing the required data - - - - The IParameterDataSource interface is implemented by types - that can provide data for a test method parameter. - - - - - Gets an enumeration of data items for use as arguments - for a test method parameter. - - The parameter for which data is needed - An enumeration containing individual data items - - - - A PropertyBag represents a collection of name/value pairs - that allows duplicate entries with the same key. Methods - are provided for adding a new pair as well as for setting - a key to a single value. All keys are strings but _values - may be of any type. Null _values are not permitted, since - a null entry represents the absence of the key. - - The entries in a PropertyBag are of two kinds: those that - take a single value and those that take multiple _values. - However, the PropertyBag has no knowledge of which entries - fall into each category and the distinction is entirely - up to the code using the PropertyBag. - - When working with multi-valued properties, client code - should use the Add method to add name/value pairs and - indexing to retrieve a list of all _values for a given - key. For example: - - bag.Add("Tag", "one"); - bag.Add("Tag", "two"); - Assert.That(bag["Tag"], - Is.EqualTo(new string[] { "one", "two" })); - - When working with single-valued propeties, client code - should use the Set method to set the value and Get to - retrieve the value. The GetSetting methods may also be - used to retrieve the value in a type-safe manner while - also providing default. For example: - - bag.Set("Priority", "low"); - bag.Set("Priority", "high"); // replaces value - Assert.That(bag.Get("Priority"), - Is.EqualTo("high")); - Assert.That(bag.GetSetting("Priority", "low"), - Is.EqualTo("high")); - - - - - Adds a key/value pair to the property bag - - The key - The value - - - - Sets the value for a key, removing any other - _values that are already in the property set. - - - - - - - Gets a single value for a key, using the first - one if multiple _values are present and returning - null if the value is not found. - - - - - Gets a flag indicating whether the specified key has - any entries in the property set. - - The key to be checked - True if their are _values present, otherwise false - - - - Gets or sets the list of _values for a particular key - - The key for which the _values are to be retrieved or set - - - - Gets a collection containing all the keys in the property set - - - - - Common interface supported by all representations - of a test. Only includes informational fields. - The Run method is specifically excluded to allow - for data-only representations of a test. - - - - - Gets the id of the test - - - - - Gets the name of the test - - - - - Gets the fully qualified name of the test - - - - - Gets the name of the class containing this test. Returns - null if the test is not associated with a class. - - - - - Gets the name of the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the Type of the test fixture, if applicable, or - null if no fixture type is associated with this test. - - - - - Gets an IMethod for the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the RunState of the test, indicating whether it can be run. - - - - - Count of the test cases ( 1 if this is a test case ) - - - - - Gets the properties of the test - - - - - Gets the parent test, if any. - - The parent test or null if none exists. - - - - Returns true if this is a test suite - - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets this test's child tests - - A list of child tests - - - - Gets a fixture object for running this test. - - - - - The ITestData interface is implemented by a class that - represents a single instance of a parameterized test. - - - - - Gets the name to be used for the test - - - - - Gets the RunState for this test case. - - - - - Gets the argument list to be provided to the test - - - - - Gets the property dictionary for the test case - - - - - The ITestCaseData interface is implemented by a class - that is able to return the data required to create an - instance of a parameterized test fixture. - - - - - Get the TypeArgs if separately set - - - - - The ITestCaseData interface is implemented by a class - that is able to return complete testcases for use by - a parameterized test method. - - - - - Gets the expected result of the test case - - - - - Returns true if an expected result has been set - - - - - Interface to be implemented by filters applied to tests. - The filter applies when running the test, after it has been - loaded, since this is the only time an ITest exists. - - - - - Determine if a particular test passes the filter criteria. Pass - may examine the parents and/or descendants of a test, depending - on the semantics of the particular filter - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - The ITestListener interface is used internally to receive - notifications of significant events while a test is being - run. The events are propagated to clients by means of an - AsyncCallback. NUnit extensions may also monitor these events. - - - - - Called when a test has just started - - The test that is starting - - - - Called when a test has finished - - The result of the test - - - - The ITestResult interface represents the result of a test. - - - - - Gets the ResultState of the test result, which - indicates the success or failure of the test. - - - - - Gets the name of the test result - - - - - Gets the full name of the test result - - - - - Gets the elapsed time for running the test in seconds - - - - - Gets or sets the time the test started running. - - - - - Gets or sets the time the test finished running. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. Not available in - the Compact Framework 1.0. - - - - - Gets the number of asserts executed - when running the test and all its children. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Indicates whether this result has any child results. - Accessing HasChildren should not force creation of the - Children collection in classes implementing this interface. - - - - - Gets the the collection of child results. - - - - - Gets the Test to which this result applies. - - - - - Gets any text output written to this result. - - - - - An object implementing IXmlNodeBuilder is able to build - an XML representation of itself and any children. - - - - - Returns a TNode representing the current object. - - If true, children are included where applicable - A TNode representing the result - - - - Returns a TNode representing the current object after - adding it as a child of the supplied parent node. - - The parent node. - If true, children are included, where applicable - - - - - The ResultState class represents the outcome of running a test. - It contains two pieces of information. The Status of the test - is an enum indicating whether the test passed, failed, was - skipped or was inconclusive. The Label provides a more - detailed breakdown for use by client runners. - - - - - Initializes a new instance of the class. - - The TestStatus. - - - - Initializes a new instance of the class. - - The TestStatus. - The label. - - - - Initializes a new instance of the class. - - The TestStatus. - The stage at which the result was produced - - - - Initializes a new instance of the class. - - The TestStatus. - The label. - The stage at which the result was produced - - - - The result is inconclusive - - - - - The test has been skipped. - - - - - The test has been ignored. - - - - - The test was skipped because it is explicit - - - - - The test succeeded - - - - - The test failed - - - - - The test encountered an unexpected exception - - - - - The test was cancelled by the user - - - - - The test was not runnable. - - - - - A suite failed because one or more child tests failed or had errors - - - - - A suite failed in its OneTimeSetUp - - - - - A suite had an unexpected exception in its OneTimeSetUp - - - - - A suite had an unexpected exception in its OneTimeDown - - - - - Gets the TestStatus for the test. - - The status. - - - - Gets the label under which this test result is - categorized, if any. - - - - - Gets the stage of test execution in which - the failure or other result took place. - - - - - Get a new ResultState, which is the same as the current - one but with the FailureSite set to the specified value. - - The FailureSite to use - A new ResultState - - - - Determines whether the specified , is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - The FailureSite enum indicates the stage of a test - in which an error or failure occurred. - - - - - Failure in the test itself - - - - - Failure in the SetUp method - - - - - Failure in the TearDown method - - - - - Failure of a parent test - - - - - Failure of a child test - - - - - The RunState enum indicates whether a test can be executed. - - - - - The test is not runnable. - - - - - The test is runnable. - - - - - The test can only be run explicitly - - - - - The test has been skipped. This value may - appear on a Test when certain attributes - are used to skip the test. - - - - - The test has been ignored. May appear on - a Test, when the IgnoreAttribute is used. - - - - - The TestStatus enum indicates the result of running a test - - - - - The test was inconclusive - - - - - The test has skipped - - - - - The test succeeded - - - - - The test failed - - - - - TNode represents a single node in the XML representation - of a Test or TestResult. It replaces System.Xml.XmlNode and - System.Xml.Linq.XElement, providing a minimal set of methods - for operating on the XML in a platform-independent manner. - - - - - Constructs a new instance of TNode - - The name of the node - - - - Constructs a new instance of TNode with a value - - The name of the node - The text content of the node - - - - Constructs a new instance of TNode with a value - - The name of the node - The text content of the node - Flag indicating whether to use CDATA when writing the text - - - - Gets the name of the node - - - - - Gets the value of the node - - - - - Gets a flag indicating whether the value should be output using CDATA. - - - - - Gets the dictionary of attributes - - - - - Gets a list of child nodes - - - - - Gets the first ChildNode - - - - - Gets the XML representation of this node. - - - - - Create a TNode from it's XML text representation - - The XML text to be parsed - A TNode - - - - Adds a new element as a child of the current node and returns it. - - The element name. - The newly created child element - - - - Adds a new element with a value as a child of the current node and returns it. - - The element name - The text content of the new element - The newly created child element - - - - Adds a new element with a value as a child of the current node and returns it. - The value will be output using a CDATA section. - - The element name - The text content of the new element - The newly created child element - - - - Adds an attribute with a specified name and value to the XmlNode. - - The name of the attribute. - The value of the attribute. - - - - Finds a single descendant of this node matching an xpath - specification. The format of the specification is - limited to what is needed by NUnit and its tests. - - - - - - - Finds all descendants of this node matching an xpath - specification. The format of the specification is - limited to what is needed by NUnit and its tests. - - - - - Writes the XML representation of the node to an XmlWriter - - - - - - Class used to represent a list of XmlResults - - - - - Class used to represent the attributes of a node - - - - - Gets or sets the value associated with the specified key. - Overridden to return null if attribute is not found. - - The key. - Value of the attribute or null - - - - The IFixtureBuilder interface is exposed by a class that knows how to - build a TestFixture from one or more Types. In general, it is exposed - by an attribute, but may be implemented in a helper class used by the - attribute in some cases. - - - - - Build one or more TestFixtures from type provided. At least one - non-null TestSuite must always be returned, since the method is - generally called because the user has marked the target class as - a fixture. If something prevents the fixture from being used, it - will be returned nonetheless, labelled as non-runnable. - - The type info of the fixture to be used. - A TestSuite object or one derived from TestSuite. - - - - IImplyFixture is an empty marker interface used by attributes like - TestAttribute that cause the class where they are used to be treated - as a TestFixture even without a TestFixtureAttribute. - - Marker interfaces are not usually considered a good practice, but - we use it here to avoid cluttering the attribute hierarchy with - classes that don't contain any extra implementation. - - - - - The IApplyToContext interface is implemented by attributes - that want to make changes to the execution context before - a test is run. - - - - - Apply changes to the execution context - - The execution context - - - - The IApplyToTest interface is implemented by self-applying - attributes that modify the state of a test in some way. - - - - - Modifies a test as defined for the specific attribute. - - The test to modify - - - - The ISuiteBuilder interface is exposed by a class that knows how to - build a suite from one or more Types. - - - - - Examine the type and determine if it is suitable for - this builder to use in building a TestSuite. - - Note that returning false will cause the type to be ignored - in loading the tests. If it is desired to load the suite - but label it as non-runnable, ignored, etc., then this - method must return true. - - The type of the fixture to be used - True if the type can be used to build a TestSuite - - - - Build a TestSuite from type provided. - - The type of the fixture to be used - A TestSuite - - - - The ITestCaseBuilder interface is exposed by a class that knows how to - build a test case from certain methods. - - - This interface is not the same as the ITestCaseBuilder interface in NUnit 2.x. - We have reused the name because the two products don't interoperate at all. - - - - - Examine the method and determine if it is suitable for - this builder to use in building a TestCase to be - included in the suite being populated. - - Note that returning false will cause the method to be ignored - in loading the tests. If it is desired to load the method - but label it as non-runnable, ignored, etc., then this - method must return true. - - The test method to examine - The suite being populated - True is the builder can use this method - - - - Build a TestCase from the provided MethodInfo for - inclusion in the suite being constructed. - - The method to be used as a test case - The test suite being populated, or null - A TestCase or null - - - - ICommandWrapper is implemented by attributes and other - objects able to wrap a TestCommand with another command. - - - Attributes or other objects should implement one of the - derived interfaces, rather than this one, since they - indicate in which part of the command chain the wrapper - should be applied. - - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - Objects implementing this interface are used to wrap - the TestMethodCommand itself. They apply after SetUp - has been run and before TearDown. - - - - - Objects implementing this interface are used to wrap - the entire test, including SetUp and TearDown. - - - - - The TestFixtureData class represents a set of arguments - and other parameter info to be used for a parameterized - fixture. It is derived from TestFixtureParameters and adds a - fluent syntax for use in initializing the fixture. - - - - - Initializes a new instance of the class. - - The arguments. - - - - Initializes a new instance of the class. - - The argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - The third argument. - - - - Marks the test fixture as explicit. - - - - - Marks the test fixture as explicit, specifying the reason. - - - - - Ignores this TestFixture, specifying the reason. - - The reason. - - - - - Asserts on Directories - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both point to the same directory. - If they are not equal an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - The message to display if the directories are not equal - Arguments to be used in formatting the message - - - - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both point to the same directory. - If they are not equal an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - - - - Asserts that two directories are not equal. If they are equal - an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that two directories are not equal. If they are equal - an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - - - - Asserts that the directory exists. If it does not exist - an is thrown. - - A directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory exists. If it does not exist - an is thrown. - - A directory containing the actual value - - - - Asserts that the directory exists. If it does not exist - an is thrown. - - The path to a directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory exists. If it does not exist - an is thrown. - - The path to a directory containing the actual value - - - - Asserts that the directory does not exist. If it does exist - an is thrown. - - A directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory does not exist. If it does exist - an is thrown. - - A directory containing the actual value - - - - Asserts that the directory does not exist. If it does exist - an is thrown. - - The path to a directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory does not exist. If it does exist - an is thrown. - - The path to a directory containing the actual value - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a constraint that succeeds if the value - is a file or directory and it exists. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Abstract base for Exceptions that terminate a test and provide a ResultState. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. - - - - - Executed before each test is run - - The test that is going to be run. - - - - Executed after each test is run - - The test that has just been run. - - - - Provides the target for the action attribute - - The target for the action attribute - - - - Delegate used by tests that execute code and - capture any thrown exception. - - - - - AssertionHelper is an optional base class for user tests, - allowing the use of shorter ids for constraints and - asserts and avoiding conflict with the definition of - , from which it inherits much of its - behavior, in certain mock object frameworks. - - - - - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to - . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to . - - The evaluated condition - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Returns a ListMapper based on a collection. - - The original collection - - - - - Provides static methods to express the assumptions - that must be met for a test to give a meaningful - result. If an assumption is not met, the test - should produce an inconclusive result. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the - method throws an . - - The evaluated condition - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Attribute used to apply a category to a test - - - - - The name of the category - - - - - Construct attribute for a given category based on - a name. The name may not contain the characters ',', - '+', '-' or '!'. However, this is not checked in the - constructor since it would cause an error to arise at - as the test was loaded without giving a clear indication - of where the problem is located. The error is handled - in NUnitFramework.cs by marking the test as not - runnable. - - The name of the category - - - - Protected constructor uses the Type name as the name - of the category. - - - - - The name of the category - - - - - Modifies a test by adding a category to it. - - The test to modify - - - - Marks a test to use a combinatorial join of any argument - data provided. Since this is the default, the attribute is - optional. - - - - - Default constructor - - - - - CultureAttribute is used to mark a test fixture or an - individual method as applying to a particular Culture only. - - - - - Constructor with no cultures specified, for use - with named property syntax. - - - - - Constructor taking one or more cultures - - Comma-deliminted list of cultures - - - - Causes a test to be skipped if this CultureAttribute is not satisfied. - - The test to modify - - - - Tests to determine if the current culture is supported - based on the properties of this attribute. - - True, if the current culture is supported - - - - Test to determine if the a particular culture or comma- - delimited set of cultures is in use. - - Name of the culture or comma-separated list of culture ids - True if the culture is in use on the system - - - - Test to determine if one of a collection of cultures - is being used currently. - - - - - - - The abstract base class for all data-providing attributes - defined by NUnit. Used to select all data sources for a - method, class or parameter. - - - - - Default constructor - - - - - Used to mark a field for use as a datapoint when executing a theory - within the same fixture that requires an argument of the field's Type. - - - - - Used to mark a field, property or method providing a set of datapoints to - be used in executing any theories within the same fixture that require an - argument of the Type provided. The data source may provide an array of - the required Type or an . - Synonymous with DatapointSourceAttribute. - - - - - Used to mark a field, property or method providing a set of datapoints to - be used in executing any theories within the same fixture that require an - argument of the Type provided. The data source may provide an array of - the required Type or an . - Synonymous with DatapointsAttribute. - - - - - Attribute used to provide descriptive text about a - test case or fixture. - - - - - Construct a description Attribute - - The text of the description - - - - ExplicitAttribute marks a test or test fixture so that it will - only be run if explicitly executed from the gui or command line - or if it is included by use of a filter. The test will not be - run simply because an enclosing suite is run. - - - - - Default constructor - - - - - Constructor with a reason - - The reason test is marked explicit - - - - Modifies a test by marking it as explicit. - - The test to modify - - - - Attribute used to mark a test that is to be ignored. - Ignored tests result in a warning message when the - tests are run. - - - - - Constructs the attribute giving a reason for ignoring the test - - The reason for ignoring the test - - - - The date in the future to stop ignoring the test as a string in UTC time. - For example for a date and time, "2014-12-25 08:10:00Z" or for just a date, - "2014-12-25". If just a date is given, the Ignore will expire at midnight UTC. - - - Once the ignore until date has passed, the test will be marked - as runnable. Tests with an ignore until date will have an IgnoreUntilDate - property set which will appear in the test results. - - The string does not contain a valid string representation of a date and time. - - - - Modifies a test by marking it as Ignored. - - The test to modify - - - - Abstract base for Attributes that are used to include tests - in the test run based on environmental settings. - - - - - Constructor with no included items specified, for use - with named property syntax. - - - - - Constructor taking one or more included items - - Comma-delimited list of included items - - - - Name of the item that is needed in order for - a test to run. Multiple items may be given, - separated by a comma. - - - - - Name of the item to be excluded. Multiple items - may be given, separated by a comma. - - - - - The reason for including or excluding the test - - - - - Summary description for MaxTimeAttribute. - - - - - Construct a MaxTimeAttribute, given a time in milliseconds. - - The maximum elapsed time in milliseconds - - - - The abstract base class for all custom attributes defined by NUnit. - - - - - Default constructor - - - - - Marks a test to use a pairwise join of any argument - data provided. Arguments will be combined in such a - way that all possible pairs of arguments are used. - - - - - Default constructor - - - - - PlatformAttribute is used to mark a test fixture or an - individual method as applying to a particular platform only. - - - - - Constructor with no platforms specified, for use - with named property syntax. - - - - - Constructor taking one or more platforms - - Comma-delimited list of platforms - - - - Causes a test to be skipped if this PlatformAttribute is not satisfied. - - The test to modify - - - - PropertyAttribute is used to attach information to a test as a name/value pair.. - - - - - Construct a PropertyAttribute with a name and string value - - The name of the property - The property value - - - - Construct a PropertyAttribute with a name and int value - - The name of the property - The property value - - - - Construct a PropertyAttribute with a name and double value - - The name of the property - The property value - - - - Constructor for derived classes that set the - property dictionary directly. - - - - - Constructor for use by derived classes that use the - name of the type as the property name. Derived classes - must ensure that the Type of the property value is - a standard type supported by the BCL. Any custom - types will cause a serialization Exception when - in the client. - - - - - Gets the property dictionary for this attribute - - - - - Modifies a test by adding properties to it. - - The test to modify - - - - RandomAttribute is used to supply a set of random _values - to a single parameter of a parameterized test. - - - - - Construct a random set of values appropriate for the Type of the - parameter on which the attribute appears, specifying only the count. - - - - - - Construct a set of ints within a specified range - - - - - Construct a set of unsigned ints within a specified range - - - - - Construct a set of longs within a specified range - - - - - Construct a set of unsigned longs within a specified range - - - - - Construct a set of shorts within a specified range - - - - - Construct a set of unsigned shorts within a specified range - - - - - Construct a set of doubles within a specified range - - - - - Construct a set of floats within a specified range - - - - - Construct a set of bytes within a specified range - - - - - Construct a set of sbytes within a specified range - - - - - Get the collection of _values to be used as arguments. - - - - - RangeAttribute is used to supply a range of _values to an - individual parameter of a parameterized test. - - - - - Construct a range of ints using default step of 1 - - - - - - - Construct a range of ints specifying the step size - - - - - - - - Construct a range of unsigned ints using default step of 1 - - - - - - - Construct a range of unsigned ints specifying the step size - - - - - - - - Construct a range of longs using a default step of 1 - - - - - - - Construct a range of longs - - - - - - - - Construct a range of unsigned longs using default step of 1 - - - - - - - Construct a range of unsigned longs specifying the step size - - - - - - - - Construct a range of doubles - - - - - - - - Construct a range of floats - - - - - - - - RepeatAttribute may be applied to test case in order - to run it multiple times. - - - - - Construct a RepeatAttribute - - The number of times to run the test - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - The test command for the RepeatAttribute - - - - - Initializes a new instance of the class. - - The inner command. - The number of repetitions - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - Marks a test that must run in the MTA, causing it - to run in a separate thread if necessary. - - On methods, you may also use MTAThreadAttribute - to serve the same purpose. - - - - - Construct a RequiresMTAAttribute - - - - - Marks a test that must run in the STA, causing it - to run in a separate thread if necessary. - - - - - Construct a RequiresSTAAttribute - - - - - Marks a test that must run on a separate thread. - - - - - Construct a RequiresThreadAttribute - - - - - Construct a RequiresThreadAttribute, specifying the apartment - - - - - Marks a test to use a Sequential join of any argument - data provided. Arguments will be combined into test cases, - taking the next value of each argument until all are used. - - - - - Default constructor - - - - - Summary description for SetCultureAttribute. - - - - - Construct given the name of a culture - - - - - - Summary description for SetUICultureAttribute. - - - - - Construct given the name of a culture - - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - SetUpFixtureAttribute is used to identify a SetUpFixture - - - - - Build a SetUpFixture from type provided. Normally called for a Type - on which the attribute has been placed. - - The type info of the fixture to be used. - A SetUpFixture object as a TestSuite. - - - - Attribute used to identify a method that is called - immediately after each test is run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Adding this attribute to a method within a - class makes the method callable from the NUnit test runner. There is a property - called Description which is optional which you can provide a more detailed test - description. This class cannot be inherited. - - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - public void TestDescriptionMethod() - {} - } - - - - - - Descriptive text for this test - - - - - The author of this test - - - - - The type that this test is testing - - - - - Modifies a test by adding a description, if not already set. - - The test to modify - - - - Gets or sets the expected result. - - The result. - - - - Returns true if an expected result has been set - - - - - Construct a TestMethod from a given method. - - The method for which a test is to be constructed. - The suite to which the test will be added. - A TestMethod - - - - TestCaseAttribute is used to mark parameterized test cases - and provide them with their arguments. - - - - - Construct a TestCaseAttribute with a list of arguments. - This constructor is not CLS-Compliant - - - - - - Construct a TestCaseAttribute with a single argument - - - - - - Construct a TestCaseAttribute with a two arguments - - - - - - - Construct a TestCaseAttribute with a three arguments - - - - - - - - Gets or sets the name of the test. - - The name of the test. - - - - Gets or sets the RunState of this test case. - - - - - Gets the list of arguments to a test case - - - - - Gets the properties of the test case - - - - - Gets or sets the expected result. - - The result. - - - - Returns true if the expected result has been set - - - - - Gets or sets the description. - - The description. - - - - The author of this test - - - - - The type that this test is testing - - - - - Gets or sets the reason for ignoring the test - - - - - Gets or sets a value indicating whether this is explicit. - - - true if explicit; otherwise, false. - - - - - Gets or sets the reason for not running the test. - - The reason. - - - - Gets or sets the ignore reason. When set to a non-null - non-empty value, the test is marked as ignored. - - The ignore reason. - - - - Comma-delimited list of platforms to run the test for - - - - - Comma-delimited list of platforms to not run the test for - - - - - Gets and sets the category for this test case. - May be a comma-separated list of categories. - - - - - Performs several special conversions allowed by NUnit in order to - permit arguments with types that cannot be used in the constructor - of an Attribute such as TestCaseAttribute or to simplify their use. - - The arguments to be converted - The ParameterInfo array for the method - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The MethodInfo for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - TestCaseSourceAttribute indicates the source to be used to - provide test cases for a test method. - - - - - Construct with the name of the method, property or field that will provide data - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - Construct with a Type - - The type that will provide data - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets or sets the category associated with every fixture created from - this attribute. May be a single category or a comma-separated list. - - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The IMethod for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - Returns a set of ITestCaseDataItems for use as arguments - to a parameterized test method. - - The method for which data is needed. - - - - - TestFixtureAttribute is used to mark a class that represents a TestFixture. - - - - - Default constructor - - - - - Construct with a object[] representing a set of arguments. - In .NET 2.0, the arguments may later be separated into - type arguments and constructor arguments. - - - - - - Gets or sets the name of the test. - - The name of the test. - - - - Gets or sets the RunState of this test fixture. - - - - - The arguments originally provided to the attribute - - - - - Properties pertaining to this fixture - - - - - Get or set the type arguments. If not set - explicitly, any leading arguments that are - Types are taken as type arguments. - - - - - Descriptive text for this fixture - - - - - The author of this fixture - - - - - The type that this fixture is testing - - - - - Gets or sets the ignore reason. May set RunState as a side effect. - - The ignore reason. - - - - Gets or sets the reason for not running the fixture. - - The reason. - - - - Gets or sets the ignore reason. When set to a non-null - non-empty value, the test is marked as ignored. - - The ignore reason. - - - - Gets or sets a value indicating whether this is explicit. - - - true if explicit; otherwise, false. - - - - - Gets and sets the category for this fixture. - May be a comma-separated list of categories. - - - - - Build a fixture from type provided. Normally called for a Type - on which the attribute has been placed. - - The type info of the fixture to be used. - A an IEnumerable holding one TestFixture object. - - - - Attribute used to identify a method that is - called before any tests in a fixture are run. - - - - - Attribute used to identify a method that is called after - all the tests in a fixture have run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Adding this attribute to a method within a - class makes the method callable from the NUnit test runner. There is a property - called Description which is optional which you can provide a more detailed test - description. This class cannot be inherited. - - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - public void TestDescriptionMethod() - {} - } - - - - - - Construct the attribute, specifying a combining strategy and source of parameter data. - - - - - Used on a method, marks the test with a timeout value in milliseconds. - The test will be run in a separate thread and is cancelled if the timeout - is exceeded. Used on a class or assembly, sets the default timeout - for all contained test methods. - - - - - Construct a TimeoutAttribute given a time in milliseconds - - The timeout value in milliseconds - - - - ValuesAttribute is used to provide literal arguments for - an individual parameter of a test. - - - - - The collection of data to be returned. Must - be set by any derived attribute classes. - We use an object[] so that the individual - elements may have their type changed in GetData - if necessary - - - - - Constructs for use with an Enum parameter. Will pass every enum - value in to the test. - - - - - Construct with one argument - - - - - - Construct with two arguments - - - - - - - Construct with three arguments - - - - - - - - Construct with an array of arguments - - - - - - Get the collection of _values to be used as arguments - - - - - ValueSourceAttribute indicates the source to be used to - provide data for one parameter of a test method. - - - - - Construct with the name of the factory - for use with languages - that don't support params arrays. - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - for use with languages - that don't support params arrays. - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets an enumeration of data items for use as arguments - for a test method parameter. - - The parameter for which data is needed - - An enumeration containing individual data items - - - - - A set of Assert methods operating on one or more collections - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Asserts that all items contained in collection are of the type specified by expectedType. - - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - - - - Asserts that all items contained in collection are of the type specified by expectedType. - - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that all items contained in collection are not equal to null. - - IEnumerable containing objects to be considered - - - - Asserts that all items contained in collection are not equal to null. - - IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Ensures that every object contained in collection exists within the collection - once and only once. - - IEnumerable of objects to be considered - - - - Ensures that every object contained in collection exists within the collection - once and only once. - - IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not exactly equal. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - - - - Asserts that expected and actual are not exactly equal. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not equivalent. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are not equivalent. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that collection contains actual as an item. - - IEnumerable of objects to be considered - Object to be found within collection - - - - Asserts that collection contains actual as an item. - - IEnumerable of objects to be considered - Object to be found within collection - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that collection does not contain actual as an item. - - IEnumerable of objects to be considered - Object that cannot exist within collection - - - - Asserts that collection does not contain actual as an item. - - IEnumerable of objects to be considered - Object that cannot exist within collection - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the superset does not contain the subset - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - - - - Asserts that the superset does not contain the subset - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the superset contains the subset. - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - - - - Asserts that the superset contains the subset. - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the subset does not contain the superset - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - - - - Asserts that the subset does not contain the superset - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the subset contains the superset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - - - - Asserts that the subset contains the superset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array,list or other collection is empty - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array,list or other collection is empty - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new DictionaryContainsKeyConstraint checking for the - presence of a particular key in the dictionary. - - - - - Returns a new DictionaryContainsValueConstraint checking for the - presence of a particular value in the dictionary. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Thrown when an assertion failed. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - Thrown when an assertion failed. - - - - - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - Thrown when a test executes inconclusively. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - Thrown when an assertion failed. - - - - - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - Asserts on Files - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Verifies that two Streams are equal. Two Streams are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The expected Stream - The actual Stream - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Verifies that two Streams are equal. Two Streams are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The expected Stream - The actual Stream - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A file containing the value that is expected - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A file containing the value that is expected - A file containing the actual value - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - - - - Asserts that two Streams are not equal. If they are equal - an is thrown. - - The expected Stream - The actual Stream - The message to be displayed when the two Stream are the same. - Arguments to be used in formatting the message - - - - Asserts that two Streams are not equal. If they are equal - an is thrown. - - The expected Stream - The actual Stream - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - A file containing the value that is expected - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - A file containing the value that is expected - A file containing the actual value - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - - - - Asserts that the file exists. If it does not exist - an is thrown. - - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that the file exists. If it does not exist - an is thrown. - - A file containing the actual value - - - - Asserts that the file exists. If it does not exist - an is thrown. - - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that the file exists. If it does not exist - an is thrown. - - The path to a file containing the actual value - - - - Asserts that the file does not exist. If it does exist - an is thrown. - - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that the file does not exist. If it does exist - an is thrown. - - A file containing the actual value - - - - Asserts that the file does not exist. If it does exist - an is thrown. - - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that the file does not exist. If it does exist - an is thrown. - - The path to a file containing the actual value - - - - GlobalSettings is a place for setting default _values used - by the framework in performing asserts. - - - - - Default tolerance for floating point equality - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests whether an object graph is serializable in binary format. - - - - - Returns a constraint that tests whether an object graph is serializable in xml format. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable to the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable to the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is a subpath of the expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the actual value falls - inclusively within a specified range. - - from must be less than or equal to true - Inclusive beginning of the range. Must be less than or equal to to. - Inclusive end of the range. Must be greater than or equal to from. - - - - - The Iz class is a synonym for Is intended for use in VB, - which regards Is as a keyword. - - - - - The List class is a helper class with properties and methods - that supply a number of constraints used with lists and collections. - - - - - List.Map returns a ListMapper, which can be used to map - the original collection to another collection. - - - - - - - ListMapper is used to transform a collection used as an actual argument - producing another collection to be used in the assertion. - - - - - Construct a ListMapper based on a collection - - The collection to be transformed - - - - Produces a collection containing all the _values of a property - - The collection of property _values - - - - - The SpecialValue enum is used to represent TestCase arguments - that cannot be used as arguments to an Attribute. - - - - - Null represents a null value, which cannot be used as an - argument to an attriute under .NET 1.x - - - - - Basic Asserts on strings. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - - - - Asserts that a string is not found within another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - - - - Asserts that a string starts with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string starts with another string. - - The expected string - The string to be examined - - - - Asserts that a string does not start with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not start with another string. - - The expected string - The string to be examined - - - - Asserts that a string ends with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string ends with another string. - - The expected string - The string to be examined - - - - Asserts that a string does not end with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not end with another string. - - The expected string - The string to be examined - - - - Asserts that two strings are equal, without regard to case. - - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that two strings are equal, without regard to case. - - The expected string - The actual string - - - - Asserts that two strings are not equal, without regard to case. - - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that two strings are not equal, without regard to case. - - The expected string - The actual string - - - - Asserts that a string matches an expected regular expression pattern. - - The regex pattern to be matched - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string matches an expected regular expression pattern. - - The regex pattern to be matched - The actual string - - - - Asserts that a string does not match an expected regular expression pattern. - - The regex pattern to be used - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not match an expected regular expression pattern. - - The regex pattern to be used - The actual string - - - - The TestCaseData class represents a set of arguments - and other parameter info to be used for a parameterized - test case. It is derived from TestCaseParameters and adds a - fluent syntax for use in initializing the test case. - - - - - Initializes a new instance of the class. - - The arguments. - - - - Initializes a new instance of the class. - - The argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - The third argument. - - - - Sets the expected result for the test - - The expected result - A modified TestCaseData - - - - Sets the name of the test case - - The modified TestCaseData instance - - - - Sets the description for the test case - being constructed. - - The description. - The modified TestCaseData instance. - - - - Applies a category to the test - - - - - - - Applies a named property to the test - - - - - - - - Applies a named property to the test - - - - - - - - Applies a named property to the test - - - - - - - - Marks the test case as explicit. - - - - - Marks the test case as explicit, specifying the reason. - - - - - Ignores this TestCase, specifying the reason. - - The reason. - - - - - Provide the context information of the current test. - This is an adapter for the internal ExecutionContext - class, hiding the internals from the user test. - - - - - Construct a TestContext for an ExecutionContext - - The ExecutionContext to adapt - - - - Get the current test context. This is created - as needed. The user may save the context for - use within a test, but it should not be used - outside the test for which it is created. - - - - - Gets a TextWriter that will send output to the current test result. - - - - - Get a representation of the current test. - - - - - Gets a Representation of the TestResult for the current test. - - - - - Gets the directory containing the current test assembly. - - - - - Gets the directory to be used for outputting files created - by this test run. - - - - - Gets the random generator. - - - The random generator. - - - - Write the string representation of a boolean value to the current result - - - Write a char to the current result - - - Write a char array to the current result - - - Write the string representation of a double to the current result - - - Write the string representation of an Int32 value to the current result - - - Write the string representation of an Int64 value to the current result - - - Write the string representation of a decimal value to the current result - - - Write the string representation of an object to the current result - - - Write the string representation of a Single value to the current result - - - Write a string to the current result - - - Write the string representation of a UInt32 value to the current result - - - Write the string representation of a UInt64 value to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a line terminator to the current result - - - Write the string representation of a boolean value to the current result followed by a line terminator - - - Write a char to the current result followed by a line terminator - - - Write a char array to the current result followed by a line terminator - - - Write the string representation of a double to the current result followed by a line terminator - - - Write the string representation of an Int32 value to the current result followed by a line terminator - - - Write the string representation of an Int64 value to the current result followed by a line terminator - - - Write the string representation of a decimal value to the current result followed by a line terminator - - - Write the string representation of an object to the current result followed by a line terminator - - - Write the string representation of a Single value to the current result followed by a line terminator - - - Write a string to the current result followed by a line terminator - - - Write the string representation of a UInt32 value to the current result followed by a line terminator - - - Write the string representation of a UInt64 value to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - - TestAdapter adapts a Test for consumption by - the user test code. - - - - - Construct a TestAdapter for a Test - - The Test to be adapted - - - - Gets the unique Id of a test - - - - - The name of the test, which may or may not be - the same as the method name. - - - - - The name of the method representing the test. - - - - - The FullName of the test - - - - - The ClassName of the test - - - - - The properties of the test. - - - - - ResultAdapter adapts a TestResult for consumption by - the user test code. - - - - - Construct a ResultAdapter for a TestResult - - The TestResult to be adapted - - - - Gets a ResultState representing the outcome of the test. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Helper class with properties and methods that supply - constraints that operate on exceptions. - - - - - Creates a constraint specifying an expected exception - - - - - Creates a constraint specifying an exception with a given InnerException - - - - - Creates a constraint specifying an expected TargetInvocationException - - - - - Creates a constraint specifying an expected ArgumentException - - - - - Creates a constraint specifying an expected ArgumentNUllException - - - - - Creates a constraint specifying an expected InvalidOperationException - - - - - Creates a constraint specifying that no exception is thrown - - - - - Creates a constraint specifying the exact type of exception expected - - - - - Creates a constraint specifying the exact type of exception expected - - - - - Creates a constraint specifying the type of exception expected - - - - - Creates a constraint specifying the type of exception expected - - - - - Env is a static class that provides some of the features of - System.Environment that are not available under all runtimes - - - - - The newline sequence in the current environment. - - - - - Path to the 'My Documents' folder - - - - - Directory used for file output if not specified on commandline. - - - - - PackageSettings is a static class containing constant values that - are used as keys in setting up a TestPackage. These values are used in - the engine and framework. Setting values may be a string, int or bool. - - - - - Flag (bool) indicating whether tests are being debugged. - - - - - Flag (bool) indicating whether to pause execution of tests to allow - the user to attache a debugger. - - - - - The InternalTraceLevel for this run. Values are: "Default", - "Off", "Error", "Warning", "Info", "Debug", "Verbose". - Default is "Off". "Debug" and "Verbose" are synonyms. - - - - - Full path of the directory to be used for work and result files. - This path is provided to tests by the frameowrk TestContext. - - - - - The name of the config to use in loading a project. - If not specified, the first config found is used. - - - - - Bool indicating whether the engine should determine the private - bin path by examining the paths to all the tests. Defaults to - true unless PrivateBinPath is specified. - - - - - The ApplicationBase to use in loading the tests. If not - specified, and each assembly has its own process, then the - location of the assembly is used. For multiple assemblies - in a single process, the closest common root directory is used. - - - - - Path to the config file to use in running the tests. - - - - - Bool flag indicating whether a debugger should be launched at agent - startup. Used only for debugging NUnit itself. - - - - - Indicates how to load tests across AppDomains. Values are: - "Default", "None", "Single", "Multiple". Default is "Multiple" - if more than one assembly is loaded in a process. Otherwise, - it is "Single". - - - - - The private binpath used to locate assemblies. Directory paths - is separated by a semicolon. It's an error to specify this and - also set AutoBinPath to true. - - - - - The maximum number of test agents permitted to run simultneously. - Ignored if the ProcessModel is not set or defaulted to Multiple. - - - - - Indicates how to allocate assemblies to processes. Values are: - "Default", "Single", "Separate", "Multiple". Default is "Multiple" - for more than one assembly, "Separate" for a single assembly. - - - - - Indicates the desired runtime to use for the tests. Values - are strings like "net-4.5", "mono-4.0", etc. Default is to - use the target framework for which an assembly was built. - - - - - Bool flag indicating that the test should be run in a 32-bit process - on a 64-bit system. By default, NUNit runs in a 64-bit process on - a 64-bit system. Ignored if set on a 32-bit system. - - - - - Indicates that test runners should be disposed after the tests are executed - - - - - Bool flag indicating that the test assemblies should be shadow copied. - Defaults to false. - - - - - Integer value in milliseconds for the default timeout value - for test cases. If not specified, there is no timeout except - as specified by attributes on the tests themselves. - - - - - A TextWriter to which the internal trace will be sent. - - - - - A list of tests to be loaded. - - - - - The number of test threads to run for the assembly. If set to - 1, a single queue is used. If set to 0, tests are executed - directly, without queuing. - - - - - The random seed to be used for this assembly. If specified - as the value reported from a prior run, the framework should - generate identical random values for tests as were used for - that run, provided that no change has been made to the test - assembly. Default is a random value itself. - - - - - If true, execution stops after the first error or failure. - - - - - If true, use of the event queue is suppressed and test events are synchronous. - - - - - Enables compiling extension methods in .NET 2.0 - - - - diff --git a/packages/NUnit.3.0.1/lib/net40/nunit.framework.xml b/packages/NUnit.3.0.1/lib/net40/nunit.framework.xml deleted file mode 100644 index 44c50e5..0000000 --- a/packages/NUnit.3.0.1/lib/net40/nunit.framework.xml +++ /dev/null @@ -1,16885 +0,0 @@ - - - - nunit.framework - - - - - AssemblyHelper provides static methods for working - with assemblies. - - - - - Gets the path from which the assembly defining a type was loaded. - - The Type. - The path. - - - - Gets the path from which an assembly was loaded. - - The assembly. - The path. - - - - Gets the path to the directory from which an assembly was loaded. - - The assembly. - The path. - - - - Gets the AssemblyName of an assembly. - - The assembly - An AssemblyName - - - - Loads an assembly given a string, which may be the - path to the assembly or the AssemblyName - - - - - - - Gets the assembly path from code base. - - Public for testing purposes - The code base. - - - - - Interface for logging within the engine - - - - - Logs the specified message at the error level. - - The message. - - - - Logs the specified message at the error level. - - The message. - The arguments. - - - - Logs the specified message at the warning level. - - The message. - - - - Logs the specified message at the warning level. - - The message. - The arguments. - - - - Logs the specified message at the info level. - - The message. - - - - Logs the specified message at the info level. - - The message. - The arguments. - - - - Logs the specified message at the debug level. - - The message. - - - - Logs the specified message at the debug level. - - The message. - The arguments. - - - - InternalTrace provides facilities for tracing the execution - of the NUnit framework. Tests and classes under test may make use - of Console writes, System.Diagnostics.Trace or various loggers and - NUnit itself traps and processes each of them. For that reason, a - separate internal trace is needed. - - Note: - InternalTrace uses a global lock to allow multiple threads to write - trace messages. This can easily make it a bottleneck so it must be - used sparingly. Keep the trace Level as low as possible and only - insert InternalTrace writes where they are needed. - TODO: add some buffering and a separate writer thread as an option. - TODO: figure out a way to turn on trace in specific classes only. - - - - - Gets a flag indicating whether the InternalTrace is initialized - - - - - Initialize the internal trace facility using the name of the log - to be written to and the trace level. - - The log name - The trace level - - - - Initialize the internal trace using a provided TextWriter and level - - A TextWriter - The InternalTraceLevel - - - - Get a named Logger - - - - - - Get a logger named for a particular Type. - - - - - InternalTraceLevel is an enumeration controlling the - level of detailed presented in the internal log. - - - - - Use the default settings as specified by the user. - - - - - Do not display any trace messages - - - - - Display Error messages only - - - - - Display Warning level and higher messages - - - - - Display informational and higher messages - - - - - Display debug messages and higher - i.e. all messages - - - - - Display debug messages and higher - i.e. all messages - - - - - A trace listener that writes to a separate file per domain - and process using it. - - - - - Construct an InternalTraceWriter that writes to a file. - - Path to the file to use - - - - Construct an InternalTraceWriter that writes to a - TextWriter provided by the caller. - - - - - - Returns the character encoding in which the output is written. - - The character encoding in which the output is written. - - - - Writes a character to the text string or stream. - - The character to write to the text stream. - - - - Writes a string to the text string or stream. - - The string to write. - - - - Writes a string followed by a line terminator to the text string or stream. - - The string to write. If is null, only the line terminator is written. - - - - Releases the unmanaged resources used by the and optionally releases the managed resources. - - true to release both managed and unmanaged resources; false to release only unmanaged resources. - - - - Clears all buffers for the current writer and causes any buffered data to be written to the underlying device. - - - - - Provides internal logging to the NUnit framework - - - - - Initializes a new instance of the class. - - The name. - The log level. - The writer where logs are sent. - - - - Logs the message at error level. - - The message. - - - - Logs the message at error level. - - The message. - The message arguments. - - - - Logs the message at warm level. - - The message. - - - - Logs the message at warning level. - - The message. - The message arguments. - - - - Logs the message at info level. - - The message. - - - - Logs the message at info level. - - The message. - The message arguments. - - - - Logs the message at debug level. - - The message. - - - - Logs the message at debug level. - - The message. - The message arguments. - - - - Waits for pending asynchronous operations to complete, if appropriate, - and returns a proper result of the invocation by unwrapping task results - - The raw result of the method invocation - The unwrapped result, if necessary - - - - CombinatorialStrategy creates test cases by using all possible - combinations of the parameter data. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - Provides data from fields marked with the DatapointAttribute or the - DatapointsAttribute. - - - - - Determine whether any data is available for a parameter. - - A ParameterInfo representing one - argument to a parameterized test - - True if any data is available, otherwise false. - - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - A ParameterInfo representing one - argument to a parameterized test - - An IEnumerable providing the required data - - - - - Class to build ether a parameterized or a normal NUnitTestMethod. - There are four cases that the builder must deal with: - 1. The method needs no params and none are provided - 2. The method needs params and they are provided - 3. The method needs no params but they are provided in error - 4. The method needs params but they are not provided - This could have been done using two different builders, but it - turned out to be simpler to have just one. The BuildFrom method - takes a different branch depending on whether any parameters are - provided, but all four cases are dealt with in lower-level methods - - - - - Determines if the method can be used to build an NUnit test - test method of some kind. The method must normally be marked - with an identifying attribute for this to be true. - - Note that this method does not check that the signature - of the method for validity. If we did that here, any - test methods with invalid signatures would be passed - over in silence in the test run. Since we want such - methods to be reported, the check for validity is made - in BuildFrom rather than here. - - An IMethodInfo for the method being used as a test method - True if the builder can create a test case from this method - - - - Build a Test from the provided MethodInfo. Depending on - whether the method takes arguments and on the availability - of test case data, this method may return a single test - or a group of tests contained in a ParameterizedMethodSuite. - - The method for which a test is to be built - A Test representing one or more method invocations - - - - Determines if the method can be used to build an NUnit test - test method of some kind. The method must normally be marked - with an identifying attribute for this to be true. - - Note that this method does not check that the signature - of the method for validity. If we did that here, any - test methods with invalid signatures would be passed - over in silence in the test run. Since we want such - methods to be reported, the check for validity is made - in BuildFrom rather than here. - - An IMethodInfo for the method being used as a test method - The test suite being built, to which the new test would be added - True if the builder can create a test case from this method - - - - Build a Test from the provided MethodInfo. Depending on - whether the method takes arguments and on the availability - of test case data, this method may return a single test - or a group of tests contained in a ParameterizedMethodSuite. - - The method for which a test is to be built - The test fixture being populated, or null - A Test representing one or more method invocations - - - - Builds a ParameterizedMethodSuite containing individual test cases. - - The method for which a test is to be built. - The list of test cases to include. - A ParameterizedMethodSuite populated with test cases - - - - Build a simple, non-parameterized TestMethod for this method. - - The MethodInfo for which a test is to be built - The test suite for which the method is being built - A TestMethod. - - - - Class that can build a tree of automatic namespace - suites from a group of fixtures. - - - - - NamespaceDictionary of all test suites we have created to represent - namespaces. Used to locate namespace parent suites for fixtures. - - - - - The root of the test suite being created by this builder. - - - - - Initializes a new instance of the class. - - The root suite. - - - - Gets the root entry in the tree created by the NamespaceTreeBuilder. - - The root suite. - - - - Adds the specified fixtures to the tree. - - The fixtures to be added. - - - - Adds the specified fixture to the tree. - - The fixture to be added. - - - - NUnitTestCaseBuilder is a utility class used by attributes - that build test cases. - - - - - Constructs an - - - - - Builds a single NUnitTestMethod, either as a child of the fixture - or as one of a set of test cases under a ParameterizedTestMethodSuite. - - The MethodInfo from which to construct the TestMethod - The suite or fixture to which the new test will be added - The ParameterSet to be used, or null - - - - - Helper method that checks the signature of a TestMethod and - any supplied parameters to determine if the test is valid. - - Currently, NUnitTestMethods are required to be public, - non-abstract methods, either static or instance, - returning void. They may take arguments but the _values must - be provided or the TestMethod is not considered runnable. - - Methods not meeting these criteria will be marked as - non-runnable and the method will return false in that case. - - The TestMethod to be checked. If it - is found to be non-runnable, it will be modified. - Parameters to be used for this test, or null - True if the method signature is valid, false if not - - The return value is no longer used internally, but is retained - for testing purposes. - - - - - NUnitTestFixtureBuilder is able to build a fixture given - a class marked with a TestFixtureAttribute or an unmarked - class containing test methods. In the first case, it is - called by the attribute and in the second directly by - NUnitSuiteBuilder. - - - - - Build a TestFixture from type provided. A non-null TestSuite - must always be returned, since the method is generally called - because the user has marked the target class as a fixture. - If something prevents the fixture from being used, it should - be returned nonetheless, labelled as non-runnable. - - An ITypeInfo for the fixture to be used. - A TestSuite object or one derived from TestSuite. - - - - Overload of BuildFrom called by tests that have arguments. - Builds a fixture using the provided type and information - in the ITestFixtureData object. - - The TypeInfo for which to construct a fixture. - An object implementing ITestFixtureData or null. - - - - - Method to add test cases to the newly constructed fixture. - - The fixture to which cases should be added - - - - Method to create a test case from a MethodInfo and add - it to the fixture being built. It first checks to see if - any global TestCaseBuilder addin wants to build the - test case. If not, it uses the internal builder - collection maintained by this fixture builder. - - The default implementation has no test case builders. - Derived classes should add builders to the collection - in their constructor. - - The method for which a test is to be created - The test suite being built. - A newly constructed Test - - - - Built-in SuiteBuilder for all types of test classes. - - - - - Checks to see if the provided Type is a fixture. - To be considered a fixture, it must be a non-abstract - class with one or more attributes implementing the - IFixtureBuilder interface or one or more methods - marked as tests. - - The fixture type to check - True if the fixture can be built, false if not - - - - Build a TestSuite from TypeInfo provided. - - The fixture type to build - A TestSuite built from that type - - - - We look for attributes implementing IFixtureBuilder at one level - of inheritance at a time. Attributes on base classes are not used - unless there are no fixture builder attributes at all on the derived - class. This is by design. - - The type being examined for attributes - A list of the attributes found. - - - - PairwiseStrategy creates test cases by combining the parameter - data so that all possible pairs of data items are used. - - - - The number of test cases that cover all possible pairs of test function - parameters values is significantly less than the number of test cases - that cover all possible combination of test function parameters values. - And because different studies show that most of software failures are - caused by combination of no more than two parameters, pairwise testing - can be an effective ways to test the system when it's impossible to test - all combinations of parameters. - - - The PairwiseStrategy code is based on "jenny" tool by Bob Jenkins: - http://burtleburtle.net/bob/math/jenny.html - - - - - - FleaRand is a pseudo-random number generator developed by Bob Jenkins: - http://burtleburtle.net/bob/rand/talksmall.html#flea - - - - - Initializes a new instance of the FleaRand class. - - The seed. - - - - FeatureInfo represents coverage of a single value of test function - parameter, represented as a pair of indices, Dimension and Feature. In - terms of unit testing, Dimension is the index of the test parameter and - Feature is the index of the supplied value in that parameter's list of - sources. - - - - - Initializes a new instance of FeatureInfo class. - - Index of a dimension. - Index of a feature. - - - - A FeatureTuple represents a combination of features, one per test - parameter, which should be covered by a test case. In the - PairwiseStrategy, we are only trying to cover pairs of features, so the - tuples actually may contain only single feature or pair of features, but - the algorithm itself works with triplets, quadruples and so on. - - - - - Initializes a new instance of FeatureTuple class for a single feature. - - Single feature. - - - - Initializes a new instance of FeatureTuple class for a pair of features. - - First feature. - Second feature. - - - - TestCase represents a single test case covering a list of features. - - - - - Initializes a new instance of TestCaseInfo class. - - A number of features in the test case. - - - - PairwiseTestCaseGenerator class implements an algorithm which generates - a set of test cases which covers all pairs of possible values of test - function. - - - - The algorithm starts with creating a set of all feature tuples which we - will try to cover (see method). This set - includes every single feature and all possible pairs of features. We - store feature tuples in the 3-D collection (where axes are "dimension", - "feature", and "all combinations which includes this feature"), and for - every two feature (e.g. "A" and "B") we generate both ("A", "B") and - ("B", "A") pairs. This data structure extremely reduces the amount of - time needed to calculate coverage for a single test case (this - calculation is the most time-consuming part of the algorithm). - - - Then the algorithm picks one tuple from the uncovered tuple, creates a - test case that covers this tuple, and then removes this tuple and all - other tuples covered by this test case from the collection of uncovered - tuples. - - - Picking a tuple to cover - - - There are no any special rules defined for picking tuples to cover. We - just pick them one by one, in the order they were generated. - - - Test generation - - - Test generation starts from creating a completely random test case which - covers, nevertheless, previously selected tuple. Then the algorithm - tries to maximize number of tuples which this test covers. - - - Test generation and maximization process repeats seven times for every - selected tuple and then the algorithm picks the best test case ("seven" - is a magic number which provides good results in acceptable time). - - Maximizing test coverage - - To maximize tests coverage, the algorithm walks thru the list of mutable - dimensions (mutable dimension is a dimension that are not included in - the previously selected tuple). Then for every dimension, the algorithm - walks thru the list of features and checks if this feature provides - better coverage than randomly selected feature, and if yes keeps this - feature. - - - This process repeats while it shows progress. If the last iteration - doesn't improve coverage, the process ends. - - - In addition, for better results, before start every iteration, the - algorithm "scrambles" dimensions - so for every iteration dimension - probes in a different order. - - - - - - Creates a set of test cases for specified dimensions. - - - An array which contains information about dimensions. Each element of - this array represents a number of features in the specific dimension. - - - A set of test cases. - - - - - Gets the test cases generated by this strategy instance. - - A set of test cases. - - - - The ParameterDataProvider class implements IParameterDataProvider - and hosts one or more individual providers. - - - - - Construct with a collection of individual providers - - - - - Determine whether any data is available for a parameter. - - An IParameterInfo representing one - argument to a parameterized test - True if any data is available, otherwise false. - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - An IEnumerable providing the required data - - - - ParameterDataSourceProvider supplies individual argument _values for - single parameters using attributes implementing IParameterDataSource. - - - - - Determine whether any data is available for a parameter. - - A ParameterInfo representing one - argument to a parameterized test - - True if any data is available, otherwise false. - - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - - An IEnumerable providing the required data - - - - - SequentialStrategy creates test cases by using all of the - parameter data sources in parallel, substituting null - when any of them run out of data. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - ContextSettingsCommand applies specified changes to the - TestExecutionContext prior to running a test. No special - action is needed after the test runs, since the prior - context will be restored automatically. - - - - - The CommandStage enumeration represents the defined stages - of execution for a series of TestCommands. The int _values - of the enum are used to apply decorators in the proper - order. Lower _values are applied first and are therefore - "closer" to the actual test execution. - - - No CommandStage is defined for actual invocation of the test or - for creation of the context. Execution may be imagined as - proceeding from the bottom of the list upwards, with cleanup - after the test running in the opposite order. - - - - - Use an application-defined default value. - - - - - Make adjustments needed before and after running - the raw test - that is, after any SetUp has run - and before TearDown. - - - - - Run SetUp and TearDown for the test. This stage is used - internally by NUnit and should not normally appear - in user-defined decorators. - - - - - Make adjustments needed before and after running - the entire test - including SetUp and TearDown. - - - - - TODO: Documentation needed for class - - - - TODO: Documentation needed for field - - - - TODO: Documentation needed for constructor - - - - - - TODO: Documentation needed for class - - - - - Initializes a new instance of the class. - - The inner command. - The max time allowed in milliseconds - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext - - The context in which the test should run. - A TestResult - - - - OneTimeSetUpCommand runs any one-time setup methods for a suite, - constructing the user test object if necessary. - - - - - Constructs a OneTimeSetUpCommand for a suite - - The suite to which the command applies - A SetUpTearDownList for use by the command - A List of TestActionItems to be run after Setup - - - - Overridden to run the one-time setup for a suite. - - The TestExecutionContext to be used. - A TestResult - - - - OneTimeTearDownCommand performs any teardown actions - specified for a suite and calls Dispose on the user - test object, if any. - - - - - Construct a OneTimeTearDownCommand - - The test suite to which the command applies - A SetUpTearDownList for use by the command - A List of TestActionItems to be run before teardown. - - - - Overridden to run the teardown methods specified on the test. - - The TestExecutionContext to be used. - A TestResult - - - - SetUpTearDownCommand runs any SetUp methods for a suite, - runs the test and then runs any TearDown methods. - - - - - Initializes a new instance of the class. - - The inner command. - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - SetUpTearDownItem holds the setup and teardown methods - for a single level of the inheritance hierarchy. - - - - - Construct a SetUpTearDownNode - - A list of setup methods for this level - A list teardown methods for this level - - - - Returns true if this level has any methods at all. - This flag is used to discard levels that do nothing. - - - - - Run SetUp on this level. - - The execution context to use for running. - - - - Run TearDown for this level. - - - - - - TODO: Documentation needed for class - - - - - Initializes a new instance of the class. - - The test being skipped. - - - - Overridden to simply set the CurrentResult to the - appropriate Skipped state. - - The execution context for the test - A TestResult - - - - TestActionCommand runs the BeforeTest actions for a test, - then runs the test and finally runs the AfterTestActions. - - - - - Initializes a new instance of the class. - - The inner command. - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - TestActionItem represents a single execution of an - ITestAction. It is used to track whether the BeforeTest - method has been called and suppress calling the - AfterTest method if it has not. - - - - - Construct a TestActionItem - - The ITestAction to be included - - - - Run the BeforeTest method of the action and remember that it has been run. - - The test to which the action applies - - - - Run the AfterTest action, but only if the BeforeTest - action was actually run. - - The test to which the action applies - - - - TestCommand is the abstract base class for all test commands - in the framework. A TestCommand represents a single stage in - the execution of a test, e.g.: SetUp/TearDown, checking for - Timeout, verifying the returned result from a method, etc. - - TestCommands may decorate other test commands so that the - execution of a lower-level command is nested within that - of a higher level command. All nested commands are executed - synchronously, as a single unit. Scheduling test execution - on separate threads is handled at a higher level, using the - task dispatcher. - - - - - Construct a TestCommand for a test. - - The test to be executed - - - - Gets the test associated with this command. - - - - - Runs the test in a specified context, returning a TestResult. - - The TestExecutionContext to be used for running the test. - A TestResult - - - - TestMethodCommand is the lowest level concrete command - used to run actual test cases. - - - - - Initializes a new instance of the class. - - The test. - - - - Runs the test, saving a TestResult in the execution context, as - well as returning it. If the test has an expected result, it - is asserts on that value. Since failed tests and errors throw - an exception, this command must be wrapped in an outer command, - will handle that exception and records the failure. This role - is usually played by the SetUpTearDown command. - - The execution context - - - - TheoryResultCommand adjusts the result of a Theory so that - it fails if all the results were inconclusive. - - - - - Constructs a TheoryResultCommand - - The command to be wrapped by this one - - - - Overridden to call the inner command and adjust the result - in case all chlid results were inconclusive. - - - - - - - CultureDetector is a helper class used by NUnit to determine - whether a test should be run based on the current culture. - - - - - Default constructor uses the current culture. - - - - - Construct a CultureDetector for a particular culture for testing. - - The culture to be used - - - - Test to determine if one of a collection of cultures - is being used currently. - - - - - - - Tests to determine if the current culture is supported - based on a culture attribute. - - The attribute to examine - - - - - Test to determine if the a particular culture or comma- - delimited set of cultures is in use. - - Name of the culture or comma-separated list of culture ids - True if the culture is in use on the system - - - - Return the last failure reason. Results are not - defined if called before IsSupported( Attribute ) - is called. - - - - - ExceptionHelper provides static methods for working with exceptions - - - - - Builds up a message, using the Message field of the specified exception - as well as any InnerExceptions. - - The exception. - A combined message string. - - - - Builds up a message, using the Message field of the specified exception - as well as any InnerExceptions. - - The exception. - A combined stack trace. - - - - Gets the stack trace of the exception. - - The exception. - A string representation of the stack trace. - - - - A utility class to create TestCommands - - - - - Gets the command to be executed before any of - the child tests are run. - - A TestCommand - - - - Gets the command to be executed after all of the - child tests are run. - - A TestCommand - - - - Creates a test command for use in running this test. - - - - - - Creates a command for skipping a test. The result returned will - depend on the test RunState. - - - - - Builds the set up tear down list. - - Type of the fixture. - Type of the set up attribute. - Type of the tear down attribute. - A list of SetUpTearDownItems - - - - A CompositeWorkItem represents a test suite and - encapsulates the execution of the suite as well - as all its child tests. - - - - - Construct a CompositeWorkItem for executing a test suite - using a filter to select child tests. - - The TestSuite to be executed - A filter used to select child tests - - - - Method that actually performs the work. Overridden - in CompositeWorkItem to do setup, run all child - items and then do teardown. - - - - - The EventPumpState enum represents the state of an - EventPump. - - - - - The pump is stopped - - - - - The pump is pumping events with no stop requested - - - - - The pump is pumping events but a stop has been requested - - - - - EventPump pulls events out of an EventQueue and sends - them to a listener. It is used to send events back to - the client without using the CallContext of the test - runner thread. - - - - - The handle on which a thread enqueuing an event with == true - waits, until the EventPump has sent the event to its listeners. - - - - - The downstream listener to which we send events - - - - - The queue that holds our events - - - - - Thread to do the pumping - - - - - The current state of the eventpump - - - - - Constructor - - The EventListener to receive events - The event queue to pull events from - - - - Gets or sets the current state of the pump - - - On volatile and , see - "http://www.albahari.com/threading/part4.aspx". - - - - - Gets or sets the name of this EventPump - (used only internally and for testing). - - - - - Dispose stops the pump - Disposes the used WaitHandle, too. - - - - - Start the pump - - - - - Tell the pump to stop after emptying the queue. - - - - - Our thread proc for removing items from the event - queue and sending them on. Note that this would - need to do more locking if any other thread were - removing events from the queue. - - - - - NUnit.Core.Event is the abstract base for all stored events. - An Event is the stored representation of a call to the - ITestListener interface and is used to record such calls - or to queue them for forwarding on another thread or at - a later time. - - - - - The Send method is implemented by derived classes to send the event to the specified listener. - - The listener. - - - - Gets a value indicating whether this event is delivered synchronously by the NUnit . - - If true, and if has been used to - set a WaitHandle, blocks its calling thread until the - thread has delivered the event and sets the WaitHandle. - - - - - - TestStartedEvent holds information needed to call the TestStarted method. - - - - - Initializes a new instance of the class. - - The test. - - - - Calls TestStarted on the specified listener. - - The listener. - - - - TestFinishedEvent holds information needed to call the TestFinished method. - - - - - Initializes a new instance of the class. - - The result. - - - - Calls TestFinished on the specified listener. - - The listener. - - - - Implements a queue of work items each of which - is queued as a WaitCallback. - - - - - Construct a new EventQueue - - - - - WaitHandle for synchronous event delivery in . - - Having just one handle for the whole implies that - there may be only one producer (the test thread) for synchronous events. - If there can be multiple producers for synchronous events, one would have - to introduce one WaitHandle per event. - - - - - - Gets the count of items in the queue. - - - - - Sets a handle on which to wait, when is called - for an with == true. - - - The wait handle on which to wait, when is called - for an with == true. - The caller is responsible for disposing this wait handle. - - - - - Enqueues the specified event - - The event to enqueue. - - - - Removes the first element from the queue and returns it (or null). - - - If true and the queue is empty, the calling thread is blocked until - either an element is enqueued, or is called. - - - - - If the queue not empty - the first element. - - - otherwise, if ==false - or has been called - null. - - - - - - - Stop processing of the queue - - - - - An IWorkItemDispatcher handles execution of work items. - - - - - Dispatch a single work item for execution. The first - work item dispatched is saved as the top-level - work item and used when stopping the run. - - The item to dispatch - - - - Cancel the ongoing run completely. - If no run is in process, the call has no effect. - - - - - ParallelWorkItemDispatcher handles execution of work items by - queuing them for worker threads to process. - - - - - Construct a ParallelWorkItemDispatcher - - Number of workers to use - - - - Enumerates all the shifts supported by the dispatcher - - - - - Dispatch a single work item for execution. The first - work item dispatched is saved as the top-level - work item and used when stopping the run. - - The item to dispatch - - - - Cancel the ongoing run completely. - If no run is in process, the call has no effect. - - - - - QueuingEventListener uses an EventQueue to store any - events received on its EventListener interface. - - - - - The EvenQueue created and filled by this listener - - - - - A test has started - - The test that is starting - - - - A test case finished - - Result of the test case - - - - A SimpleWorkItem represents a single test case and is - marked as completed immediately upon execution. This - class is also used for skipped or ignored test suites. - - - - - Construct a simple work item for a test. - - The test to be executed - The filter used to select this test - - - - Method that performs actually performs the work. - - - - - SimpleWorkItemDispatcher handles execution of WorkItems by - directly executing them. It is provided so that a dispatcher - is always available in the context, thereby simplifying the - code needed to run child tests. - - - - - Dispatch a single work item for execution. The first - work item dispatched is saved as the top-level - work item and a thread is created on which to - run it. Subsequent calls come from the top level - item or its descendants on the proper thread. - - The item to dispatch - - - - Cancel the ongoing run completely. - If no run is in process, the call has no effect. - - - - - A TestWorker pulls work items from a queue - and executes them. - - - - - Event signaled immediately before executing a WorkItem - - - - - Event signaled immediately after executing a WorkItem - - - - - Construct a new TestWorker. - - The queue from which to pull work items - The name of this worker - The apartment state to use for running tests - - - - The name of this worker - also used for the thread - - - - - Indicates whether the worker thread is running - - - - - Our ThreadProc, which pulls and runs tests in a loop - - - - - Start processing work items. - - - - - Stop the thread, either immediately or after finishing the current WorkItem - - - - - The TextCapture class intercepts console output and writes it - to the current execution context, if one is present on the thread. - If no execution context is found, the output is written to a - default destination, normally the original destination of the - intercepted output. - - - - - Construct a TextCapture object - - The default destination for non-intercepted output - - - - Gets the Encoding in use by this TextWriter - - - - - Writes a single character - - The char to write - - - - Writes a string - - The string to write - - - - Writes a string followed by a line terminator - - The string to write - - - - A WorkItem may be an individual test case, a fixture or - a higher level grouping of tests. All WorkItems inherit - from the abstract WorkItem class, which uses the template - pattern to allow derived classes to perform work in - whatever way is needed. - - A WorkItem is created with a particular TestExecutionContext - and is responsible for re-establishing that context in the - current thread before it begins or resumes execution. - - - - - Creates a work item. - - The test for which this WorkItem is being created. - The filter to be used in selecting any child Tests. - - - - - Construct a WorkItem for a particular test. - - The test that the WorkItem will run - - - - Initialize the TestExecutionContext. This must be done - before executing the WorkItem. - - - Originally, the context was provided in the constructor - but delaying initialization of the context until the item - is about to be dispatched allows changes in the parent - context during OneTimeSetUp to be reflected in the child. - - The TestExecutionContext to use - - - - Event triggered when the item is complete - - - - - Gets the current state of the WorkItem - - - - - The test being executed by the work item - - - - - The execution context - - - - - The test actions to be performed before and after this test - - - - - Indicates whether this WorkItem may be run in parallel - - - - - The test result - - - - - Execute the current work item, including any - child work items. - - - - - Method that performs actually performs the work. It should - set the State to WorkItemState.Complete when done. - - - - - Method called by the derived class when all work is complete - - - - - WorkItemQueueState indicates the current state of a WorkItemQueue - - - - - The queue is paused - - - - - The queue is running - - - - - The queue is stopped - - - - - A WorkItemQueue holds work items that are ready to - be run, either initially or after some dependency - has been satisfied. - - - - - Initializes a new instance of the class. - - The name of the queue. - - - - Gets the name of the work item queue. - - - - - Gets the total number of items processed so far - - - - - Gets the maximum number of work items. - - - - - Gets the current state of the queue - - - - - Get a bool indicating whether the queue is empty. - - - - - Enqueue a WorkItem to be processed - - The WorkItem to process - - - - Dequeue a WorkItem for processing - - A WorkItem or null if the queue has stopped - - - - Start or restart processing of items from the queue - - - - - Signal the queue to stop - - - - - Pause the queue for restarting later - - - - - The current state of a work item - - - - - Ready to run or continue - - - - - Work Item is executing - - - - - Complete - - - - - The dispatcher needs to do different things at different, - non-overlapped times. For example, non-parallel tests may - not be run at the same time as parallel tests. We model - this using the metaphor of a working shift. The WorkShift - class associates one or more WorkItemQueues with one or - more TestWorkers. - - Work in the queues is processed until all queues are empty - and all workers are idle. Both tests are needed because a - worker that is busy may end up adding more work to one of - the queues. At that point, the shift is over and another - shift may begin. This cycle continues until all the tests - have been run. - - - - - Construct a WorkShift - - - - - Event that fires when the shift has ended - - - - - Gets a flag indicating whether the shift is currently active - - - - - Gets a list of the queues associated with this shift. - - Used for testing - - - - Gets the list of workers associated with this shift. - - - - - Gets a bool indicating whether this shift has any work to do - - - - - Add a WorkItemQueue to the shift, starting it if the - shift is currently active. - - - - - Assign a worker to the shift. - - - - - - Start or restart processing for the shift - - - - - End the shift, pausing all queues and raising - the EndOfShift event. - - - - - Shut down the shift. - - - - - Cancel the shift without completing all work - - - - - TextMessageWriter writes constraint descriptions and messages - in displayable form as a text stream. It tailors the display - of individual message components to form the standard message - format of NUnit assertion failure messages. - - - - - Prefix used for the expected value line of a message - - - - - Prefix used for the actual value line of a message - - - - - Length of a message prefix - - - - - Construct a TextMessageWriter - - - - - Construct a TextMessageWriter, specifying a user message - and optional formatting arguments. - - - - - - - Gets or sets the maximum line length for this writer - - - - - Method to write single line message with optional args, usually - written to precede the general failure message, at a given - indentation level. - - The indentation level of the message - The message to be written - Any arguments used in formatting the message - - - - Display Expected and Actual lines for a constraint. This - is called by MessageWriter's default implementation of - WriteMessageTo and provides the generic two-line display. - - The result of the constraint that failed - - - - Display Expected and Actual lines for given _values. This - method may be called by constraints that need more control over - the display of actual and expected _values than is provided - by the default implementation. - - The expected value - The actual value causing the failure - - - - Display Expected and Actual lines for given _values, including - a tolerance value on the expected line. - - The expected value - The actual value causing the failure - The tolerance within which the test was made - - - - Display the expected and actual string _values on separate lines. - If the mismatch parameter is >=0, an additional line is displayed - line containing a caret that points to the mismatch point. - - The expected string value - The actual string value - The point at which the strings don't match or -1 - If true, case is ignored in string comparisons - If true, clip the strings to fit the max line length - - - - Writes the text for an actual value. - - The actual value. - - - - Writes the text for a generalized value. - - The value. - - - - Writes the text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Write the generic 'Expected' line for a constraint - - The constraint that failed - - - - Write the generic 'Expected' line for a given value - - The expected value - - - - Write the generic 'Expected' line for a given value - and tolerance. - - The expected value - The tolerance within which the test was made - - - - Write the generic 'Actual' line for a constraint - - The ConstraintResult for which the actual value is to be written - - - - Write the generic 'Actual' line for a given value - - The actual value causing a failure - - - - Combines multiple filters so that a test must pass all - of them in order to pass this filter. - - - - - Constructs an empty AndFilter - - - - - Constructs an AndFilter from an array of filters - - - - - - Checks whether the AndFilter is matched by a test - - The test to be matched - True if all the component filters pass, otherwise false - - - - Checks whether the AndFilter is matched by a test - - The test to be matched - True if all the component filters match, otherwise false - - - - Gets the element name - - Element name - - - - CategoryFilter is able to select or exclude tests - based on their categories. - - - - - - Construct a CategoryFilter using a single category name - - A category name - - - - Check whether the filter matches a test - - The test to be matched - - - - - Gets the element name - - Element name - - - - ClassName filter selects tests based on the class FullName - - - - - Construct a FullNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - A base class for multi-part filters - - - - - Constructs an empty CompositeFilter - - - - - Constructs a CompositeFilter from an array of filters - - - - - - Adds a filter to the list of filters - - The filter to be added - - - - Return a list of the composing filters. - - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - FullName filter selects tests based on their FullName - - - - - Construct a FullNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - IdFilter selects tests based on their id - - - - - Construct an IdFilter for a single value - - The id the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - FullName filter selects tests based on their FullName - - - - - Construct a MethodNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - NotFilter negates the operation of another filter - - - - - Construct a not filter on another filter - - The filter to be negated - - - - Gets the base filter - - - - - Determine if a particular test passes the filter criteria. The default - implementation checks the test itself, its parents and any descendants. - - Derived classes may override this method or any of the Match methods - to change the behavior of the filter. - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Check whether the filter matches a test - - The test to be matched - True if it matches, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Combines multiple filters so that a test must pass one - of them in order to pass this filter. - - - - - Constructs an empty OrFilter - - - - - Constructs an AndFilter from an array of filters - - - - - - Checks whether the OrFilter is matched by a test - - The test to be matched - True if any of the component filters pass, otherwise false - - - - Checks whether the OrFilter is matched by a test - - The test to be matched - True if any of the component filters match, otherwise false - - - - Gets the element name - - Element name - - - - PropertyFilter is able to select or exclude tests - based on their properties. - - - - - - Construct a PropertyFilter using a property name and expected value - - A property name - The expected value of the property - - - - Check whether the filter matches a test - - The test to be matched - - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - TestName filter selects tests based on their Name - - - - - Construct a TestNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - ValueMatchFilter selects tests based on some value, which - is expected to be contained in the test. - - - - - Returns the value matched by the filter - used for testing - - - - - Indicates whether the value is a regular expression - - - - - Construct a ValueMatchFilter for a single value. - - The value to be included. - - - - Match the input provided by the derived class - - The value to be matchedT - True for a match, false otherwise. - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - GenericMethodHelper is able to deduce the Type arguments for - a generic method from the actual arguments provided. - - - - - Construct a GenericMethodHelper for a method - - MethodInfo for the method to examine - - - - Return the type argments for the method, deducing them - from the arguments actually provided. - - The arguments to the method - An array of type arguments. - - - - InvalidTestFixtureException is thrown when an appropriate test - fixture constructor using the provided arguments cannot be found. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The message. - - - - Initializes a new instance of the class. - - The message. - The inner. - - - - Serialization Constructor - - - - - InvalidTestFixtureException is thrown when an appropriate test - fixture constructor using the provided arguments cannot be found. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The message. - - - - Initializes a new instance of the class. - - The message. - The inner. - - - - Serialization Constructor - - - - - The MethodWrapper class wraps a MethodInfo so that it may - be used in a platform-independent manner. - - - - - Construct a MethodWrapper for a Type and a MethodInfo. - - - - - Construct a MethodInfo for a given Type and method name. - - - - - Gets the Type from which this method was reflected. - - - - - Gets the MethodInfo for this method. - - - - - Gets the name of the method. - - - - - Gets a value indicating whether the method is abstract. - - - - - Gets a value indicating whether the method is public. - - - - - Gets a value indicating whether the method contains unassigned generic type parameters. - - - - - Gets a value indicating whether the method is a generic method. - - - - - Gets a value indicating whether the MethodInfo represents the definition of a generic method. - - - - - Gets the return Type of the method. - - - - - Gets the parameters of the method. - - - - - - Returns the Type arguments of a generic method or the Type parameters of a generic method definition. - - - - - Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. - - The type arguments to be used - A new IMethodInfo with the type arguments replaced - - - - Returns an array of custom attributes of the specified type applied to this method - - - - - Gets a value indicating whether one or more attributes of the spcified type are defined on the method. - - - - - Invokes the method, converting any TargetInvocationException to an NUnitException. - - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - Override ToString() so that error messages in NUnit's own tests make sense - - - - - Thrown when an assertion failed. Here to preserve the inner - exception and hence its stack trace. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The error message that explains - the reason for the exception - - - - Initializes a new instance of the class. - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - OSPlatform represents a particular operating system platform - - - - - Platform ID for Unix as defined by Microsoft .NET 2.0 and greater - - - - - Platform ID for Unix as defined by Mono - - - - - Platform ID for XBox as defined by .NET and Mono, but not CF - - - - - Platform ID for MacOSX as defined by .NET and Mono, but not CF - - - - - Get the OSPlatform under which we are currently running - - - - - Gets the actual OS Version, not the incorrect value that might be - returned for Win 8.1 and Win 10 - - - If an application is not manifested as Windows 8.1 or Windows 10, - the version returned from Environment.OSVersion will not be 6.3 and 10.0 - respectively, but will be 6.2 and 6.3. The correct value can be found in - the registry. - - The original version - The correct OS version - - - - Product Type Enumeration used for Windows - - - - - Product type is unknown or unspecified - - - - - Product type is Workstation - - - - - Product type is Domain Controller - - - - - Product type is Server - - - - - Construct from a platform ID and version - - - - - Construct from a platform ID, version and product type - - - - - Get the platform ID of this instance - - - - - Get the Version of this instance - - - - - Get the Product Type of this instance - - - - - Return true if this is a windows platform - - - - - Return true if this is a Unix or Linux platform - - - - - Return true if the platform is Win32S - - - - - Return true if the platform is Win32Windows - - - - - Return true if the platform is Win32NT - - - - - Return true if the platform is Windows CE - - - - - Return true if the platform is Xbox - - - - - Return true if the platform is MacOSX - - - - - Return true if the platform is Windows 95 - - - - - Return true if the platform is Windows 98 - - - - - Return true if the platform is Windows ME - - - - - Return true if the platform is NT 3 - - - - - Return true if the platform is NT 4 - - - - - Return true if the platform is NT 5 - - - - - Return true if the platform is Windows 2000 - - - - - Return true if the platform is Windows XP - - - - - Return true if the platform is Windows 2003 Server - - - - - Return true if the platform is NT 6 - - - - - Return true if the platform is NT 6.0 - - - - - Return true if the platform is NT 6.1 - - - - - Return true if the platform is NT 6.2 - - - - - Return true if the platform is NT 6.3 - - - - - Return true if the platform is Vista - - - - - Return true if the platform is Windows 2008 Server (original or R2) - - - - - Return true if the platform is Windows 2008 Server (original) - - - - - Return true if the platform is Windows 2008 Server R2 - - - - - Return true if the platform is Windows 2012 Server (original or R2) - - - - - Return true if the platform is Windows 2012 Server (original) - - - - - Return true if the platform is Windows 2012 Server R2 - - - - - Return true if the platform is Windows 7 - - - - - Return true if the platform is Windows 8 - - - - - Return true if the platform is Windows 8.1 - - - - - Return true if the platform is Windows 10 - - - - - Return true if the platform is Windows Server. This is named Windows - Server 10 to distinguish it from previous versions of Windows Server. - - - - - The ParameterWrapper class wraps a ParameterInfo so that it may - be used in a platform-independent manner. - - - - - Construct a ParameterWrapper for a given method and parameter - - - - - - - Gets a value indicating whether the parameter is optional - - - - - Gets an IMethodInfo representing the method for which this is a parameter. - - - - - Gets the underlying ParameterInfo - - - - - Gets the Type of the parameter - - - - - Returns an array of custom attributes of the specified type applied to this method - - - - - Gets a value indicating whether one or more attributes of the specified type are defined on the parameter. - - - - - PlatformHelper class is used by the PlatformAttribute class to - determine whether a platform is supported. - - - - - Comma-delimited list of all supported OS platform constants - - - - - Comma-delimited list of all supported Runtime platform constants - - - - - Default constructor uses the operating system and - common language runtime of the system. - - - - - Construct a PlatformHelper for a particular operating - system and common language runtime. Used in testing. - - OperatingSystem to be used - RuntimeFramework to be used - - - - Test to determine if one of a collection of platforms - is being used currently. - - - - - - - Tests to determine if the current platform is supported - based on a platform attribute. - - The attribute to examine - - - - - Tests to determine if the current platform is supported - based on a platform attribute. - - The attribute to examine - - - - - Test to determine if the a particular platform or comma- - delimited set of platforms is in use. - - Name of the platform or comma-separated list of platform ids - True if the platform is in use on the system - - - - Return the last failure reason. Results are not - defined if called before IsSupported( Attribute ) - is called. - - - - - A PropertyBag represents a collection of name value pairs - that allows duplicate entries with the same key. Methods - are provided for adding a new pair as well as for setting - a key to a single value. All keys are strings but _values - may be of any type. Null _values are not permitted, since - a null entry represents the absence of the key. - - - - - Adds a key/value pair to the property set - - The key - The value - - - - Sets the value for a key, removing any other - _values that are already in the property set. - - - - - - - Gets a single value for a key, using the first - one if multiple _values are present and returning - null if the value is not found. - - - - - - - Gets a flag indicating whether the specified key has - any entries in the property set. - - The key to be checked - - True if their are _values present, otherwise false - - - - - Gets a collection containing all the keys in the property set - - - - - - Gets or sets the list of _values for a particular key - - - - - Returns an XmlNode representating the current PropertyBag. - - Not used - An XmlNode representing the PropertyBag - - - - Returns an XmlNode representing the PropertyBag after - adding it as a child of the supplied parent node. - - The parent node. - Not used - - - - - The PropertyNames class provides static constants for the - standard property ids that NUnit uses on tests. - - - - - The FriendlyName of the AppDomain in which the assembly is running - - - - - The selected strategy for joining parameter data into test cases - - - - - The process ID of the executing assembly - - - - - The stack trace from any data provider that threw - an exception. - - - - - The reason a test was not run - - - - - The author of the tests - - - - - The ApartmentState required for running the test - - - - - The categories applying to a test - - - - - The Description of a test - - - - - The number of threads to be used in running tests - - - - - The maximum time in ms, above which the test is considered to have failed - - - - - The ParallelScope associated with a test - - - - - The number of times the test should be repeated - - - - - Indicates that the test should be run on a separate thread - - - - - The culture to be set for a test - - - - - The UI culture to be set for a test - - - - - The type that is under test - - - - - The timeout value for the test - - - - - The test will be ignored until the given date - - - - - Randomizer returns a set of random _values in a repeatable - way, to allow re-running of tests if necessary. It extends - the .NET Random class, providing random values for a much - wider range of types. - - The class is used internally by the framework to generate - test case data and is also exposed for use by users through - the TestContext.Random property. - - - For consistency with the underlying Random Type, methods - returning a single value use the prefix "Next..." Those - without an argument return a non-negative value up to - the full positive range of the Type. Overloads are provided - for specifying a maximum or a range. Methods that return - arrays or strings use the prefix "Get..." to avoid - confusion with the single-value methods. - - - - - Initial seed used to create randomizers for this run - - - - - Get a Randomizer for a particular member, returning - one that has already been created if it exists. - This ensures that the same _values are generated - each time the tests are reloaded. - - - - - Get a randomizer for a particular parameter, returning - one that has already been created if it exists. - This ensures that the same values are generated - each time the tests are reloaded. - - - - - Create a new Randomizer using the next seed - available to ensure that each randomizer gives - a unique sequence of values. - - - - - - Default constructor - - - - - Construct based on seed value - - - - - - Returns a random unsigned int. - - - - - Returns a random unsigned int less than the specified maximum. - - - - - Returns a random unsigned int within a specified range. - - - - - Returns a non-negative random short. - - - - - Returns a non-negative random short less than the specified maximum. - - - - - Returns a non-negative random short within a specified range. - - - - - Returns a random unsigned short. - - - - - Returns a random unsigned short less than the specified maximum. - - - - - Returns a random unsigned short within a specified range. - - - - - Returns a random long. - - - - - Returns a random long less than the specified maximum. - - - - - Returns a non-negative random long within a specified range. - - - - - Returns a random ulong. - - - - - Returns a random ulong less than the specified maximum. - - - - - Returns a non-negative random long within a specified range. - - - - - Returns a random Byte - - - - - Returns a random Byte less than the specified maximum. - - - - - Returns a random Byte within a specified range - - - - - Returns a random SByte - - - - - Returns a random sbyte less than the specified maximum. - - - - - Returns a random sbyte within a specified range - - - - - Returns a random bool - - - - - Returns a random bool based on the probablility a true result - - - - - Returns a random double between 0.0 and the specified maximum. - - - - - Returns a random double within a specified range. - - - - - Returns a random float. - - - - - Returns a random float between 0.0 and the specified maximum. - - - - - Returns a random float within a specified range. - - - - - Returns a random enum value of the specified Type as an object. - - - - - Returns a random enum value of the specified Type. - - - - - Default characters for random functions. - - Default characters are the English alphabet (uppercase & lowercase), arabic numerals, and underscore - - - - Generate a random string based on the characters from the input string. - - desired length of output string. - string representing the set of characters from which to construct the resulting string - A random string of arbitrary length - - - - Generate a random string based on the characters from the input string. - - desired length of output string. - A random string of arbitrary length - Uses DefaultStringChars as the input character set - - - - Generate a random string based on the characters from the input string. - - A random string of the default length - Uses DefaultStringChars as the input character set - - - - Returns a random decimal. - - - - - Returns a random decimal between positive zero and the specified maximum. - - - - - Returns a random decimal within a specified range, which is not - permitted to exceed decimal.MaxVal in the current implementation. - - - A limitation of this implementation is that the range from min - to max must not exceed decimal.MaxVal. - - - - - Helper methods for inspecting a type by reflection. - - Many of these methods take ICustomAttributeProvider as an - argument to avoid duplication, even though certain attributes can - only appear on specific types of members, like MethodInfo or Type. - - In the case where a type is being examined for the presence of - an attribute, interface or named member, the Reflect methods - operate with the full name of the member being sought. This - removes the necessity of the caller having a reference to the - assembly that defines the item being sought and allows the - NUnit core to inspect assemblies that reference an older - version of the NUnit framework. - - - - - Examine a fixture type and return an array of methods having a - particular attribute. The array is order with base methods first. - - The type to examine - The attribute Type to look for - Specifies whether to search the fixture type inheritance chain - The array of methods found - - - - Examine a fixture type and return true if it has a method with - a particular attribute. - - The type to examine - The attribute Type to look for - True if found, otherwise false - - - - Invoke the default constructor on a Type - - The Type to be constructed - An instance of the Type - - - - Invoke a constructor on a Type with arguments - - The Type to be constructed - Arguments to the constructor - An instance of the Type - - - - Returns an array of types from an array of objects. - Used because the compact framework doesn't support - Type.GetTypeArray() - - An array of objects - An array of Types - - - - Invoke a parameterless method returning void on an object. - - A MethodInfo for the method to be invoked - The object on which to invoke the method - - - - Invoke a method, converting any TargetInvocationException to an NUnitException. - - A MethodInfo for the method to be invoked - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - The TestResult class represents the result of a test. - - - - - Error message for when child tests have errors - - - - - Error message for when child tests are ignored - - - - - The minimum duration for tests - - - - - List of child results - - - - - Construct a test result given a Test - - The test to be used - - - - Gets the test with which this result is associated. - - - - - Gets the ResultState of the test result, which - indicates the success or failure of the test. - - - - - Gets the name of the test result - - - - - Gets the full name of the test result - - - - - Gets or sets the elapsed time for running the test in seconds - - - - - Gets or sets the time the test started running. - - - - - Gets or sets the time the test finished running. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. - - - - - Gets or sets the count of asserts executed - when running the test. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Indicates whether this result has any child results. - Test HasChildren before accessing Children to avoid - the creation of an empty collection. - - - - - Gets the collection of child results. - - - - - Gets a TextWriter, which will write output to be included in the result. - - - - - Gets any text output written to this result. - - - - - Returns the Xml representation of the result. - - If true, descendant results are included - An XmlNode representing the result - - - - Adds the XML representation of the result as a child of the - supplied parent node.. - - The parent node. - If true, descendant results are included - - - - - Adds a child result to this result, setting this result's - ResultState to Failure if the child result failed. - - The result to be added - - - - Set the result of the test - - The ResultState to use in the result - - - - Set the result of the test - - The ResultState to use in the result - A message associated with the result state - - - - Set the result of the test - - The ResultState to use in the result - A message associated with the result state - Stack trace giving the location of the command - - - - Set the test result based on the type of exception thrown - - The exception that was thrown - - - - Set the test result based on the type of exception thrown - - The exception that was thrown - THe FailureSite to use in the result - - - - RecordTearDownException appends the message and stacktrace - from an exception arising during teardown of the test - to any previously recorded information, so that any - earlier failure information is not lost. Note that - calling Assert.Ignore, Assert.Inconclusive, etc. during - teardown is treated as an error. If the current result - represents a suite, it may show a teardown error even - though all contained tests passed. - - The Exception to be recorded - - - - Adds a reason element to a node and returns it. - - The target node. - The new reason element. - - - - Adds a failure element to a node and returns it. - - The target node. - The new failure element. - - - - Enumeration identifying a common language - runtime implementation. - - - - Any supported runtime framework - - - Microsoft .NET Framework - - - Microsoft .NET Compact Framework - - - Microsoft Shared Source CLI - - - Mono - - - Silverlight - - - MonoTouch - - - - RuntimeFramework represents a particular version - of a common language runtime implementation. - - - - - DefaultVersion is an empty Version, used to indicate that - NUnit should select the CLR version to use for the test. - - - - - Construct from a runtime type and version. If the version has - two parts, it is taken as a framework version. If it has three - or more, it is taken as a CLR version. In either case, the other - version is deduced based on the runtime type and provided version. - - The runtime type of the framework - The version of the framework - - - - Static method to return a RuntimeFramework object - for the framework that is currently in use. - - - - - The type of this runtime framework - - - - - The framework version for this runtime framework - - - - - The CLR version for this runtime framework - - - - - Return true if any CLR version may be used in - matching this RuntimeFramework object. - - - - - Returns the Display name for this framework - - - - - Parses a string representing a RuntimeFramework. - The string may be just a RuntimeType name or just - a Version or a hyphenated RuntimeType-Version or - a Version prefixed by 'versionString'. - - - - - - - Overridden to return the short name of the framework - - - - - - Returns true if the current framework matches the - one supplied as an argument. Two frameworks match - if their runtime types are the same or either one - is RuntimeType.Any and all specified version components - are equal. Negative (i.e. unspecified) version - components are ignored. - - The RuntimeFramework to be matched. - True on match, otherwise false - - - - StackFilter class is used to remove internal NUnit - entries from a stack trace so that the resulting - trace provides better information about the test. - - - - - Filters a raw stack trace and returns the result. - - The original stack trace - A filtered stack trace - - - - Provides methods to support legacy string comparison methods. - - - - - Compares two strings for equality, ignoring case if requested. - - The first string. - The second string.. - if set to true, the case of the letters in the strings is ignored. - Zero if the strings are equivalent, a negative number if strA is sorted first, a positive number if - strB is sorted first - - - - Compares two strings for equality, ignoring case if requested. - - The first string. - The second string.. - if set to true, the case of the letters in the strings is ignored. - True if the strings are equivalent, false if not. - - - - The TestCaseParameters class encapsulates method arguments and - other selected parameters needed for constructing - a parameterized test case. - - - - - The expected result to be returned - - - - - Default Constructor creates an empty parameter set - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a ParameterSet from an object implementing ITestCaseData - - - - - - The expected result of the test, which - must match the method return type. - - - - - Gets a value indicating whether an expected result was specified. - - - - - Helper class used to save and restore certain static or - singleton settings in the environment that affect tests - or which might be changed by the user tests. - - An internal class is used to hold settings and a stack - of these objects is pushed and popped as Save and Restore - are called. - - - - - Link to a prior saved context - - - - - Indicates that a stop has been requested - - - - - The event listener currently receiving notifications - - - - - The number of assertions for the current test - - - - - The current culture - - - - - The current UI culture - - - - - The current test result - - - - - The current Principal. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - An existing instance of TestExecutionContext. - - - - The current context, head of the list of saved contexts. - - - - - Gets the current context. - - The current context. - - - - Get the current context or return null if none is found. - - - - - Clear the current context. This is provided to - prevent "leakage" of the CallContext containing - the current context back to any runners. - - - - - Gets or sets the current test - - - - - The time the current test started execution - - - - - The time the current test started in Ticks - - - - - Gets or sets the current test result - - - - - Gets a TextWriter that will send output to the current test result. - - - - - The current test object - that is the user fixture - object on which tests are being executed. - - - - - Get or set the working directory - - - - - Get or set indicator that run should stop on the first error - - - - - Gets an enum indicating whether a stop has been requested. - - - - - The current test event listener - - - - - The current WorkItemDispatcher - - - - - The ParallelScope to be used by tests running in this context. - For builds with out the parallel feature, it has no effect. - - - - - Gets the RandomGenerator specific to this Test - - - - - Gets the assert count. - - The assert count. - - - - Gets or sets the test case timeout value - - - - - Gets a list of ITestActions set by upstream tests - - - - - Saves or restores the CurrentCulture - - - - - Saves or restores the CurrentUICulture - - - - - Gets or sets the current for the Thread. - - - - - Record any changes in the environment made by - the test code in the execution context so it - will be passed on to lower level tests. - - - - - Set up the execution environment to match a context. - Note that we may be running on the same thread where the - context was initially created or on a different thread. - - - - - Increments the assert count by one. - - - - - Increments the assert count by a specified amount. - - - - - Obtain lifetime service object - - - - - - Enumeration indicating whether the tests are - running normally or being cancelled. - - - - - Running normally with no stop requested - - - - - A graceful stop has been requested - - - - - A forced stop has been requested - - - - - Interface to be implemented by filters applied to tests. - The filter applies when running the test, after it has been - loaded, since this is the only time an ITest exists. - - - - - Unique Empty filter. - - - - - Indicates whether this is the EmptyFilter - - - - - Indicates whether this is a top-level filter, - not contained in any other filter. - - - - - Determine if a particular test passes the filter criteria. The default - implementation checks the test itself, its parents and any descendants. - - Derived classes may override this method or any of the Match methods - to change the behavior of the filter. - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - Determine whether the test itself matches the filter criteria, without - examining either parents or descendants. This is overridden by each - different type of filter to perform the necessary tests. - - The test to which the filter is applied - True if the filter matches the any parent of the test - - - - Determine whether any ancestor of the test matches the filter criteria - - The test to which the filter is applied - True if the filter matches the an ancestor of the test - - - - Determine whether any descendant of the test matches the filter criteria. - - The test to be matched - True if at least one descendant matches the filter criteria - - - - Create a TestFilter instance from an xml representation. - - - - - Create a TestFilter from it's TNode representation - - - - - Nested class provides an empty filter - one that always - returns true when called. It never matches explicitly. - - - - - Adds an XML node - - True if recursive - The added XML node - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - The TestCaseParameters class encapsulates method arguments and - other selected parameters needed for constructing - a parameterized test case. - - - - - Default Constructor creates an empty parameter set - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a ParameterSet from an object implementing ITestCaseData - - - - - - Type arguments used to create a generic fixture instance - - - - - TestListener provides an implementation of ITestListener that - does nothing. It is used only through its NULL property. - - - - - Called when a test has just started - - The test that is starting - - - - Called when a test case has finished - - The result of the test - - - - Construct a new TestListener - private so it may not be used. - - - - - Get a listener that does nothing - - - - - TestNameGenerator is able to create test names according to - a coded pattern. - - - - - Construct a TestNameGenerator - - The pattern used by this generator. - - - - Get the display name for a TestMethod and it's arguments - - A TestMethod - The display name - - - - Get the display name for a TestMethod and it's arguments - - A TestMethod - Arguments to be used - The display name - - - - Get the display name for a MethodInfo - - A MethodInfo - The display name - - - - Get the display name for a method with args - - A MethodInfo - Argument list for the method - The display name - - - - TestParameters is the abstract base class for all classes - that know how to provide data for constructing a test. - - - - - Default Constructor creates an empty parameter set - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a ParameterSet from an object implementing ITestData - - - - - - The RunState for this set of parameters. - - - - - The arguments to be used in running the test, - which must match the method signature. - - - - - A name to be used for this test case in lieu - of the standard generated name containing - the argument list. - - - - - Gets the property dictionary for this test - - - - - Applies ParameterSet _values to the test itself. - - A test. - - - - The original arguments provided by the user, - used for display purposes. - - - - - TestProgressReporter translates ITestListener events into - the async callbacks that are used to inform the client - software about the progress of a test run. - - - - - Initializes a new instance of the class. - - The callback handler to be used for reporting progress. - - - - Called when a test has just started - - The test that is starting - - - - Called when a test has finished. Sends a result summary to the callback. - to - - The result of the test - - - - Returns the parent test item for the targer test item if it exists - - - parent test item - - - - Makes a string safe for use as an attribute, replacing - characters characters that can't be used with their - corresponding xml representations. - - The string to be used - A new string with the _values replaced - - - - ParameterizedFixtureSuite serves as a container for the set of test - fixtures created from a given Type using various parameters. - - - - - Initializes a new instance of the class. - - The ITypeInfo for the type that represents the suite. - - - - Gets a string representing the type of test - - - - - - ParameterizedMethodSuite holds a collection of individual - TestMethods with their arguments applied. - - - - - Construct from a MethodInfo - - - - - - Gets a string representing the type of test - - - - - - SetUpFixture extends TestSuite and supports - Setup and TearDown methods. - - - - - Initializes a new instance of the class. - - The type. - - - - The Test abstract class represents a test within the framework. - - - - - Static value to seed ids. It's started at 1000 so any - uninitialized ids will stand out. - - - - - The SetUp methods. - - - - - The teardown methods - - - - - Constructs a test given its name - - The name of the test - - - - Constructs a test given the path through the - test hierarchy to its parent and a name. - - The parent tests full name - The name of the test - - - - TODO: Documentation needed for constructor - - - - - - Construct a test from a MethodInfo - - - - - - Gets or sets the id of the test - - - - - - Gets or sets the name of the test - - - - - Gets or sets the fully qualified name of the test - - - - - - Gets the name of the class containing this test. Returns - null if the test is not associated with a class. - - - - - Gets the name of the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the TypeInfo of the fixture used in running this test - or null if no fixture type is associated with it. - - - - - Gets a MethodInfo for the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Whether or not the test should be run - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Gets a string representing the type of test. Used as an attribute - value in the XML representation of a test and has no other - function in the framework. - - - - - Gets a count of test cases represented by - or contained under this test. - - - - - Gets the properties for this test - - - - - Returns true if this is a TestSuite - - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets the parent as a Test object. - Used by the core to set the parent. - - - - - Gets this test's child tests - - A list of child tests - - - - Gets or sets a fixture object for running this test. - - - - - Static prefix used for ids in this AppDomain. - Set by FrameworkController. - - - - - Gets or Sets the Int value representing the seed for the RandomGenerator - - - - - - Creates a TestResult for this test. - - A TestResult suitable for this type of test. - - - - Modify a newly constructed test by applying any of NUnit's common - attributes, based on a supplied ICustomAttributeProvider, which is - usually the reflection element from which the test was constructed, - but may not be in some instances. The attributes retrieved are - saved for use in subsequent operations. - - An object implementing ICustomAttributeProvider - - - - Add standard attributes and members to a test node. - - - - - - - Returns the Xml representation of the test - - If true, include child tests recursively - - - - - Returns an XmlNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Compares this test to another test for sorting purposes - - The other test - Value of -1, 0 or +1 depending on whether the current test is less than, equal to or greater than the other test - - - - TestAssembly is a TestSuite that represents the execution - of tests in a managed assembly. - - - - - Initializes a new instance of the class - specifying the Assembly and the path from which it was loaded. - - The assembly this test represents. - The path used to load the assembly. - - - - Initializes a new instance of the class - for a path which could not be loaded. - - The path used to load the assembly. - - - - Gets the Assembly represented by this instance. - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - TestFixture is a surrogate for a user test fixture class, - containing one or more tests. - - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - The TestMethod class represents a Test implemented as a method. - - - - - The ParameterSet used to create this test method - - - - - Initializes a new instance of the class. - - The method to be used as a test. - - - - Initializes a new instance of the class. - - The method to be used as a test. - The suite or fixture to which the new test will be added - - - - Overridden to return a TestCaseResult. - - A TestResult for this test. - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Returns a TNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Gets this test's child tests - - A list of child tests - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Returns the name of the method - - - - - TestSuite represents a composite test, which contains other tests. - - - - - Our collection of child tests - - - - - Initializes a new instance of the class. - - The name of the suite. - - - - Initializes a new instance of the class. - - Name of the parent suite. - The name of the suite. - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - Sorts tests under this suite. - - - - - Adds a test to the suite. - - The test. - - - - Gets this test's child tests - - The list of child tests - - - - Gets a count of test cases represented by - or contained under this test. - - - - - - The arguments to use in creating the fixture - - - - - Set to true to suppress sorting this suite's contents - - - - - Overridden to return a TestSuiteResult. - - A TestResult for this test. - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Returns an XmlNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Check that setup and teardown methods marked by certain attributes - meet NUnit's requirements and mark the tests not runnable otherwise. - - The attribute type to check for - - - - ThreadUtility provides a set of static methods convenient - for working with threads. - - - - - Do our best to Kill a thread - - The thread to kill - - - - Do our best to kill a thread, passing state info - - The thread to kill - Info for the ThreadAbortException handler - - - - TypeHelper provides static methods that operate on Types. - - - - - A special value, which is used to indicate that BestCommonType() method - was unable to find a common type for the specified arguments. - - - - - Gets the display name for a Type as used by NUnit. - - The Type for which a display name is needed. - The display name for the Type - - - - Gets the display name for a Type as used by NUnit. - - The Type for which a display name is needed. - The arglist provided. - The display name for the Type - - - - Returns the best fit for a common type to be used in - matching actual arguments to a methods Type parameters. - - The first type. - The second type. - Either type1 or type2, depending on which is more general. - - - - Determines whether the specified type is numeric. - - The type to be examined. - - true if the specified type is numeric; otherwise, false. - - - - - Convert an argument list to the required parameter types. - Currently, only widening numeric conversions are performed. - - An array of args to be converted - A ParameterInfo[] whose types will be used as targets - - - - Determines whether this instance can deduce type args for a generic type from the supplied arguments. - - The type to be examined. - The arglist. - The type args to be used. - - true if this the provided args give sufficient information to determine the type args to be used; otherwise, false. - - - - - Gets the _values for an enumeration, using Enum.GetTypes - where available, otherwise through reflection. - - - - - - - Gets the ids of the _values for an enumeration, - using Enum.GetNames where available, otherwise - through reflection. - - - - - - - The TypeWrapper class wraps a Type so it may be used in - a platform-independent manner. - - - - - Construct a TypeWrapper for a specified Type. - - - - - Gets the underlying Type on which this TypeWrapper is based. - - - - - Gets the base type of this type as an ITypeInfo - - - - - Gets the Name of the Type - - - - - Gets the FullName of the Type - - - - - Gets the assembly in which the type is declared - - - - - Gets the namespace of the Type - - - - - Gets a value indicating whether the type is abstract. - - - - - Gets a value indicating whether the Type is a generic Type - - - - - Returns true if the Type wrapped is T - - - - - Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. - - - - - Gets a value indicating whether the Type is a generic Type definition - - - - - Gets a value indicating whether the type is sealed. - - - - - Gets a value indicating whether this type represents a static class. - - - - - Get the display name for this type - - - - - Get the display name for an object of this type, constructed with the specified args. - - - - - Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments - - - - - Returns a Type representing a generic type definition from which this Type can be constructed. - - - - - Returns an array of custom attributes of the specified type applied to this type - - - - - Returns a value indicating whether the type has an attribute of the specified type. - - - - - - - - Returns a flag indicating whether this type has a method with an attribute of the specified type. - - - - - - - Returns an array of IMethodInfos for methods of this Type - that match the specified flags. - - - - - Returns a value indicating whether this Type has a public constructor taking the specified argument Types. - - - - - Construct an object of this Type, using the specified arguments. - - - - - Override ToString() so that error messages in NUnit's own tests make sense - - - - - Represents the result of running a single test case. - - - - - Construct a TestCaseResult based on a TestMethod - - A TestMethod to which the result applies. - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Represents the result of running a test suite - - - - - Construct a TestSuiteResult base on a TestSuite - - The TestSuite to which the result applies - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Add a child result - - The child result to be added - - - - Class used to guard against unexpected argument values - or operations by throwing an appropriate exception. - - - - - Throws an exception if an argument is null - - The value to be tested - The name of the argument - - - - Throws an exception if a string argument is null or empty - - The value to be tested - The name of the argument - - - - Throws an ArgumentOutOfRangeException if the specified condition is not met. - - The condition that must be met - The exception message to be used - The name of the argument - - - - Throws an ArgumentException if the specified condition is not met. - - The condition that must be met - The exception message to be used - The name of the argument - - - - Throws an InvalidOperationException if the specified condition is not met. - - The condition that must be met - The exception message to be used - - - - The different targets a test action attribute can be applied to - - - - - Default target, which is determined by where the action attribute is attached - - - - - Target a individual test case - - - - - Target a suite of test cases - - - - - DefaultTestAssemblyBuilder loads a single assembly and builds a TestSuite - containing test fixtures present in the assembly. - - - - - The default suite builder used by the test assembly builder. - - - - - Initializes a new instance of the class. - - - - - Build a suite of tests from a provided assembly - - The assembly from which tests are to be built - A dictionary of options to use in building the suite - - A TestSuite containing the tests found in the assembly - - - - - Build a suite of tests given the filename of an assembly - - The filename of the assembly from which tests are to be built - A dictionary of options to use in building the suite - - A TestSuite containing the tests found in the assembly - - - - - FrameworkController provides a facade for use in loading, browsing - and running tests without requiring a reference to the NUnit - framework. All calls are encapsulated in constructors for - this class and its nested classes, which only require the - types of the Common Type System as arguments. - - The controller supports four actions: Load, Explore, Count and Run. - They are intended to be called by a driver, which should allow for - proper sequencing of calls. Load must be called before any of the - other actions. The driver may support other actions, such as - reload on run, by combining these calls. - - - - - Construct a FrameworkController using the default builder and runner. - - The AssemblyName or path to the test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - - - - Construct a FrameworkController using the default builder and runner. - - The test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - - - - Construct a FrameworkController, specifying the types to be used - for the runner and builder. This constructor is provided for - purposes of development. - - The full AssemblyName or the path to the test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - The Type of the test runner - The Type of the test builder - - - - Construct a FrameworkController, specifying the types to be used - for the runner and builder. This constructor is provided for - purposes of development. - - The test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - The Type of the test runner - The Type of the test builder - - - - Gets the ITestAssemblyBuilder used by this controller instance. - - The builder. - - - - Gets the ITestAssemblyRunner used by this controller instance. - - The runner. - - - - Gets the AssemblyName or the path for which this FrameworkController was created - - - - - Gets the Assembly for which this - - - - - Gets a dictionary of settings for the FrameworkController - - - - - Inserts environment element - - Target node - The new node - - - - Inserts settings element - - Target node - Settings dictionary - The new node - - - - FrameworkControllerAction is the base class for all actions - performed against a FrameworkController. - - - - - LoadTestsAction loads a test into the FrameworkController - - - - - LoadTestsAction loads the tests in an assembly. - - The controller. - The callback handler. - - - - ExploreTestsAction returns info about the tests in an assembly - - - - - Initializes a new instance of the class. - - The controller for which this action is being performed. - Filter used to control which tests are included (NYI) - The callback handler. - - - - CountTestsAction counts the number of test cases in the loaded TestSuite - held by the FrameworkController. - - - - - Construct a CountsTestAction and perform the count of test cases. - - A FrameworkController holding the TestSuite whose cases are to be counted - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - RunTestsAction runs the loaded TestSuite held by the FrameworkController. - - - - - Construct a RunTestsAction and run all tests in the loaded TestSuite. - - A FrameworkController holding the TestSuite to run - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - RunAsyncAction initiates an asynchronous test run, returning immediately - - - - - Construct a RunAsyncAction and run all tests in the loaded TestSuite. - - A FrameworkController holding the TestSuite to run - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - StopRunAction stops an ongoing run. - - - - - Construct a StopRunAction and stop any ongoing run. If no - run is in process, no error is raised. - - The FrameworkController for which a run is to be stopped. - True the stop should be forced, false for a cooperative stop. - >A callback handler used to report results - A forced stop will cause threads and processes to be killed as needed. - - - - The ITestAssemblyBuilder interface is implemented by a class - that is able to build a suite of tests given an assembly or - an assembly filename. - - - - - Build a suite of tests from a provided assembly - - The assembly from which tests are to be built - A dictionary of options to use in building the suite - A TestSuite containing the tests found in the assembly - - - - Build a suite of tests given the filename of an assembly - - The filename of the assembly from which tests are to be built - A dictionary of options to use in building the suite - A TestSuite containing the tests found in the assembly - - - - The ITestAssemblyRunner interface is implemented by classes - that are able to execute a suite of tests loaded - from an assembly. - - - - - Gets the tree of loaded tests, or null if - no tests have been loaded. - - - - - Gets the tree of test results, if the test - run is completed, otherwise null. - - - - - Indicates whether a test has been loaded - - - - - Indicates whether a test is currently running - - - - - Indicates whether a test run is complete - - - - - Loads the tests found in an Assembly, returning an - indication of whether or not the load succeeded. - - File name of the assembly to load - Dictionary of options to use in loading the test - An ITest representing the loaded tests - - - - Loads the tests found in an Assembly, returning an - indication of whether or not the load succeeded. - - The assembly to load - Dictionary of options to use in loading the test - An ITest representing the loaded tests - - - - Count Test Cases using a filter - - The filter to apply - The number of test cases found - - - - Run selected tests and return a test result. The test is run synchronously, - and the listener interface is notified as it progresses. - - Interface to receive ITestListener notifications. - A test filter used to select tests to be run - - - - Run selected tests asynchronously, notifying the listener interface as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - - - Wait for the ongoing run to complete. - - Time to wait in milliseconds - True if the run completed, otherwise false - - - - Signal any test run that is in process to stop. Return without error if no test is running. - - If true, kill any test-running threads - - - - Implementation of ITestAssemblyRunner - - - - - Initializes a new instance of the class. - - The builder. - - - - Gets the default level of parallel execution (worker threads) - - - - - The tree of tests that was loaded by the builder - - - - - The test result, if a run has completed - - - - - Indicates whether a test is loaded - - - - - Indicates whether a test is running - - - - - Indicates whether a test run is complete - - - - - Our settings, specified when loading the assembly - - - - - The top level WorkItem created for the assembly as a whole - - - - - The TestExecutionContext for the top level WorkItem - - - - - Loads the tests found in an Assembly - - File name of the assembly to load - Dictionary of option settings for loading the assembly - True if the load was successful - - - - Loads the tests found in an Assembly - - The assembly to load - Dictionary of option settings for loading the assembly - True if the load was successful - - - - Count Test Cases using a filter - - The filter to apply - The number of test cases found - - - - Run selected tests and return a test result. The test is run synchronously, - and the listener interface is notified as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - - - - Run selected tests asynchronously, notifying the listener interface as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - RunAsync is a template method, calling various abstract and - virtual methods to be overridden by derived classes. - - - - - Wait for the ongoing run to complete. - - Time to wait in milliseconds - True if the run completed, otherwise false - - - - Initiate the test run. - - - - - Signal any test run that is in process to stop. Return without error if no test is running. - - If true, kill any test-running threads - - - - Create the initial TestExecutionContext used to run tests - - The ITestListener specified in the RunAsync call - - - - Handle the the Completed event for the top level work item - - - - - The Assert class contains a collection of static methods that - implement the most common assertions used in NUnit. - - - - - Verifies that the first int is greater than the second - int. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first int is greater than the second - int. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - - - - Assert that a string is empty - that is equal to string.Empty - - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that a string is empty - that is equal to string.Empty - - The string to be tested - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing ICollection - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing ICollection - - - - Assert that a string is not empty - that is not equal to string.Empty - - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that a string is not empty - that is not equal to string.Empty - - The string to be tested - - - - Assert that an array, list or other collection is not empty - - An array, list or other collection implementing ICollection - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that an array, list or other collection is not empty - - An array, list or other collection implementing ICollection - - - - We don't actually want any instances of this object, but some people - like to inherit from it to add other static methods. Hence, the - protected constructor disallows any instances of this object. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - The message to initialize the with. - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - - - - Throws an with the message and arguments - that are passed in. This is used by the other Assert functions. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This is used by the other Assert functions. - - The message to initialize the with. - - - - Throws an . - This is used by the other Assert functions. - - - - - Throws an with the message and arguments - that are passed in. This causes the test to be reported as ignored. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This causes the test to be reported as ignored. - - The message to initialize the with. - - - - Throws an . - This causes the test to be reported as ignored. - - - - - Throws an with the message and arguments - that are passed in. This causes the test to be reported as inconclusive. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This causes the test to be reported as inconclusive. - - The message to initialize the with. - - - - Throws an . - This causes the test to be reported as Inconclusive. - - - - - Asserts that an object is contained in a list. - - The expected object - The list to be examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is contained in a list. - - The expected object - The list to be examined - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - - - - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. - - The value that is expected - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. - - The value that is expected - The actual value - - - - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. - - The value that is expected - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. - - The value that is expected - The actual value - - - - Asserts that two objects refer to the same object. If they - are not the same an is thrown. - - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that two objects refer to the same object. If they - are not the same an is thrown. - - The expected object - The actual object - - - - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. - - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. - - The expected object - The actual object - - - - Helper for Assert.AreEqual(double expected, double actual, ...) - allowing code generation to work consistently. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - A constraint to be satisfied by the exception - A TestSnippet delegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - A constraint to be satisfied by the exception - A TestSnippet delegate - - - - Verifies that a delegate throws a particular exception when called. - - The exception Type expected - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - The exception Type expected - A TestDelegate - - - - Verifies that a delegate throws a particular exception when called. - - Type of the expected exception - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - Type of the expected exception - A TestDelegate - - - - Verifies that a delegate throws an exception when called - and returns it. - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception when called - and returns it. - - A TestDelegate - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - A TestDelegate - - - - Verifies that a delegate does not throw an exception - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate does not throw an exception. - - A TestDelegate - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - Used as a synonym for That in rare cases where a private setter - causes a Visual Basic compilation error. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - Used as a synonym for That in rare cases where a private setter - causes a Visual Basic compilation error. - - - This method is provided for use by VB developers needing to test - the value of properties with private setters. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - - - - Delegate used by tests that execute code and - capture any thrown exception. - - - - - AssertionHelper is an optional base class for user tests, - allowing the use of shorter ids for constraints and - asserts and avoiding conflict with the definition of - , from which it inherits much of its - behavior, in certain mock object frameworks. - - - - - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to - . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to . - - The evaluated condition - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Returns a ListMapper based on a collection. - - The original collection - - - - - Provides static methods to express the assumptions - that must be met for a test to give a meaningful - result. If an assumption is not met, the test - should produce an inconclusive result. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the - method throws an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Marks a test that must run in a particular threading apartment state, causing it - to run in a separate thread if necessary. - - - - - Construct an ApartmentAttribute - - The apartment state that this test must be run under. You must pass in a valid apartment state. - - - - Provides the Author of a test or test fixture. - - - - - Initializes a new instance of the class. - - The name of the author. - - - - Initializes a new instance of the class. - - The name of the author. - The email address of the author. - - - - Attribute used to apply a category to a test - - - - - The name of the category - - - - - Construct attribute for a given category based on - a name. The name may not contain the characters ',', - '+', '-' or '!'. However, this is not checked in the - constructor since it would cause an error to arise at - as the test was loaded without giving a clear indication - of where the problem is located. The error is handled - in NUnitFramework.cs by marking the test as not - runnable. - - The name of the category - - - - Protected constructor uses the Type name as the name - of the category. - - - - - The name of the category - - - - - Modifies a test by adding a category to it. - - The test to modify - - - - Marks a test to use a combinatorial join of any argument - data provided. Since this is the default, the attribute is - optional. - - - - - Default constructor - - - - - Marks a test to use a particular CombiningStrategy to join - any parameter data provided. Since this is the default, the - attribute is optional. - - - - - Construct a CombiningStrategyAttribute incorporating an - ICombiningStrategy and an IParamterDataProvider. - - Combining strategy to be used in combining data - An IParameterDataProvider to supply data - - - - Construct a CombiningStrategyAttribute incorporating an object - that implements ICombiningStrategy and an IParameterDataProvider. - This constructor is provided for CLS compliance. - - Combining strategy to be used in combining data - An IParameterDataProvider to supply data - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The MethodInfo for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - Modify the test by adding the name of the combining strategy - to the properties. - - The test to modify - - - - LevelOfParallelismAttribute is used to set the number of worker threads - that may be allocated by the framework for running tests. - - - - - Construct a LevelOfParallelismAttribute. - - The number of worker threads to be created by the framework. - - - - Attribute used to identify a method that is called once - to perform setup before any child tests are run. - - - - - Attribute used to identify a method that is called once - after all the child tests have run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - RepeatAttribute may be applied to test case in order - to run it multiple times. - - - - - Construct a RepeatAttribute - - The number of times to run the test - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - The test command for the RetryAttribute - - - - - Initializes a new instance of the class. - - The inner command. - The number of repetitions - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - Provide actions to execute before and after tests. - - - - - Executed before each test is run - - The test that is going to be run. - - - - Executed after each test is run - - The test that has just been run. - - - - Provides the target for the action attribute - - - - - ParallelizableAttribute is used to mark tests that may be run in parallel. - - - - - Construct a ParallelizableAttribute using default ParallelScope.Self. - - - - - Construct a ParallelizableAttribute with a specified scope. - - The ParallelScope associated with this attribute. - - - - Modify the context to be used for child tests - - The current TestExecutionContext - - - - CultureAttribute is used to mark a test fixture or an - individual method as applying to a particular Culture only. - - - - - Constructor with no cultures specified, for use - with named property syntax. - - - - - Constructor taking one or more cultures - - Comma-deliminted list of cultures - - - - Causes a test to be skipped if this CultureAttribute is not satisfied. - - The test to modify - - - - Tests to determine if the current culture is supported - based on the properties of this attribute. - - True, if the current culture is supported - - - - Test to determine if the a particular culture or comma- - delimited set of cultures is in use. - - Name of the culture or comma-separated list of culture ids - True if the culture is in use on the system - - - - Test to determine if one of a collection of cultures - is being used currently. - - - - - - - The abstract base class for all data-providing attributes - defined by NUnit. Used to select all data sources for a - method, class or parameter. - - - - - Default constructor - - - - - Used to mark a field for use as a datapoint when executing a theory - within the same fixture that requires an argument of the field's Type. - - - - - Used to mark a field, property or method providing a set of datapoints to - be used in executing any theories within the same fixture that require an - argument of the Type provided. The data source may provide an array of - the required Type or an . - Synonymous with DatapointSourceAttribute. - - - - - Used to mark a field, property or method providing a set of datapoints to - be used in executing any theories within the same fixture that require an - argument of the Type provided. The data source may provide an array of - the required Type or an . - Synonymous with DatapointsAttribute. - - - - - Attribute used to provide descriptive text about a - test case or fixture. - - - - - Construct a description Attribute - - The text of the description - - - - ExplicitAttribute marks a test or test fixture so that it will - only be run if explicitly executed from the gui or command line - or if it is included by use of a filter. The test will not be - run simply because an enclosing suite is run. - - - - - Default constructor - - - - - Constructor with a reason - - The reason test is marked explicit - - - - Modifies a test by marking it as explicit. - - The test to modify - - - - Attribute used to mark a test that is to be ignored. - Ignored tests result in a warning message when the - tests are run. - - - - - Constructs the attribute giving a reason for ignoring the test - - The reason for ignoring the test - - - - The date in the future to stop ignoring the test as a string in UTC time. - For example for a date and time, "2014-12-25 08:10:00Z" or for just a date, - "2014-12-25". If just a date is given, the Ignore will expire at midnight UTC. - - - Once the ignore until date has passed, the test will be marked - as runnable. Tests with an ignore until date will have an IgnoreUntilDate - property set which will appear in the test results. - - The string does not contain a valid string representation of a date and time. - - - - Modifies a test by marking it as Ignored. - - The test to modify - - - - Abstract base for Attributes that are used to include tests - in the test run based on environmental settings. - - - - - Constructor with no included items specified, for use - with named property syntax. - - - - - Constructor taking one or more included items - - Comma-delimited list of included items - - - - Name of the item that is needed in order for - a test to run. Multiple items may be given, - separated by a comma. - - - - - Name of the item to be excluded. Multiple items - may be given, separated by a comma. - - - - - The reason for including or excluding the test - - - - - Summary description for MaxTimeAttribute. - - - - - Construct a MaxTimeAttribute, given a time in milliseconds. - - The maximum elapsed time in milliseconds - - - - The abstract base class for all custom attributes defined by NUnit. - - - - - Default constructor - - - - - Marks a test to use a pairwise join of any argument - data provided. Arguments will be combined in such a - way that all possible pairs of arguments are used. - - - - - Default constructor - - - - - The ParallelScope enumeration permits specifying the degree to - which a test and its descendants may be run in parallel. - - - - - No Parallelism is permitted - - - - - The test itself may be run in parallel with others at the same level - - - - - Descendants of the test may be run in parallel with one another - - - - - Descendants of the test down to the level of TestFixtures may be run in parallel - - - - - PlatformAttribute is used to mark a test fixture or an - individual method as applying to a particular platform only. - - - - - Constructor with no platforms specified, for use - with named property syntax. - - - - - Constructor taking one or more platforms - - Comma-delimited list of platforms - - - - Causes a test to be skipped if this PlatformAttribute is not satisfied. - - The test to modify - - - - PropertyAttribute is used to attach information to a test as a name/value pair.. - - - - - Construct a PropertyAttribute with a name and string value - - The name of the property - The property value - - - - Construct a PropertyAttribute with a name and int value - - The name of the property - The property value - - - - Construct a PropertyAttribute with a name and double value - - The name of the property - The property value - - - - Constructor for derived classes that set the - property dictionary directly. - - - - - Constructor for use by derived classes that use the - name of the type as the property name. Derived classes - must ensure that the Type of the property value is - a standard type supported by the BCL. Any custom - types will cause a serialization Exception when - in the client. - - - - - Gets the property dictionary for this attribute - - - - - Modifies a test by adding properties to it. - - The test to modify - - - - RandomAttribute is used to supply a set of random _values - to a single parameter of a parameterized test. - - - - - Construct a random set of values appropriate for the Type of the - parameter on which the attribute appears, specifying only the count. - - - - - - Construct a set of ints within a specified range - - - - - Construct a set of unsigned ints within a specified range - - - - - Construct a set of longs within a specified range - - - - - Construct a set of unsigned longs within a specified range - - - - - Construct a set of shorts within a specified range - - - - - Construct a set of unsigned shorts within a specified range - - - - - Construct a set of doubles within a specified range - - - - - Construct a set of floats within a specified range - - - - - Construct a set of bytes within a specified range - - - - - Construct a set of sbytes within a specified range - - - - - Get the collection of _values to be used as arguments. - - - - - RangeAttribute is used to supply a range of _values to an - individual parameter of a parameterized test. - - - - - Construct a range of ints using default step of 1 - - - - - - - Construct a range of ints specifying the step size - - - - - - - - Construct a range of unsigned ints using default step of 1 - - - - - - - Construct a range of unsigned ints specifying the step size - - - - - - - - Construct a range of longs using a default step of 1 - - - - - - - Construct a range of longs - - - - - - - - Construct a range of unsigned longs using default step of 1 - - - - - - - Construct a range of unsigned longs specifying the step size - - - - - - - - Construct a range of doubles - - - - - - - - Construct a range of floats - - - - - - - - RepeatAttribute may be applied to test case in order - to run it multiple times. - - - - - Construct a RepeatAttribute - - The number of times to run the test - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - The test command for the RepeatAttribute - - - - - Initializes a new instance of the class. - - The inner command. - The number of repetitions - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - Marks a test that must run in the MTA, causing it - to run in a separate thread if necessary. - - On methods, you may also use MTAThreadAttribute - to serve the same purpose. - - - - - Construct a RequiresMTAAttribute - - - - - Marks a test that must run in the STA, causing it - to run in a separate thread if necessary. - - - - - Construct a RequiresSTAAttribute - - - - - Marks a test that must run on a separate thread. - - - - - Construct a RequiresThreadAttribute - - - - - Construct a RequiresThreadAttribute, specifying the apartment - - - - - Marks a test to use a Sequential join of any argument - data provided. Arguments will be combined into test cases, - taking the next value of each argument until all are used. - - - - - Default constructor - - - - - Summary description for SetCultureAttribute. - - - - - Construct given the name of a culture - - - - - - Summary description for SetUICultureAttribute. - - - - - Construct given the name of a culture - - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - SetUpFixtureAttribute is used to identify a SetUpFixture - - - - - Build a SetUpFixture from type provided. Normally called for a Type - on which the attribute has been placed. - - The type info of the fixture to be used. - A SetUpFixture object as a TestSuite. - - - - Attribute used to identify a method that is called - immediately after each test is run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Adding this attribute to a method within a - class makes the method callable from the NUnit test runner. There is a property - called Description which is optional which you can provide a more detailed test - description. This class cannot be inherited. - - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - public void TestDescriptionMethod() - {} - } - - - - - - Descriptive text for this test - - - - - The author of this test - - - - - The type that this test is testing - - - - - Modifies a test by adding a description, if not already set. - - The test to modify - - - - Gets or sets the expected result. - - The result. - - - - Returns true if an expected result has been set - - - - - Construct a TestMethod from a given method. - - The method for which a test is to be constructed. - The suite to which the test will be added. - A TestMethod - - - - TestCaseAttribute is used to mark parameterized test cases - and provide them with their arguments. - - - - - Construct a TestCaseAttribute with a list of arguments. - This constructor is not CLS-Compliant - - - - - - Construct a TestCaseAttribute with a single argument - - - - - - Construct a TestCaseAttribute with a two arguments - - - - - - - Construct a TestCaseAttribute with a three arguments - - - - - - - - Gets or sets the name of the test. - - The name of the test. - - - - Gets or sets the RunState of this test case. - - - - - Gets the list of arguments to a test case - - - - - Gets the properties of the test case - - - - - Gets or sets the expected result. - - The result. - - - - Returns true if the expected result has been set - - - - - Gets or sets the description. - - The description. - - - - The author of this test - - - - - The type that this test is testing - - - - - Gets or sets the reason for ignoring the test - - - - - Gets or sets a value indicating whether this is explicit. - - - true if explicit; otherwise, false. - - - - - Gets or sets the reason for not running the test. - - The reason. - - - - Gets or sets the ignore reason. When set to a non-null - non-empty value, the test is marked as ignored. - - The ignore reason. - - - - Comma-delimited list of platforms to run the test for - - - - - Comma-delimited list of platforms to not run the test for - - - - - Gets and sets the category for this test case. - May be a comma-separated list of categories. - - - - - Performs several special conversions allowed by NUnit in order to - permit arguments with types that cannot be used in the constructor - of an Attribute such as TestCaseAttribute or to simplify their use. - - The arguments to be converted - The ParameterInfo array for the method - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The MethodInfo for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - TestCaseSourceAttribute indicates the source to be used to - provide test cases for a test method. - - - - - Construct with the name of the method, property or field that will provide data - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - Construct with a Type - - The type that will provide data - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets or sets the category associated with every fixture created from - this attribute. May be a single category or a comma-separated list. - - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The IMethod for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - Returns a set of ITestCaseDataItems for use as arguments - to a parameterized test method. - - The method for which data is needed. - - - - - TestFixtureAttribute is used to mark a class that represents a TestFixture. - - - - - Default constructor - - - - - Construct with a object[] representing a set of arguments. - In .NET 2.0, the arguments may later be separated into - type arguments and constructor arguments. - - - - - - Gets or sets the name of the test. - - The name of the test. - - - - Gets or sets the RunState of this test fixture. - - - - - The arguments originally provided to the attribute - - - - - Properties pertaining to this fixture - - - - - Get or set the type arguments. If not set - explicitly, any leading arguments that are - Types are taken as type arguments. - - - - - Descriptive text for this fixture - - - - - The author of this fixture - - - - - The type that this fixture is testing - - - - - Gets or sets the ignore reason. May set RunState as a side effect. - - The ignore reason. - - - - Gets or sets the reason for not running the fixture. - - The reason. - - - - Gets or sets the ignore reason. When set to a non-null - non-empty value, the test is marked as ignored. - - The ignore reason. - - - - Gets or sets a value indicating whether this is explicit. - - - true if explicit; otherwise, false. - - - - - Gets and sets the category for this fixture. - May be a comma-separated list of categories. - - - - - Build a fixture from type provided. Normally called for a Type - on which the attribute has been placed. - - The type info of the fixture to be used. - A an IEnumerable holding one TestFixture object. - - - - Attribute used to identify a method that is - called before any tests in a fixture are run. - - - - - TestCaseSourceAttribute indicates the source to be used to - provide test fixture instances for a test class. - - - - - Error message string is public so the tests can use it - - - - - Construct with the name of the method, property or field that will provide data - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - Construct with a Type - - The type that will provide data - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets or sets the category associated with every fixture created from - this attribute. May be a single category or a comma-separated list. - - - - - Construct one or more TestFixtures from a given Type, - using available parameter data. - - The TypeInfo for which fixures are to be constructed. - One or more TestFixtures as TestSuite - - - - Returns a set of ITestFixtureData items for use as arguments - to a parameterized test fixture. - - The type for which data is needed. - - - - - Attribute used to identify a method that is called after - all the tests in a fixture have run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Indicates which class the test or test fixture is testing - - - - - Initializes a new instance of the class. - - The type that is being tested. - - - - Initializes a new instance of the class. - - The type that is being tested. - - - - Adding this attribute to a method within a - class makes the method callable from the NUnit test runner. There is a property - called Description which is optional which you can provide a more detailed test - description. This class cannot be inherited. - - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - public void TestDescriptionMethod() - {} - } - - - - - - Construct the attribute, specifying a combining strategy and source of parameter data. - - - - - Used on a method, marks the test with a timeout value in milliseconds. - The test will be run in a separate thread and is cancelled if the timeout - is exceeded. Used on a class or assembly, sets the default timeout - for all contained test methods. - - - - - Construct a TimeoutAttribute given a time in milliseconds - - The timeout value in milliseconds - - - - ValuesAttribute is used to provide literal arguments for - an individual parameter of a test. - - - - - The collection of data to be returned. Must - be set by any derived attribute classes. - We use an object[] so that the individual - elements may have their type changed in GetData - if necessary - - - - - Constructs for use with an Enum parameter. Will pass every enum - value in to the test. - - - - - Construct with one argument - - - - - - Construct with two arguments - - - - - - - Construct with three arguments - - - - - - - - Construct with an array of arguments - - - - - - Get the collection of _values to be used as arguments - - - - - ValueSourceAttribute indicates the source to be used to - provide data for one parameter of a test method. - - - - - Construct with the name of the factory - for use with languages - that don't support params arrays. - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - for use with languages - that don't support params arrays. - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets an enumeration of data items for use as arguments - for a test method parameter. - - The parameter for which data is needed - - An enumeration containing individual data items - - - - - A set of Assert methods operating on one or more collections - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Asserts that all items contained in collection are of the type specified by expectedType. - - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - - - - Asserts that all items contained in collection are of the type specified by expectedType. - - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that all items contained in collection are not equal to null. - - IEnumerable containing objects to be considered - - - - Asserts that all items contained in collection are not equal to null. - - IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Ensures that every object contained in collection exists within the collection - once and only once. - - IEnumerable of objects to be considered - - - - Ensures that every object contained in collection exists within the collection - once and only once. - - IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not exactly equal. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - - - - Asserts that expected and actual are not exactly equal. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not equivalent. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are not equivalent. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that collection contains actual as an item. - - IEnumerable of objects to be considered - Object to be found within collection - - - - Asserts that collection contains actual as an item. - - IEnumerable of objects to be considered - Object to be found within collection - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that collection does not contain actual as an item. - - IEnumerable of objects to be considered - Object that cannot exist within collection - - - - Asserts that collection does not contain actual as an item. - - IEnumerable of objects to be considered - Object that cannot exist within collection - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the superset does not contain the subset - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - - - - Asserts that the superset does not contain the subset - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the superset contains the subset. - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - - - - Asserts that the superset contains the subset. - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the subset does not contain the superset - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - - - - Asserts that the subset does not contain the superset - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the subset contains the superset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - - - - Asserts that the subset contains the superset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array,list or other collection is empty - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array,list or other collection is empty - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - - - - Provides a platform-independent methods for getting attributes - for use by AttributeConstraint and AttributeExistsConstraint. - - - - - Gets the custom attributes from the given object. - - Portable libraries do not have an ICustomAttributeProvider, so we need to cast to each of - it's direct subtypes and try to get attributes off those instead. - The actual. - Type of the attribute. - if set to true [inherit]. - A list of the given attribute on the given object. - - - - A MarshalByRefObject that lives forever - - - - - Obtains a lifetime service object to control the lifetime policy for this instance. - - - - - Provides NUnit specific extensions to aid in Reflection - across multiple frameworks - - - This version of the class supplies GetTypeInfo() on platforms - that don't support it. - - - - - GetTypeInfo gives access to most of the Type information we take for granted - on .NET Core and Windows Runtime. Rather than #ifdef different code for different - platforms, it is easiest to just code all platforms as if they worked this way, - thus the simple passthrough. - - - - - - - This class is a System.Diagnostics.Stopwatch on operating systems that support it. On those that don't, - it replicates the functionality at the resolution supported. - - - - - AllItemsConstraint applies another constraint to each - item in a collection, succeeding if they all succeed. - - - - - Construct an AllItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - failing if any item fails. - - - - - - - AndConstraint succeeds only if both members succeed. - - - - - Create an AndConstraint from two other constraints - - The first constraint - The second constraint - - - - Gets text describing a constraint - - - - - Apply both member constraints to an actual value, succeeding - succeeding only if both of them succeed. - - The actual value - True if the constraints both succeeded - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - AssignableFromConstraint is used to test that an object - can be assigned from a given Type. - - - - - Construct an AssignableFromConstraint for the type provided - - - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - AssignableToConstraint is used to test that an object - can be assigned to a given Type. - - - - - Construct an AssignableToConstraint for the type provided - - - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - AttributeConstraint tests that a specified attribute is present - on a Type or other provider and that the value of the attribute - satisfies some other constraint. - - - - - Constructs an AttributeConstraint for a specified attribute - Type and base constraint. - - - - - - - Determines whether the Type or other provider has the - expected attribute and if its value matches the - additional constraint specified. - - - - - Returns a string representation of the constraint. - - - - - AttributeExistsConstraint tests for the presence of a - specified attribute on a Type. - - - - - Constructs an AttributeExistsConstraint for a specific attribute Type - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Tests whether the object provides the expected attribute. - - A Type, MethodInfo, or other ICustomAttributeProvider - True if the expected attribute is present, otherwise false - - - - BinaryConstraint is the abstract base of all constraints - that combine two other constraints in some fashion. - - - - - The first constraint being combined - - - - - The second constraint being combined - - - - - Construct a BinaryConstraint from two other constraints - - The first constraint - The second constraint - - - - BinarySerializableConstraint tests whether - an object is serializable in binary format. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Returns the string representation - - - - - CollectionConstraint is the abstract base class for - constraints that operate on collections. - - - - - Construct an empty CollectionConstraint - - - - - Construct a CollectionConstraint - - - - - - Determines whether the specified enumerable is empty. - - The enumerable. - - true if the specified enumerable is empty; otherwise, false. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Protected method to be implemented by derived classes - - - - - - - CollectionContainsConstraint is used to test whether a collection - contains an expected object as a member. - - - - - Construct a CollectionContainsConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Gets the expected object - - - - - Test whether the expected item is contained in the collection - - - - - - - CollectionEquivalentConstraint is used to determine whether two - collections are equivalent. - - - - - Construct a CollectionEquivalentConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether two collections are equivalent - - - - - - - CollectionItemsEqualConstraint is the abstract base class for all - collection constraints that apply some notion of item equality - as a part of their operation. - - - - - Construct an empty CollectionConstraint - - - - - Construct a CollectionConstraint - - - - - - Flag the constraint to ignore case and return self. - - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied Comparison object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Compares two collection members for equality - - - - - Return a new CollectionTally for use in making tests - - The collection to be included in the tally - - - - CollectionOrderedConstraint is used to test whether a collection is ordered. - - - - - Construct a CollectionOrderedConstraint - - - - - If used performs a reverse comparison - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use a and returns self. - - - - - Modifies the constraint to test ordering by the value of - a specified property and returns self. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the collection is ordered - - - - - - - Returns the string representation of the constraint. - - - - - - CollectionSupersetConstraint is used to determine whether - one collection is a superset of another - - - - - Construct a CollectionSupersetConstraint - - The collection that the actual value is expected to be a superset of - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the actual collection is a superset of - the expected collection provided. - - - - - - - CollectionSubsetConstraint is used to determine whether - one collection is a subset of another - - - - - Construct a CollectionSubsetConstraint - - The collection that the actual value is expected to be a subset of - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the actual collection is a subset of - the expected collection provided. - - - - - - - CollectionTally counts (tallies) the number of - occurrences of each object in one or more enumerations. - - - - - Construct a CollectionTally object from a comparer and a collection - - - - - The number of objects remaining in the tally - - - - - Try to remove an object from the tally - - The object to remove - True if successful, false if the object was not found - - - - Try to remove a set of objects from the tally - - The objects to remove - True if successful, false if any object was not found - - - - ComparisonAdapter class centralizes all comparisons of - _values in NUnit, adapting to the use of any provided - , - or . - - - - - Gets the default ComparisonAdapter, which wraps an - NUnitComparer object. - - - - - Returns a ComparisonAdapter that wraps an - - - - - Returns a ComparisonAdapter that wraps an - - - - - Returns a ComparisonAdapter that wraps a - - - - - Compares two objects - - - - - Construct a default ComparisonAdapter - - - - - Construct a ComparisonAdapter for an - - - - - Compares two objects - - - - - - - - ComparerAdapter extends and - allows use of an or - to actually perform the comparison. - - - - - Construct a ComparisonAdapter for an - - - - - Compare a Type T to an object - - - - - Construct a ComparisonAdapter for a - - - - - Compare a Type T to an object - - - - - Abstract base class for constraints that compare _values to - determine if one is greater than, equal to or less than - the other. - - - - - The value against which a comparison is to be made - - - - - If true, less than returns success - - - - - if true, equal returns success - - - - - if true, greater than returns success - - - - - ComparisonAdapter to be used in making the comparison - - - - - Initializes a new instance of the class. - - The value against which to make a comparison. - if set to true less succeeds. - if set to true equal succeeds. - if set to true greater succeeds. - String used in describing the constraint. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Modifies the constraint to use an and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Modifies the constraint to use an and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Modifies the constraint to use a and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Delegate used to delay evaluation of the actual value - to be used in evaluating a constraint - - - - - The Constraint class is the base of all built-in constraints - within NUnit. It provides the operator overloads used to combine - constraints. - - - - - Construct a constraint with optional arguments - - Arguments to be saved - - - - The display name of this Constraint for use by ToString(). - The default value is the name of the constraint with - trailing "Constraint" removed. Derived classes may set - this to another name in their constructors. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Arguments provided to this Constraint, for use in - formatting the description. - - - - - The ConstraintBuilder holding this constraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - Test whether the constraint is satisfied by a given reference. - The default implementation simply dereferences the value but - derived classes may override it to provide for delayed processing. - - A reference to the value to be tested - A ConstraintResult - - - - Default override of ToString returns the constraint DisplayName - followed by any arguments within angle brackets. - - - - - - Returns the string representation of this constraint - - - - - This operator creates a constraint that is satisfied only if both - argument constraints are satisfied. - - - - - This operator creates a constraint that is satisfied if either - of the argument constraints is satisfied. - - - - - This operator creates a constraint that is satisfied if the - argument constraint is not satisfied. - - - - - Returns a ConstraintExpression by appending And - to the current constraint. - - - - - Returns a ConstraintExpression by appending And - to the current constraint. - - - - - Returns a ConstraintExpression by appending Or - to the current constraint. - - - - - Returns a DelayedConstraint with the specified delay time. - - The delay in milliseconds. - - - - - Returns a DelayedConstraint with the specified delay time - and polling interval. - - The delay in milliseconds. - The interval at which to test the constraint. - - - - - Resolves any pending operators and returns the resolved constraint. - - - - - ConstraintBuilder maintains the stacks that are used in - processing a ConstraintExpression. An OperatorStack - is used to hold operators that are waiting for their - operands to be reorganized. a ConstraintStack holds - input constraints as well as the results of each - operator applied. - - - - - OperatorStack is a type-safe stack for holding ConstraintOperators - - - - - Initializes a new instance of the class. - - The ConstraintBuilder using this stack. - - - - Gets a value indicating whether this is empty. - - true if empty; otherwise, false. - - - - Gets the topmost operator without modifying the stack. - - - - - Pushes the specified operator onto the stack. - - The operator to put onto the stack. - - - - Pops the topmost operator from the stack. - - The topmost operator on the stack - - - - ConstraintStack is a type-safe stack for holding Constraints - - - - - Initializes a new instance of the class. - - The ConstraintBuilder using this stack. - - - - Gets a value indicating whether this is empty. - - true if empty; otherwise, false. - - - - Pushes the specified constraint. As a side effect, - the constraint's Builder field is set to the - ConstraintBuilder owning this stack. - - The constraint to put onto the stack - - - - Pops this topmost constraint from the stack. - As a side effect, the constraint's Builder - field is set to null. - - The topmost contraint on the stack - - - - Initializes a new instance of the class. - - - - - Appends the specified operator to the expression by first - reducing the operator stack and then pushing the new - operator on the stack. - - The operator to push. - - - - Appends the specified constraint to the expression by pushing - it on the constraint stack. - - The constraint to push. - - - - Sets the top operator right context. - - The right context. - - - - Reduces the operator stack until the topmost item - precedence is greater than or equal to the target precedence. - - The target precedence. - - - - Resolves this instance, returning a Constraint. If the Builder - is not currently in a resolvable state, an exception is thrown. - - The resolved constraint - - - - Gets a value indicating whether this instance is resolvable. - - - true if this instance is resolvable; otherwise, false. - - - - - ConstraintExpression represents a compound constraint in the - process of being constructed from a series of syntactic elements. - - Individual elements are appended to the expression as they are - reorganized. When a constraint is appended, it is returned as the - value of the operation so that modifiers may be applied. However, - any partially built expression is attached to the constraint for - later resolution. When an operator is appended, the partial - expression is returned. If it's a self-resolving operator, then - a ResolvableConstraintExpression is returned. - - - - - The ConstraintBuilder holding the elements recognized so far - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the - class passing in a ConstraintBuilder, which may be pre-populated. - - The builder. - - - - Returns a string representation of the expression as it - currently stands. This should only be used for testing, - since it has the side-effect of resolving the expression. - - - - - - Appends an operator to the expression and returns the - resulting expression itself. - - - - - Appends a self-resolving operator to the expression and - returns a new ResolvableConstraintExpression. - - - - - Appends a constraint to the expression and returns that - constraint, which is associated with the current state - of the expression being built. Note that the constraint - is not reduced at this time. For example, if there - is a NotOperator on the stack we don't reduce and - return a NotConstraint. The original constraint must - be returned because it may support modifiers that - are yet to be applied. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - With is currently a NOP - reserved for future use. - - - - - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. - - - - - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests whether an object graph is serializable in binary format. - - - - - Returns a constraint that tests whether an object graph is serializable in xml format. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the a subpath of the expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the actual value falls - within a specified range. - - - - - Returns a constraint that succeeds if the value - is a file or directory and it exists. - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests whether an object graph is serializable in binary format. - - - - - Returns a constraint that tests whether an object graph is serializable in xml format. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that fails if the actual - value matches the pattern supplied as an argument. - - - - - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is a subpath of the expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the actual value falls - within a specified range. - - - - - ConstraintStatus represents the status of a ConstraintResult - returned by a Constraint being applied to an actual value. - - - - - The status has not yet been set - - - - - The constraint succeeded - - - - - The constraint failed - - - - - An error occured in applying the constraint (reserved for future use) - - - - - Contain the result of matching a against an actual value. - - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - The status of the new ConstraintResult. - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - If true, applies a status of Success to the result, otherwise Failure. - - - - The actual value that was passed to the method. - - - - - Gets and sets the ResultStatus for this result. - - - - - True if actual value meets the Constraint criteria otherwise false. - - - - - Display friendly name of the constraint. - - - - - Description of the constraint may be affected by the state the constraint had - when was performed against the actual value. - - - - - Write the failure message to the MessageWriter provided - as an argument. The default implementation simply passes - the result and the actual value to the writer, which - then displays the constraint description and the value. - - Constraints that need to provide additional details, - such as where the error occured can override this. - - The MessageWriter on which to display the message - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - ContainsConstraint tests a whether a string contains a substring - or a collection contains an object. It postpones the decision of - which test to use until the type of the actual argument is known. - This allows testing whether a string is contained in a collection - or as a substring of another string using the same syntax. - - - - - Initializes a new instance of the class. - - The _expected. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Flag the constraint to ignore case and return self. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Applies a delay to the match so that a match can be evaluated in the future. - - - - - Creates a new DelayedConstraint - - The inner constraint to decorate - The time interval after which the match is performed - If the value of is less than 0 - - - - Creates a new DelayedConstraint - - The inner constraint to decorate - The time interval after which the match is performed, in milliseconds - The time interval used for polling, in milliseconds - If the value of is less than 0 - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for if the base constraint fails, false if it succeeds - - - - Test whether the constraint is satisfied by a delegate - - The delegate whose value is to be tested - A ConstraintResult - - - - Test whether the constraint is satisfied by a given reference. - Overridden to wait for the specified delay period before - calling the base constraint with the dereferenced value. - - A reference to the value to be tested - True for success, false for failure - - - - Returns the string representation of the constraint. - - - - - Adjusts a Timestamp by a given TimeSpan - - - - - - - - Returns the difference between two Timestamps as a TimeSpan - - - - - - - - DictionaryContainsKeyConstraint is used to test whether a dictionary - contains an expected object as a key. - - - - - Construct a DictionaryContainsKeyConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the expected key is contained in the dictionary - - - - - DictionaryContainsValueConstraint is used to test whether a dictionary - contains an expected object as a value. - - - - - Construct a DictionaryContainsValueConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the expected value is contained in the dictionary - - - - - EmptyCollectionConstraint tests whether a collection is empty. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Check that the collection is empty - - - - - - - EmptyConstraint tests a whether a string or collection is empty, - postponing the decision about which test is applied until the - type of the actual argument is known. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - EmptyDirectoryConstraint is used to test that a directory is empty - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - EmptyStringConstraint tests whether a string is empty. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - EndsWithConstraint can test whether a string ends - with an expected substring. - - - - - Initializes a new instance of the class. - - The expected string - - - - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. - - - - - - - EqualConstraint is able to compare an actual value with the - expected value provided in its constructor. Two objects are - considered equal if both are null, or if both have the same - value. NUnit has special semantics for some object types. - - - - - NUnitEqualityComparer used to test equality. - - - - - Initializes a new instance of the class. - - The expected value. - - - - Gets the tolerance for this comparison. - - - The tolerance. - - - - - Gets a value indicating whether to compare case insensitive. - - - true if comparing case insensitive; otherwise, false. - - - - - Gets a value indicating whether or not to clip strings. - - - true if set to clip strings otherwise, false. - - - - - Gets the failure points. - - - The failure points. - - - - - Flag the constraint to ignore case and return self. - - - - - Flag the constraint to suppress string clipping - and return self. - - - - - Flag the constraint to compare arrays as collections - and return self. - - - - - Flag the constraint to use a tolerance when determining equality. - - Tolerance value to be used - Self. - - - - Flags the constraint to include - property in comparison of two values. - - - Using this modifier does not allow to use the - constraint modifier. - - - - - Switches the .Within() modifier to interpret its tolerance as - a distance in representable _values (see remarks). - - Self. - - Ulp stands for "unit in the last place" and describes the minimum - amount a given value can change. For any integers, an ulp is 1 whole - digit. For floating point _values, the accuracy of which is better - for smaller numbers and worse for larger numbers, an ulp depends - on the size of the number. Using ulps for comparison of floating - point results instead of fixed tolerances is safer because it will - automatically compensate for the added inaccuracy of larger numbers. - - - - - Switches the .Within() modifier to interpret its tolerance as - a percentage that the actual _values is allowed to deviate from - the expected value. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in days. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in hours. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in minutes. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in seconds. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in milliseconds. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in clock ticks. - - Self - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied Comparison object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - EqualityAdapter class handles all equality comparisons - that use an , - or a . - - - - - Compares two objects, returning true if they are equal - - - - - Returns true if the two objects can be compared by this adapter. - The base adapter cannot handle IEnumerables except for strings. - - - - - Returns an that wraps an . - - - - - that wraps an . - - - - - Returns an that wraps an . - - - - - Returns true if the two objects can be compared by this adapter. - Generic adapter requires objects of the specified type. - - - - - Returns an that wraps an . - - - - - Returns an that wraps an . - - - - - that wraps an . - - - - - Returns an that wraps a . - - - - - ExactTypeConstraint is used to test that an object - is of the exact type provided in the constructor - - - - - Construct an ExactTypeConstraint for a given Type - - The expected Type. - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - FalseConstraint tests that the actual value is false - - - - - Initializes a new instance of the class. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - FileExistsConstraint is used to determine if a file exists - - - - - Initializes a new instance of the class. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - FileOrDirectoryExistsConstraint is used to determine if a file or directory exists - - - - - If true, the constraint will only check if files exist, not directories - - - - - If true, the constraint will only check if directories exist, not files - - - - - Initializes a new instance of the class that - will check files and directories. - - - - - Initializes a new instance of the class that - will only check files if ignoreDirectories is true. - - if set to true [ignore directories]. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - Helper routines for working with floating point numbers - - - The floating point comparison code is based on this excellent article: - http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm - - - "ULP" means Unit in the Last Place and in the context of this library refers to - the distance between two adjacent floating point numbers. IEEE floating point - numbers can only represent a finite subset of natural numbers, with greater - accuracy for smaller numbers and lower accuracy for very large numbers. - - - If a comparison is allowed "2 ulps" of deviation, that means the _values are - allowed to deviate by up to 2 adjacent floating point _values, which might be - as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. - - - - - Union of a floating point variable and an integer - - - The union's value as a floating point variable - - - The union's value as an integer - - - The union's value as an unsigned integer - - - Union of a double precision floating point variable and a long - - - The union's value as a double precision floating point variable - - - The union's value as a long - - - The union's value as an unsigned long - - - Compares two floating point _values for equality - First floating point value to be compared - Second floating point value t be compared - - Maximum number of representable floating point _values that are allowed to - be between the left and the right floating point _values - - True if both numbers are equal or close to being equal - - - Floating point _values can only represent a finite subset of natural numbers. - For example, the _values 2.00000000 and 2.00000024 can be stored in a float, - but nothing inbetween them. - - - This comparison will count how many possible floating point _values are between - the left and the right number. If the number of possible _values between both - numbers is less than or equal to maxUlps, then the numbers are considered as - being equal. - - - Implementation partially follows the code outlined here: - http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ - - - - - Compares two double precision floating point _values for equality - First double precision floating point value to be compared - Second double precision floating point value t be compared - - Maximum number of representable double precision floating point _values that are - allowed to be between the left and the right double precision floating point _values - - True if both numbers are equal or close to being equal - - - Double precision floating point _values can only represent a limited series of - natural numbers. For example, the _values 2.0000000000000000 and 2.0000000000000004 - can be stored in a double, but nothing inbetween them. - - - This comparison will count how many possible double precision floating point - _values are between the left and the right number. If the number of possible - _values between both numbers is less than or equal to maxUlps, then the numbers - are considered as being equal. - - - Implementation partially follows the code outlined here: - http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ - - - - - - Reinterprets the memory contents of a floating point value as an integer value - - - Floating point value whose memory contents to reinterpret - - - The memory contents of the floating point value interpreted as an integer - - - - - Reinterprets the memory contents of a double precision floating point - value as an integer value - - - Double precision floating point value whose memory contents to reinterpret - - - The memory contents of the double precision floating point value - interpreted as an integer - - - - - Reinterprets the memory contents of an integer as a floating point value - - Integer value whose memory contents to reinterpret - - The memory contents of the integer value interpreted as a floating point value - - - - - Reinterprets the memory contents of an integer value as a double precision - floating point value - - Integer whose memory contents to reinterpret - - The memory contents of the integer interpreted as a double precision - floating point value - - - - - Tests whether a value is greater than the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Tests whether a value is greater than or equal to the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Interface for all constraints - - - - - The display name of this Constraint for use by ToString(). - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Arguments provided to this Constraint, for use in - formatting the description. - - - - - The ConstraintBuilder holding this constraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - Test whether the constraint is satisfied by a given reference. - The default implementation simply dereferences the value but - derived classes may override it to provide for delayed processing. - - A reference to the value to be tested - A ConstraintResult - - - - InstanceOfTypeConstraint is used to test that an object - is of the same type provided or derived from it. - - - - - Construct an InstanceOfTypeConstraint for the type provided - - The expected Type - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - The IResolveConstraint interface is implemented by all - complete and resolvable constraints and expressions. - - - - - Return the top-level constraint for this expression - - - - - - Tests whether a value is less than the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Tests whether a value is less than or equal to the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - MessageWriter is the abstract base for classes that write - constraint descriptions and messages in some form. The - class has separate methods for writing various components - of a message, allowing implementations to tailor the - presentation as needed. - - - - - Construct a MessageWriter given a culture - - - - - Abstract method to get the max line length - - - - - Method to write single line message with optional args, usually - written to precede the general failure message. - - The message to be written - Any arguments used in formatting the message - - - - Method to write single line message with optional args, usually - written to precede the general failure message, at a givel - indentation level. - - The indentation level of the message - The message to be written - Any arguments used in formatting the message - - - - Display Expected and Actual lines for a constraint. This - is called by MessageWriter's default implementation of - WriteMessageTo and provides the generic two-line display. - - The failing constraint result - - - - Display Expected and Actual lines for given _values. This - method may be called by constraints that need more control over - the display of actual and expected _values than is provided - by the default implementation. - - The expected value - The actual value causing the failure - - - - Display Expected and Actual lines for given _values, including - a tolerance value on the Expected line. - - The expected value - The actual value causing the failure - The tolerance within which the test was made - - - - Display the expected and actual string _values on separate lines. - If the mismatch parameter is >=0, an additional line is displayed - line containing a caret that points to the mismatch point. - - The expected string value - The actual string value - The point at which the strings don't match or -1 - If true, case is ignored in locating the point where the strings differ - If true, the strings should be clipped to fit the line - - - - Writes the text for an actual value. - - The actual value. - - - - Writes the text for a generalized value. - - The value. - - - - Writes the text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Static methods used in creating messages - - - - - Static string used when strings are clipped - - - - - Formatting strings used for expected and actual _values - - - - - Formats text to represent a generalized value. - - The value - The formatted text - - - - Formats text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Returns the representation of a type as used in NUnitLite. - This is the same as Type.ToString() except for arrays, - which are displayed with their declared sizes. - - - - - - - Converts any control characters in a string - to their escaped representation. - - The string to be converted - The converted string - - - - Return the a string representation for a set of indices into an array - - Array of indices for which a string is needed - - - - Get an array of indices representing the point in a collection or - array corresponding to a single int index into the collection. - - The collection to which the indices apply - Index in the collection - Array of indices - - - - Clip a string to a given length, starting at a particular offset, returning the clipped - string with ellipses representing the removed parts - - The string to be clipped - The maximum permitted length of the result string - The point at which to start clipping - The clipped string - - - - Clip the expected and actual strings in a coordinated fashion, - so that they may be displayed together. - - - - - - - - - Shows the position two strings start to differ. Comparison - starts at the start index. - - The expected string - The actual string - The index in the strings at which comparison should start - Boolean indicating whether case should be ignored - -1 if no mismatch found, or the index where mismatch found - - - - NaNConstraint tests that the actual value is a double or float NaN - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test that the actual value is an NaN - - - - - - - NoItemConstraint applies another constraint to each - item in a collection, failing if any of them succeeds. - - - - - Construct a SomeItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - failing if any item fails. - - - - - - - NotConstraint negates the effect of some other constraint - - - - - Initializes a new instance of the class. - - The base constraint to be negated. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for if the base constraint fails, false if it succeeds - - - - NullConstraint tests that the actual value is null - - - - - Initializes a new instance of the class. - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - The Numerics class contains common operations on numeric _values. - - - - - Checks the type of the object, returning true if - the object is a numeric type. - - The object to check - true if the object is a numeric type - - - - Checks the type of the object, returning true if - the object is a floating point numeric type. - - The object to check - true if the object is a floating point numeric type - - - - Checks the type of the object, returning true if - the object is a fixed point numeric type. - - The object to check - true if the object is a fixed point numeric type - - - - Test two numeric _values for equality, performing the usual numeric - conversions and using a provided or default tolerance. If the tolerance - provided is Empty, this method may set it to a default tolerance. - - The expected value - The actual value - A reference to the tolerance in effect - True if the _values are equal - - - - Compare two numeric _values, performing the usual numeric conversions. - - The expected value - The actual value - The relationship of the _values to each other - - - - NUnitComparer encapsulates NUnit's default behavior - in comparing two objects. - - - - - Returns the default NUnitComparer. - - - - - Compares two objects - - - - - - - - NUnitEqualityComparer encapsulates NUnit's handling of - equality tests between objects. - - - - - If true, all string comparisons will ignore case - - - - - If true, arrays will be treated as collections, allowing - those of different dimensions to be compared - - - - - Comparison objects used in comparisons for some constraints. - - - - - List of points at which a failure occurred. - - - - - Returns the default NUnitEqualityComparer - - - - - Gets and sets a flag indicating whether case should - be ignored in determining equality. - - - - - Gets and sets a flag indicating that arrays should be - compared as collections, without regard to their shape. - - - - - Gets the list of external comparers to be used to - test for equality. They are applied to members of - collections, in place of NUnit's own logic. - - - - - Gets the list of failure points for the last Match performed. - The list consists of objects to be interpreted by the caller. - This generally means that the caller may only make use of - objects it has placed on the list at a particular depthy. - - - - - Flags the comparer to include - property in comparison of two values. - - - Using this modifier does not allow to use the - modifier. - - - - - Compares two objects for equality within a tolerance. - - - - - Helper method to compare two arrays - - - - - Method to compare two DirectoryInfo objects - - first directory to compare - second directory to compare - true if equivalent, false if not - - - - FailurePoint class represents one point of failure - in an equality test. - - - - - The location of the failure - - - - - The expected value - - - - - The actual value - - - - - Indicates whether the expected value is valid - - - - - Indicates whether the actual value is valid - - - - - Represents a constraint that succeeds if all the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - they all succeed. - - - - - Operator that requires both it's arguments to succeed - - - - - Construct an AndOperator - - - - - Apply the operator to produce an AndConstraint - - - - - Operator that tests for the presence of a particular attribute - on a type and optionally applies further tests to the attribute. - - - - - Construct an AttributeOperator for a particular Type - - The Type of attribute tested - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - Abstract base class for all binary operators - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Gets the left precedence of the operator - - - - - Gets the right precedence of the operator - - - - - Abstract method that produces a constraint by applying - the operator to its left and right constraint arguments. - - - - - Abstract base for operators that indicate how to - apply a constraint to items in a collection. - - - - - Constructs a CollectionOperator - - - - - The ConstraintOperator class is used internally by a - ConstraintBuilder to represent an operator that - modifies or combines constraints. - - Constraint operators use left and right precedence - _values to determine whether the top operator on the - stack should be reduced before pushing a new operator. - - - - - The precedence value used when the operator - is about to be pushed to the stack. - - - - - The precedence value used when the operator - is on the top of the stack. - - - - - The syntax element preceding this operator - - - - - The syntax element following this operator - - - - - The precedence value used when the operator - is about to be pushed to the stack. - - - - - The precedence value used when the operator - is on the top of the stack. - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Represents a constraint that succeeds if none of the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. - - - - - Negates the test of the constraint it wraps. - - - - - Constructs a new NotOperator - - - - - Returns a NotConstraint applied to its argument. - - - - - Operator that requires at least one of it's arguments to succeed - - - - - Construct an OrOperator - - - - - Apply the operator to produce an OrConstraint - - - - - PrefixOperator takes a single constraint and modifies - it's action in some way. - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Returns the constraint created by applying this - prefix to another constraint. - - - - - - - Operator used to test for the presence of a named Property - on an object and optionally apply further tests to the - value of that property. - - - - - Gets the name of the property to which the operator applies - - - - - Constructs a PropOperator for a particular named property - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Abstract base class for operators that are able to reduce to a - constraint whether or not another syntactic element follows. - - - - - Represents a constraint that succeeds if any of the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - any of them succeed. - - - - - Operator that tests that an exception is thrown and - optionally applies further tests to the exception. - - - - - Construct a ThrowsOperator - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - Represents a constraint that simply wraps the - constraint provided as an argument, without any - further functionality, but which modifies the - order of evaluation because of its precedence. - - - - - Constructor for the WithOperator - - - - - Returns a constraint that wraps its argument - - - - - OrConstraint succeeds if either member succeeds - - - - - Create an OrConstraint from two other constraints - - The first constraint - The second constraint - - - - Gets text describing a constraint - - - - - Apply the member constraints to an actual value, succeeding - succeeding as soon as one of them succeeds. - - The actual value - True if either constraint succeeded - - - - PathConstraint serves as the abstract base of constraints - that operate on paths and provides several helper methods. - - - - - Construct a PathConstraint for a give expected path - - The expected path - - - - Modifies the current instance to be case-sensitive - and returns it. - - - - - Returns the string representation of this constraint - - - - - Canonicalize the provided path - - - The path in standardized form - - - - Test whether one path in canonical form is a subpath of another path - - The first path - supposed to be the parent path - The second path - supposed to be the child path - - - - - Predicate constraint wraps a Predicate in a constraint, - returning success if the predicate is true. - - - - - Construct a PredicateConstraint from a predicate - - - - - Gets text describing a constraint - - - - - Determines whether the predicate succeeds when applied - to the actual value. - - - - - Abstract base class used for prefixes - - - - - The base constraint - - - - - Prefix used in forming the constraint description - - - - - Construct given a base constraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - PropertyConstraint extracts a named property and uses - its value as the actual value for a chained constraint. - - - - - Initializes a new instance of the class. - - The name. - The constraint to apply to the property. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Returns the string representation of the constraint. - - - - - - PropertyExistsConstraint tests that a named property - exists on the object provided through Match. - - Originally, PropertyConstraint provided this feature - in addition to making optional tests on the value - of the property. The two constraints are now separate. - - - - - Initializes a new instance of the class. - - The name of the property. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the property exists for a given object - - The object to be tested - True for success, false for failure - - - - Returns the string representation of the constraint. - - - - - - RangeConstraint tests whether two _values are within a - specified range. - - - - - Initializes a new instance of the class. - - from must be less than or equal to true - Inclusive beginning of the range. Must be less than or equal to to. - Inclusive end of the range. Must be greater than or equal to from. - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use a and returns self. - - - - - RegexConstraint can test whether a string matches - the pattern provided. - - - - - Initializes a new instance of the class. - - The pattern. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - ResolvableConstraintExpression is used to represent a compound - constraint being constructed at a point where the last operator - may either terminate the expression or may have additional - qualifying constraints added to it. - - It is used, for example, for a Property element or for - an Exception element, either of which may be optionally - followed by constraints that apply to the property or - exception. - - - - - Create a new instance of ResolvableConstraintExpression - - - - - Create a new instance of ResolvableConstraintExpression, - passing in a pre-populated ConstraintBuilder. - - - - - Appends an And Operator to the expression - - - - - Appends an Or operator to the expression. - - - - - Resolve the current expression to a Constraint - - - - - ReusableConstraint wraps a constraint expression after - resolving it so that it can be reused consistently. - - - - - Construct a ReusableConstraint from a constraint expression - - The expression to be resolved and reused - - - - Converts a constraint to a ReusableConstraint - - The constraint to be converted - A ReusableConstraint - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Return the top-level constraint for this expression - - - - - - SameAsConstraint tests whether an object is identical to - the object passed to its constructor - - - - - Initializes a new instance of the class. - - The expected object. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Summary description for SamePathConstraint. - - - - - Initializes a new instance of the class. - - The expected path - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - SamePathOrUnderConstraint tests that one path is under another - - - - - Initializes a new instance of the class. - - The expected path - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - SomeItemsConstraint applies another constraint to each - item in a collection, succeeding if any of them succeeds. - - - - - Construct a SomeItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - succeeding if any item succeeds. - - - - - - - The EqualConstraintResult class is tailored for formatting - and displaying the result of an EqualConstraint. - - - - - Construct an EqualConstraintResult - - - - - Write a failure message. Overridden to provide custom - failure messages for EqualConstraint. - - The MessageWriter to write to - - - - Display the failure information for two collections that did not match. - - The MessageWriter on which to display - The expected collection. - The actual collection - The depth of this failure in a set of nested collections - - - - Displays a single line showing the types and sizes of the expected - and actual collections or arrays. If both are identical, the value is - only shown once. - - The MessageWriter on which to display - The expected collection or array - The actual collection or array - The indentation level for the message line - - - - Displays a single line showing the point in the expected and actual - arrays at which the comparison failed. If the arrays have different - structures or dimensions, both _values are shown. - - The MessageWriter on which to display - The expected array - The actual array - Index of the failure point in the underlying collections - The indentation level for the message line - - - - Display the failure information for two IEnumerables that did not match. - - The MessageWriter on which to display - The expected enumeration. - The actual enumeration - The depth of this failure in a set of nested collections - - - - StartsWithConstraint can test whether a string starts - with an expected substring. - - - - - Initializes a new instance of the class. - - The expected string - - - - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. - - - - - - - StringConstraint is the abstract base for constraints - that operate on strings. It supports the IgnoreCase - modifier for string operations. - - - - - The expected value - - - - - Indicates whether tests should be case-insensitive - - - - - Description of this constraint - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Constructs a StringConstraint without an expected value - - - - - Constructs a StringConstraint given an expected value - - The expected value - - - - Modify the constraint to ignore case in matching. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Test whether the constraint is satisfied by a given string - - The string to be tested - True for success, false for failure - - - - SubPathConstraint tests that the actual path is under the expected path - - - - - Initializes a new instance of the class. - - The expected path - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - SubstringConstraint can test whether a string contains - the expected substring. - - - - - Initializes a new instance of the class. - - The expected. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - ThrowsConstraint is used to test the exception thrown by - a delegate by applying a constraint to it. - - - - - Initializes a new instance of the class, - using a constraint to be applied to the exception. - - A constraint to apply to the caught exception. - - - - Get the actual exception thrown - used by Assert.Throws. - - - - - Gets text describing a constraint - - - - - Executes the code of the delegate and captures any exception. - If a non-null base constraint was provided, it applies that - constraint to the exception. - - A delegate representing the code to be tested - True if an exception is thrown and the constraint succeeds, otherwise false - - - - Converts an ActualValueDelegate to a TestDelegate - before calling the primary overload. - - - - - - - Write the actual value for a failing constraint test to a - MessageWriter. This override only handles the special message - used when an exception is expected but none is thrown. - - The writer on which the actual value is displayed - - - - ThrowsExceptionConstraint tests that an exception has - been thrown, without any further tests. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Executes the code and returns success if an exception is thrown. - - A delegate representing the code to be tested - True if an exception is thrown, otherwise false - - - - ThrowsNothingConstraint tests that a delegate does not - throw an exception. - - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True if no exception is thrown, otherwise false - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - The Tolerance class generalizes the notion of a tolerance - within which an equality test succeeds. Normally, it is - used with numeric types, but it can be used with any - type that supports taking a difference between two - objects and comparing that difference to a value. - - - - - Returns a default Tolerance object, equivalent to - specifying an exact match unless - is set, in which case, the - will be used. - - - - - Returns an empty Tolerance object, equivalent to - specifying an exact match even if - is set. - - - - - Constructs a linear tolerance of a specified amount - - - - - Constructs a tolerance given an amount and - - - - - Gets the for the current Tolerance - - - - - Tests that the current Tolerance is linear with a - numeric value, throwing an exception if it is not. - - - - - Gets the value of the current Tolerance instance. - - - - - Returns a new tolerance, using the current amount as a percentage. - - - - - Returns a new tolerance, using the current amount in Ulps - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of days. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of hours. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of minutes. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of seconds. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of milliseconds. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of clock ticks. - - - - - Returns true if the current tolerance has not been set or is using the . - - - - - Modes in which the tolerance value for a comparison can be interpreted. - - - - - The tolerance was created with a value, without specifying - how the value would be used. This is used to prevent setting - the mode more than once and is generally changed to Linear - upon execution of the test. - - - - - The tolerance is used as a numeric range within which - two compared _values are considered to be equal. - - - - - Interprets the tolerance as the percentage by which - the two compared _values my deviate from each other. - - - - - Compares two _values based in their distance in - representable numbers. - - - - - TrueConstraint tests that the actual value is true - - - - - Initializes a new instance of the class. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - TypeConstraint is the abstract base for constraints - that take a Type as their expected value. - - - - - The expected Type used by the constraint - - - - - The type of the actual argument to which the constraint was applied - - - - - Construct a TypeConstraint for a given Type - - The expected type for the constraint - Prefix used in forming the constraint description - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - UniqueItemsConstraint tests whether all the items in a - collection are unique. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Check that all items are unique. - - - - - - - XmlSerializableConstraint tests whether - an object is serializable in xml format. - - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Returns the string representation of this constraint - - - - - ExactCountConstraint applies another constraint to each - item in a collection, succeeding only if a specified - number of items succeed. - - - - - Construct an ExactCountConstraint on top of an existing constraint - - - - - - - Apply the item constraint to each item in the collection, - succeeding only if the expected number of items pass. - - - - - - - Represents a constraint that succeeds if the specified - count of members of a collection match a base constraint. - - - - - Construct an ExactCountOperator for a specified count - - The expected count - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. - - - - - ExceptionTypeConstraint is a special version of ExactTypeConstraint - used to provided detailed info about the exception thrown in - an error message. - - - - - Constructs an ExceptionTypeConstraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new DictionaryContainsKeyConstraint checking for the - presence of a particular key in the dictionary. - - - - - Returns a new DictionaryContainsValueConstraint checking for the - presence of a particular value in the dictionary. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Asserts on Directories - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both point to the same directory. - If they are not equal an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - The message to display if the directories are not equal - Arguments to be used in formatting the message - - - - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both point to the same directory. - If they are not equal an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - - - - Asserts that two directories are not equal. If they are equal - an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that two directories are not equal. If they are equal - an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - - - - Asserts that the directory exists. If it does not exist - an is thrown. - - A directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory exists. If it does not exist - an is thrown. - - A directory containing the actual value - - - - Asserts that the directory exists. If it does not exist - an is thrown. - - The path to a directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory exists. If it does not exist - an is thrown. - - The path to a directory containing the actual value - - - - Asserts that the directory does not exist. If it does exist - an is thrown. - - A directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory does not exist. If it does exist - an is thrown. - - A directory containing the actual value - - - - Asserts that the directory does not exist. If it does exist - an is thrown. - - The path to a directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory does not exist. If it does exist - an is thrown. - - The path to a directory containing the actual value - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a constraint that succeeds if the value - is a file or directory and it exists. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Thrown when an assertion failed. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - Thrown when an assertion failed. - - - - - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - Thrown when a test executes inconclusively. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - Abstract base for Exceptions that terminate a test and provide a ResultState. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - Thrown when an assertion failed. - - - - - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - The IApplyToContext interface is implemented by attributes - that want to make changes to the execution context before - a test is run. - - - - - Apply changes to the execution context - - The execution context - - - - The IApplyToTest interface is implemented by self-applying - attributes that modify the state of a test in some way. - - - - - Modifies a test as defined for the specific attribute. - - The test to modify - - - - CombiningStrategy is the abstract base for classes that - know how to combine values provided for individual test - parameters to create a set of test cases. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - ICommandWrapper is implemented by attributes and other - objects able to wrap a TestCommand with another command. - - - Attributes or other objects should implement one of the - derived interfaces, rather than this one, since they - indicate in which part of the command chain the wrapper - should be applied. - - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - Objects implementing this interface are used to wrap - the TestMethodCommand itself. They apply after SetUp - has been run and before TearDown. - - - - - Objects implementing this interface are used to wrap - the entire test, including SetUp and TearDown. - - - - - Any ITest that implements this interface is at a level that the implementing - class should be disposed at the end of the test run - - - - - The IFixtureBuilder interface is exposed by a class that knows how to - build a TestFixture from one or more Types. In general, it is exposed - by an attribute, but may be implemented in a helper class used by the - attribute in some cases. - - - - - Build one or more TestFixtures from type provided. At least one - non-null TestSuite must always be returned, since the method is - generally called because the user has marked the target class as - a fixture. If something prevents the fixture from being used, it - will be returned nonetheless, labelled as non-runnable. - - The type info of the fixture to be used. - A TestSuite object or one derived from TestSuite. - - - - IImplyFixture is an empty marker interface used by attributes like - TestAttribute that cause the class where they are used to be treated - as a TestFixture even without a TestFixtureAttribute. - - Marker interfaces are not usually considered a good practice, but - we use it here to avoid cluttering the attribute hierarchy with - classes that don't contain any extra implementation. - - - - - The IMethodInfo class is used to encapsulate information - about a method in a platform-independent manner. - - - - - Gets the Type from which this method was reflected. - - - - - Gets the MethodInfo for this method. - - - - - Gets the name of the method. - - - - - Gets a value indicating whether the method is abstract. - - - - - Gets a value indicating whether the method is public. - - - - - Gets a value indicating whether the method contains unassigned generic type parameters. - - - - - Gets a value indicating whether the method is a generic method. - - - - - Gets a value indicating whether the MethodInfo represents the definition of a generic method. - - - - - Gets the return Type of the method. - - - - - Gets the parameters of the method. - - - - - - Returns the Type arguments of a generic method or the Type parameters of a generic method definition. - - - - - Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. - - The type arguments to be used - A new IMethodInfo with the type arguments replaced - - - - Invokes the method, converting any TargetInvocationException to an NUnitException. - - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - The IDataPointProvider interface is used by extensions - that provide data for a single test parameter. - - - - - Determine whether any data is available for a parameter. - - An IParameterInfo representing one - argument to a parameterized test - True if any data is available, otherwise false. - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - An IEnumerable providing the required data - - - - The IParameterDataSource interface is implemented by types - that can provide data for a test method parameter. - - - - - Gets an enumeration of data items for use as arguments - for a test method parameter. - - The parameter for which data is needed - An enumeration containing individual data items - - - - The IParameterInfo interface is an abstraction of a .NET parameter. - - - - - Gets a value indicating whether the parameter is optional - - - - - Gets an IMethodInfo representing the method for which this is a parameter - - - - - Gets the underlying .NET ParameterInfo - - - - - Gets the Type of the parameter - - - - - A PropertyBag represents a collection of name/value pairs - that allows duplicate entries with the same key. Methods - are provided for adding a new pair as well as for setting - a key to a single value. All keys are strings but _values - may be of any type. Null _values are not permitted, since - a null entry represents the absence of the key. - - The entries in a PropertyBag are of two kinds: those that - take a single value and those that take multiple _values. - However, the PropertyBag has no knowledge of which entries - fall into each category and the distinction is entirely - up to the code using the PropertyBag. - - When working with multi-valued properties, client code - should use the Add method to add name/value pairs and - indexing to retrieve a list of all _values for a given - key. For example: - - bag.Add("Tag", "one"); - bag.Add("Tag", "two"); - Assert.That(bag["Tag"], - Is.EqualTo(new string[] { "one", "two" })); - - When working with single-valued propeties, client code - should use the Set method to set the value and Get to - retrieve the value. The GetSetting methods may also be - used to retrieve the value in a type-safe manner while - also providing default. For example: - - bag.Set("Priority", "low"); - bag.Set("Priority", "high"); // replaces value - Assert.That(bag.Get("Priority"), - Is.EqualTo("high")); - Assert.That(bag.GetSetting("Priority", "low"), - Is.EqualTo("high")); - - - - - Adds a key/value pair to the property bag - - The key - The value - - - - Sets the value for a key, removing any other - _values that are already in the property set. - - - - - - - Gets a single value for a key, using the first - one if multiple _values are present and returning - null if the value is not found. - - - - - Gets a flag indicating whether the specified key has - any entries in the property set. - - The key to be checked - True if their are _values present, otherwise false - - - - Gets or sets the list of _values for a particular key - - The key for which the _values are to be retrieved or set - - - - Gets a collection containing all the keys in the property set - - - - - The IReflectionInfo interface is implemented by NUnit wrapper objects that perform reflection. - - - - - Returns an array of custom attributes of the specified type applied to this object - - - - - Returns a value indicating whether an attribute of the specified type is defined on this object. - - - - - The ISimpleTestBuilder interface is exposed by a class that knows how to - build a single TestMethod from a suitable MethodInfo Types. In general, - it is exposed by an attribute, but may be implemented in a helper class - used by the attribute in some cases. - - - - - Build a TestMethod from the provided MethodInfo. - - The method to be used as a test - The TestSuite to which the method will be added - A TestMethod object - - - - The ISuiteBuilder interface is exposed by a class that knows how to - build a suite from one or more Types. - - - - - Examine the type and determine if it is suitable for - this builder to use in building a TestSuite. - - Note that returning false will cause the type to be ignored - in loading the tests. If it is desired to load the suite - but label it as non-runnable, ignored, etc., then this - method must return true. - - The type of the fixture to be used - True if the type can be used to build a TestSuite - - - - Build a TestSuite from type provided. - - The type of the fixture to be used - A TestSuite - - - - Common interface supported by all representations - of a test. Only includes informational fields. - The Run method is specifically excluded to allow - for data-only representations of a test. - - - - - Gets the id of the test - - - - - Gets the name of the test - - - - - Gets the fully qualified name of the test - - - - - Gets the name of the class containing this test. Returns - null if the test is not associated with a class. - - - - - Gets the name of the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the Type of the test fixture, if applicable, or - null if no fixture type is associated with this test. - - - - - Gets an IMethod for the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the RunState of the test, indicating whether it can be run. - - - - - Count of the test cases ( 1 if this is a test case ) - - - - - Gets the properties of the test - - - - - Gets the parent test, if any. - - The parent test or null if none exists. - - - - Returns true if this is a test suite - - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets this test's child tests - - A list of child tests - - - - Gets a fixture object for running this test. - - - - - The ITestBuilder interface is exposed by a class that knows how to - build one or more TestMethods from a MethodInfo. In general, it is exposed - by an attribute, which has additional information available to provide - the necessary test parameters to distinguish the test cases built. - - - - - Build one or more TestMethods from the provided MethodInfo. - - The method to be used as a test - The TestSuite to which the method will be added - A TestMethod object - - - - The ITestCaseBuilder interface is exposed by a class that knows how to - build a test case from certain methods. - - - This interface is not the same as the ITestCaseBuilder interface in NUnit 2.x. - We have reused the name because the two products don't interoperate at all. - - - - - Examine the method and determine if it is suitable for - this builder to use in building a TestCase to be - included in the suite being populated. - - Note that returning false will cause the method to be ignored - in loading the tests. If it is desired to load the method - but label it as non-runnable, ignored, etc., then this - method must return true. - - The test method to examine - The suite being populated - True is the builder can use this method - - - - Build a TestCase from the provided MethodInfo for - inclusion in the suite being constructed. - - The method to be used as a test case - The test suite being populated, or null - A TestCase or null - - - - The ITestCaseData interface is implemented by a class - that is able to return complete testcases for use by - a parameterized test method. - - - - - Gets the expected result of the test case - - - - - Returns true if an expected result has been set - - - - - The ITestData interface is implemented by a class that - represents a single instance of a parameterized test. - - - - - Gets the name to be used for the test - - - - - Gets the RunState for this test case. - - - - - Gets the argument list to be provided to the test - - - - - Gets the property dictionary for the test case - - - - - Interface to be implemented by filters applied to tests. - The filter applies when running the test, after it has been - loaded, since this is the only time an ITest exists. - - - - - Determine if a particular test passes the filter criteria. Pass - may examine the parents and/or descendants of a test, depending - on the semantics of the particular filter - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - The ITestCaseData interface is implemented by a class - that is able to return the data required to create an - instance of a parameterized test fixture. - - - - - Get the TypeArgs if separately set - - - - - The ITestListener interface is used internally to receive - notifications of significant events while a test is being - run. The events are propagated to clients by means of an - AsyncCallback. NUnit extensions may also monitor these events. - - - - - Called when a test has just started - - The test that is starting - - - - Called when a test has finished - - The result of the test - - - - The ITestResult interface represents the result of a test. - - - - - Gets the ResultState of the test result, which - indicates the success or failure of the test. - - - - - Gets the name of the test result - - - - - Gets the full name of the test result - - - - - Gets the elapsed time for running the test in seconds - - - - - Gets or sets the time the test started running. - - - - - Gets or sets the time the test finished running. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. Not available in - the Compact Framework 1.0. - - - - - Gets the number of asserts executed - when running the test and all its children. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Indicates whether this result has any child results. - Accessing HasChildren should not force creation of the - Children collection in classes implementing this interface. - - - - - Gets the the collection of child results. - - - - - Gets the Test to which this result applies. - - - - - Gets any text output written to this result. - - - - - The ITypeInfo interface is an abstraction of a .NET Type - - - - - Gets the underlying Type on which this ITypeInfo is based - - - - - Gets the base type of this type as an ITypeInfo - - - - - Returns true if the Type wrapped is equal to the argument - - - - - Gets the Name of the Type - - - - - Gets the FullName of the Type - - - - - Gets the assembly in which the type is declared - - - - - Gets the Namespace of the Type - - - - - Gets a value indicating whether the type is abstract. - - - - - Gets a value indicating whether the Type is a generic Type - - - - - Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. - - - - - Gets a value indicating whether the Type is a generic Type definition - - - - - Gets a value indicating whether the type is sealed. - - - - - Gets a value indicating whether this type is a static class. - - - - - Get the display name for this typeInfo. - - - - - Get the display name for an oject of this type, constructed with specific arguments - - - - - Returns a Type representing a generic type definition from which this Type can be constructed. - - - - - Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments - - - - - Returns a value indicating whether this type has a method with a specified public attribute - - - - - Returns an array of IMethodInfos for methods of this Type - that match the specified flags. - - - - - Returns a value indicating whether this Type has a public constructor taking the specified argument Types. - - - - - Construct an object of this Type, using the specified arguments. - - - - - An object implementing IXmlNodeBuilder is able to build - an XML representation of itself and any children. - - - - - Returns a TNode representing the current object. - - If true, children are included where applicable - A TNode representing the result - - - - Returns a TNode representing the current object after - adding it as a child of the supplied parent node. - - The parent node. - If true, children are included, where applicable - - - - - The ResultState class represents the outcome of running a test. - It contains two pieces of information. The Status of the test - is an enum indicating whether the test passed, failed, was - skipped or was inconclusive. The Label provides a more - detailed breakdown for use by client runners. - - - - - Initializes a new instance of the class. - - The TestStatus. - - - - Initializes a new instance of the class. - - The TestStatus. - The label. - - - - Initializes a new instance of the class. - - The TestStatus. - The stage at which the result was produced - - - - Initializes a new instance of the class. - - The TestStatus. - The label. - The stage at which the result was produced - - - - The result is inconclusive - - - - - The test has been skipped. - - - - - The test has been ignored. - - - - - The test was skipped because it is explicit - - - - - The test succeeded - - - - - The test failed - - - - - The test encountered an unexpected exception - - - - - The test was cancelled by the user - - - - - The test was not runnable. - - - - - A suite failed because one or more child tests failed or had errors - - - - - A suite failed in its OneTimeSetUp - - - - - A suite had an unexpected exception in its OneTimeSetUp - - - - - A suite had an unexpected exception in its OneTimeDown - - - - - Gets the TestStatus for the test. - - The status. - - - - Gets the label under which this test result is - categorized, if any. - - - - - Gets the stage of test execution in which - the failure or other result took place. - - - - - Get a new ResultState, which is the same as the current - one but with the FailureSite set to the specified value. - - The FailureSite to use - A new ResultState - - - - Determines whether the specified , is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - The FailureSite enum indicates the stage of a test - in which an error or failure occurred. - - - - - Failure in the test itself - - - - - Failure in the SetUp method - - - - - Failure in the TearDown method - - - - - Failure of a parent test - - - - - Failure of a child test - - - - - The RunState enum indicates whether a test can be executed. - - - - - The test is not runnable. - - - - - The test is runnable. - - - - - The test can only be run explicitly - - - - - The test has been skipped. This value may - appear on a Test when certain attributes - are used to skip the test. - - - - - The test has been ignored. May appear on - a Test, when the IgnoreAttribute is used. - - - - - The TestStatus enum indicates the result of running a test - - - - - The test was inconclusive - - - - - The test has skipped - - - - - The test succeeded - - - - - The test failed - - - - - TNode represents a single node in the XML representation - of a Test or TestResult. It replaces System.Xml.XmlNode and - System.Xml.Linq.XElement, providing a minimal set of methods - for operating on the XML in a platform-independent manner. - - - - - Constructs a new instance of TNode - - The name of the node - - - - Constructs a new instance of TNode with a value - - The name of the node - The text content of the node - - - - Constructs a new instance of TNode with a value - - The name of the node - The text content of the node - Flag indicating whether to use CDATA when writing the text - - - - Gets the name of the node - - - - - Gets the value of the node - - - - - Gets a flag indicating whether the value should be output using CDATA. - - - - - Gets the dictionary of attributes - - - - - Gets a list of child nodes - - - - - Gets the first ChildNode - - - - - Gets the XML representation of this node. - - - - - Create a TNode from it's XML text representation - - The XML text to be parsed - A TNode - - - - Adds a new element as a child of the current node and returns it. - - The element name. - The newly created child element - - - - Adds a new element with a value as a child of the current node and returns it. - - The element name - The text content of the new element - The newly created child element - - - - Adds a new element with a value as a child of the current node and returns it. - The value will be output using a CDATA section. - - The element name - The text content of the new element - The newly created child element - - - - Adds an attribute with a specified name and value to the XmlNode. - - The name of the attribute. - The value of the attribute. - - - - Finds a single descendant of this node matching an xpath - specification. The format of the specification is - limited to what is needed by NUnit and its tests. - - - - - - - Finds all descendants of this node matching an xpath - specification. The format of the specification is - limited to what is needed by NUnit and its tests. - - - - - Writes the XML representation of the node to an XmlWriter - - - - - - Class used to represent a list of XmlResults - - - - - Class used to represent the attributes of a node - - - - - Gets or sets the value associated with the specified key. - Overridden to return null if attribute is not found. - - The key. - Value of the attribute or null - - - - Asserts on Files - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Verifies that two Streams are equal. Two Streams are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The expected Stream - The actual Stream - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Verifies that two Streams are equal. Two Streams are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The expected Stream - The actual Stream - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A file containing the value that is expected - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A file containing the value that is expected - A file containing the actual value - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - - - - Asserts that two Streams are not equal. If they are equal - an is thrown. - - The expected Stream - The actual Stream - The message to be displayed when the two Stream are the same. - Arguments to be used in formatting the message - - - - Asserts that two Streams are not equal. If they are equal - an is thrown. - - The expected Stream - The actual Stream - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - A file containing the value that is expected - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - A file containing the value that is expected - A file containing the actual value - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - - - - Asserts that the file exists. If it does not exist - an is thrown. - - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that the file exists. If it does not exist - an is thrown. - - A file containing the actual value - - - - Asserts that the file exists. If it does not exist - an is thrown. - - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that the file exists. If it does not exist - an is thrown. - - The path to a file containing the actual value - - - - Asserts that the file does not exist. If it does exist - an is thrown. - - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that the file does not exist. If it does exist - an is thrown. - - A file containing the actual value - - - - Asserts that the file does not exist. If it does exist - an is thrown. - - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that the file does not exist. If it does exist - an is thrown. - - The path to a file containing the actual value - - - - GlobalSettings is a place for setting default _values used - by the framework in performing asserts. - - - - - Default tolerance for floating point equality - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests whether an object graph is serializable in binary format. - - - - - Returns a constraint that tests whether an object graph is serializable in xml format. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable to the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable to the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is a subpath of the expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the actual value falls - inclusively within a specified range. - - from must be less than or equal to true - Inclusive beginning of the range. Must be less than or equal to to. - Inclusive end of the range. Must be greater than or equal to from. - - - - - When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. - - - - - Executed before each test is run - - The test that is going to be run. - - - - Executed after each test is run - - The test that has just been run. - - - - Provides the target for the action attribute - - The target for the action attribute - - - - The Iz class is a synonym for Is intended for use in VB, - which regards Is as a keyword. - - - - - The List class is a helper class with properties and methods - that supply a number of constraints used with lists and collections. - - - - - List.Map returns a ListMapper, which can be used to map - the original collection to another collection. - - - - - - - ListMapper is used to transform a collection used as an actual argument - producing another collection to be used in the assertion. - - - - - Construct a ListMapper based on a collection - - The collection to be transformed - - - - Produces a collection containing all the _values of a property - - The collection of property _values - - - - - The SpecialValue enum is used to represent TestCase arguments - that cannot be used as arguments to an Attribute. - - - - - Null represents a null value, which cannot be used as an - argument to an attriute under .NET 1.x - - - - - Basic Asserts on strings. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - - - - Asserts that a string is not found within another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - - - - Asserts that a string starts with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string starts with another string. - - The expected string - The string to be examined - - - - Asserts that a string does not start with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not start with another string. - - The expected string - The string to be examined - - - - Asserts that a string ends with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string ends with another string. - - The expected string - The string to be examined - - - - Asserts that a string does not end with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not end with another string. - - The expected string - The string to be examined - - - - Asserts that two strings are equal, without regard to case. - - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that two strings are equal, without regard to case. - - The expected string - The actual string - - - - Asserts that two strings are not equal, without regard to case. - - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that two strings are not equal, without regard to case. - - The expected string - The actual string - - - - Asserts that a string matches an expected regular expression pattern. - - The regex pattern to be matched - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string matches an expected regular expression pattern. - - The regex pattern to be matched - The actual string - - - - Asserts that a string does not match an expected regular expression pattern. - - The regex pattern to be used - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not match an expected regular expression pattern. - - The regex pattern to be used - The actual string - - - - The TestCaseData class represents a set of arguments - and other parameter info to be used for a parameterized - test case. It is derived from TestCaseParameters and adds a - fluent syntax for use in initializing the test case. - - - - - Initializes a new instance of the class. - - The arguments. - - - - Initializes a new instance of the class. - - The argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - The third argument. - - - - Sets the expected result for the test - - The expected result - A modified TestCaseData - - - - Sets the name of the test case - - The modified TestCaseData instance - - - - Sets the description for the test case - being constructed. - - The description. - The modified TestCaseData instance. - - - - Applies a category to the test - - - - - - - Applies a named property to the test - - - - - - - - Applies a named property to the test - - - - - - - - Applies a named property to the test - - - - - - - - Marks the test case as explicit. - - - - - Marks the test case as explicit, specifying the reason. - - - - - Ignores this TestCase, specifying the reason. - - The reason. - - - - - Provide the context information of the current test. - This is an adapter for the internal ExecutionContext - class, hiding the internals from the user test. - - - - - Construct a TestContext for an ExecutionContext - - The ExecutionContext to adapt - - - - Get the current test context. This is created - as needed. The user may save the context for - use within a test, but it should not be used - outside the test for which it is created. - - - - - Gets a TextWriter that will send output to the current test result. - - - - - Get a representation of the current test. - - - - - Gets a Representation of the TestResult for the current test. - - - - - Gets the directory containing the current test assembly. - - - - - Gets the directory to be used for outputting files created - by this test run. - - - - - Gets the random generator. - - - The random generator. - - - - Write the string representation of a boolean value to the current result - - - Write a char to the current result - - - Write a char array to the current result - - - Write the string representation of a double to the current result - - - Write the string representation of an Int32 value to the current result - - - Write the string representation of an Int64 value to the current result - - - Write the string representation of a decimal value to the current result - - - Write the string representation of an object to the current result - - - Write the string representation of a Single value to the current result - - - Write a string to the current result - - - Write the string representation of a UInt32 value to the current result - - - Write the string representation of a UInt64 value to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a line terminator to the current result - - - Write the string representation of a boolean value to the current result followed by a line terminator - - - Write a char to the current result followed by a line terminator - - - Write a char array to the current result followed by a line terminator - - - Write the string representation of a double to the current result followed by a line terminator - - - Write the string representation of an Int32 value to the current result followed by a line terminator - - - Write the string representation of an Int64 value to the current result followed by a line terminator - - - Write the string representation of a decimal value to the current result followed by a line terminator - - - Write the string representation of an object to the current result followed by a line terminator - - - Write the string representation of a Single value to the current result followed by a line terminator - - - Write a string to the current result followed by a line terminator - - - Write the string representation of a UInt32 value to the current result followed by a line terminator - - - Write the string representation of a UInt64 value to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - - TestAdapter adapts a Test for consumption by - the user test code. - - - - - Construct a TestAdapter for a Test - - The Test to be adapted - - - - Gets the unique Id of a test - - - - - The name of the test, which may or may not be - the same as the method name. - - - - - The name of the method representing the test. - - - - - The FullName of the test - - - - - The ClassName of the test - - - - - The properties of the test. - - - - - ResultAdapter adapts a TestResult for consumption by - the user test code. - - - - - Construct a ResultAdapter for a TestResult - - The TestResult to be adapted - - - - Gets a ResultState representing the outcome of the test. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - The TestFixtureData class represents a set of arguments - and other parameter info to be used for a parameterized - fixture. It is derived from TestFixtureParameters and adds a - fluent syntax for use in initializing the fixture. - - - - - Initializes a new instance of the class. - - The arguments. - - - - Initializes a new instance of the class. - - The argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - The third argument. - - - - Marks the test fixture as explicit. - - - - - Marks the test fixture as explicit, specifying the reason. - - - - - Ignores this TestFixture, specifying the reason. - - The reason. - - - - - Helper class with properties and methods that supply - constraints that operate on exceptions. - - - - - Creates a constraint specifying an expected exception - - - - - Creates a constraint specifying an exception with a given InnerException - - - - - Creates a constraint specifying an expected TargetInvocationException - - - - - Creates a constraint specifying an expected ArgumentException - - - - - Creates a constraint specifying an expected ArgumentNUllException - - - - - Creates a constraint specifying an expected InvalidOperationException - - - - - Creates a constraint specifying that no exception is thrown - - - - - Creates a constraint specifying the exact type of exception expected - - - - - Creates a constraint specifying the exact type of exception expected - - - - - Creates a constraint specifying the type of exception expected - - - - - Creates a constraint specifying the type of exception expected - - - - - Env is a static class that provides some of the features of - System.Environment that are not available under all runtimes - - - - - The newline sequence in the current environment. - - - - - Path to the 'My Documents' folder - - - - - Directory used for file output if not specified on commandline. - - - - - PackageSettings is a static class containing constant values that - are used as keys in setting up a TestPackage. These values are used in - the engine and framework. Setting values may be a string, int or bool. - - - - - Flag (bool) indicating whether tests are being debugged. - - - - - Flag (bool) indicating whether to pause execution of tests to allow - the user to attache a debugger. - - - - - The InternalTraceLevel for this run. Values are: "Default", - "Off", "Error", "Warning", "Info", "Debug", "Verbose". - Default is "Off". "Debug" and "Verbose" are synonyms. - - - - - Full path of the directory to be used for work and result files. - This path is provided to tests by the frameowrk TestContext. - - - - - The name of the config to use in loading a project. - If not specified, the first config found is used. - - - - - Bool indicating whether the engine should determine the private - bin path by examining the paths to all the tests. Defaults to - true unless PrivateBinPath is specified. - - - - - The ApplicationBase to use in loading the tests. If not - specified, and each assembly has its own process, then the - location of the assembly is used. For multiple assemblies - in a single process, the closest common root directory is used. - - - - - Path to the config file to use in running the tests. - - - - - Bool flag indicating whether a debugger should be launched at agent - startup. Used only for debugging NUnit itself. - - - - - Indicates how to load tests across AppDomains. Values are: - "Default", "None", "Single", "Multiple". Default is "Multiple" - if more than one assembly is loaded in a process. Otherwise, - it is "Single". - - - - - The private binpath used to locate assemblies. Directory paths - is separated by a semicolon. It's an error to specify this and - also set AutoBinPath to true. - - - - - The maximum number of test agents permitted to run simultneously. - Ignored if the ProcessModel is not set or defaulted to Multiple. - - - - - Indicates how to allocate assemblies to processes. Values are: - "Default", "Single", "Separate", "Multiple". Default is "Multiple" - for more than one assembly, "Separate" for a single assembly. - - - - - Indicates the desired runtime to use for the tests. Values - are strings like "net-4.5", "mono-4.0", etc. Default is to - use the target framework for which an assembly was built. - - - - - Bool flag indicating that the test should be run in a 32-bit process - on a 64-bit system. By default, NUNit runs in a 64-bit process on - a 64-bit system. Ignored if set on a 32-bit system. - - - - - Indicates that test runners should be disposed after the tests are executed - - - - - Bool flag indicating that the test assemblies should be shadow copied. - Defaults to false. - - - - - Integer value in milliseconds for the default timeout value - for test cases. If not specified, there is no timeout except - as specified by attributes on the tests themselves. - - - - - A TextWriter to which the internal trace will be sent. - - - - - A list of tests to be loaded. - - - - - The number of test threads to run for the assembly. If set to - 1, a single queue is used. If set to 0, tests are executed - directly, without queuing. - - - - - The random seed to be used for this assembly. If specified - as the value reported from a prior run, the framework should - generate identical random values for tests as were used for - that run, provided that no change has been made to the test - assembly. Default is a random value itself. - - - - - If true, execution stops after the first error or failure. - - - - - If true, use of the event queue is suppressed and test events are synchronous. - - - - diff --git a/packages/NUnit.3.0.1/lib/net45/nunit.framework.xml b/packages/NUnit.3.0.1/lib/net45/nunit.framework.xml deleted file mode 100644 index 77a12e8..0000000 --- a/packages/NUnit.3.0.1/lib/net45/nunit.framework.xml +++ /dev/null @@ -1,16865 +0,0 @@ - - - - nunit.framework - - - - - AssemblyHelper provides static methods for working - with assemblies. - - - - - Gets the path from which the assembly defining a type was loaded. - - The Type. - The path. - - - - Gets the path from which an assembly was loaded. - - The assembly. - The path. - - - - Gets the path to the directory from which an assembly was loaded. - - The assembly. - The path. - - - - Gets the AssemblyName of an assembly. - - The assembly - An AssemblyName - - - - Loads an assembly given a string, which may be the - path to the assembly or the AssemblyName - - - - - - - Gets the assembly path from code base. - - Public for testing purposes - The code base. - - - - - Interface for logging within the engine - - - - - Logs the specified message at the error level. - - The message. - - - - Logs the specified message at the error level. - - The message. - The arguments. - - - - Logs the specified message at the warning level. - - The message. - - - - Logs the specified message at the warning level. - - The message. - The arguments. - - - - Logs the specified message at the info level. - - The message. - - - - Logs the specified message at the info level. - - The message. - The arguments. - - - - Logs the specified message at the debug level. - - The message. - - - - Logs the specified message at the debug level. - - The message. - The arguments. - - - - InternalTrace provides facilities for tracing the execution - of the NUnit framework. Tests and classes under test may make use - of Console writes, System.Diagnostics.Trace or various loggers and - NUnit itself traps and processes each of them. For that reason, a - separate internal trace is needed. - - Note: - InternalTrace uses a global lock to allow multiple threads to write - trace messages. This can easily make it a bottleneck so it must be - used sparingly. Keep the trace Level as low as possible and only - insert InternalTrace writes where they are needed. - TODO: add some buffering and a separate writer thread as an option. - TODO: figure out a way to turn on trace in specific classes only. - - - - - Gets a flag indicating whether the InternalTrace is initialized - - - - - Initialize the internal trace facility using the name of the log - to be written to and the trace level. - - The log name - The trace level - - - - Initialize the internal trace using a provided TextWriter and level - - A TextWriter - The InternalTraceLevel - - - - Get a named Logger - - - - - - Get a logger named for a particular Type. - - - - - InternalTraceLevel is an enumeration controlling the - level of detailed presented in the internal log. - - - - - Use the default settings as specified by the user. - - - - - Do not display any trace messages - - - - - Display Error messages only - - - - - Display Warning level and higher messages - - - - - Display informational and higher messages - - - - - Display debug messages and higher - i.e. all messages - - - - - Display debug messages and higher - i.e. all messages - - - - - A trace listener that writes to a separate file per domain - and process using it. - - - - - Construct an InternalTraceWriter that writes to a file. - - Path to the file to use - - - - Construct an InternalTraceWriter that writes to a - TextWriter provided by the caller. - - - - - - Returns the character encoding in which the output is written. - - The character encoding in which the output is written. - - - - Writes a character to the text string or stream. - - The character to write to the text stream. - - - - Writes a string to the text string or stream. - - The string to write. - - - - Writes a string followed by a line terminator to the text string or stream. - - The string to write. If is null, only the line terminator is written. - - - - Releases the unmanaged resources used by the and optionally releases the managed resources. - - true to release both managed and unmanaged resources; false to release only unmanaged resources. - - - - Clears all buffers for the current writer and causes any buffered data to be written to the underlying device. - - - - - Provides internal logging to the NUnit framework - - - - - Initializes a new instance of the class. - - The name. - The log level. - The writer where logs are sent. - - - - Logs the message at error level. - - The message. - - - - Logs the message at error level. - - The message. - The message arguments. - - - - Logs the message at warm level. - - The message. - - - - Logs the message at warning level. - - The message. - The message arguments. - - - - Logs the message at info level. - - The message. - - - - Logs the message at info level. - - The message. - The message arguments. - - - - Logs the message at debug level. - - The message. - - - - Logs the message at debug level. - - The message. - The message arguments. - - - - CombinatorialStrategy creates test cases by using all possible - combinations of the parameter data. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - Provides data from fields marked with the DatapointAttribute or the - DatapointsAttribute. - - - - - Determine whether any data is available for a parameter. - - A ParameterInfo representing one - argument to a parameterized test - - True if any data is available, otherwise false. - - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - A ParameterInfo representing one - argument to a parameterized test - - An IEnumerable providing the required data - - - - - Built-in SuiteBuilder for all types of test classes. - - - - - Checks to see if the provided Type is a fixture. - To be considered a fixture, it must be a non-abstract - class with one or more attributes implementing the - IFixtureBuilder interface or one or more methods - marked as tests. - - The fixture type to check - True if the fixture can be built, false if not - - - - Build a TestSuite from TypeInfo provided. - - The fixture type to build - A TestSuite built from that type - - - - We look for attributes implementing IFixtureBuilder at one level - of inheritance at a time. Attributes on base classes are not used - unless there are no fixture builder attributes at all on the derived - class. This is by design. - - The type being examined for attributes - A list of the attributes found. - - - - Class to build ether a parameterized or a normal NUnitTestMethod. - There are four cases that the builder must deal with: - 1. The method needs no params and none are provided - 2. The method needs params and they are provided - 3. The method needs no params but they are provided in error - 4. The method needs params but they are not provided - This could have been done using two different builders, but it - turned out to be simpler to have just one. The BuildFrom method - takes a different branch depending on whether any parameters are - provided, but all four cases are dealt with in lower-level methods - - - - - Determines if the method can be used to build an NUnit test - test method of some kind. The method must normally be marked - with an identifying attribute for this to be true. - - Note that this method does not check that the signature - of the method for validity. If we did that here, any - test methods with invalid signatures would be passed - over in silence in the test run. Since we want such - methods to be reported, the check for validity is made - in BuildFrom rather than here. - - An IMethodInfo for the method being used as a test method - True if the builder can create a test case from this method - - - - Build a Test from the provided MethodInfo. Depending on - whether the method takes arguments and on the availability - of test case data, this method may return a single test - or a group of tests contained in a ParameterizedMethodSuite. - - The method for which a test is to be built - A Test representing one or more method invocations - - - - Determines if the method can be used to build an NUnit test - test method of some kind. The method must normally be marked - with an identifying attribute for this to be true. - - Note that this method does not check that the signature - of the method for validity. If we did that here, any - test methods with invalid signatures would be passed - over in silence in the test run. Since we want such - methods to be reported, the check for validity is made - in BuildFrom rather than here. - - An IMethodInfo for the method being used as a test method - The test suite being built, to which the new test would be added - True if the builder can create a test case from this method - - - - Build a Test from the provided MethodInfo. Depending on - whether the method takes arguments and on the availability - of test case data, this method may return a single test - or a group of tests contained in a ParameterizedMethodSuite. - - The method for which a test is to be built - The test fixture being populated, or null - A Test representing one or more method invocations - - - - Builds a ParameterizedMethodSuite containing individual test cases. - - The method for which a test is to be built. - The list of test cases to include. - A ParameterizedMethodSuite populated with test cases - - - - Build a simple, non-parameterized TestMethod for this method. - - The MethodInfo for which a test is to be built - The test suite for which the method is being built - A TestMethod. - - - - Class that can build a tree of automatic namespace - suites from a group of fixtures. - - - - - NamespaceDictionary of all test suites we have created to represent - namespaces. Used to locate namespace parent suites for fixtures. - - - - - The root of the test suite being created by this builder. - - - - - Initializes a new instance of the class. - - The root suite. - - - - Gets the root entry in the tree created by the NamespaceTreeBuilder. - - The root suite. - - - - Adds the specified fixtures to the tree. - - The fixtures to be added. - - - - Adds the specified fixture to the tree. - - The fixture to be added. - - - - NUnitTestCaseBuilder is a utility class used by attributes - that build test cases. - - - - - Constructs an - - - - - Builds a single NUnitTestMethod, either as a child of the fixture - or as one of a set of test cases under a ParameterizedTestMethodSuite. - - The MethodInfo from which to construct the TestMethod - The suite or fixture to which the new test will be added - The ParameterSet to be used, or null - - - - - Helper method that checks the signature of a TestMethod and - any supplied parameters to determine if the test is valid. - - Currently, NUnitTestMethods are required to be public, - non-abstract methods, either static or instance, - returning void. They may take arguments but the _values must - be provided or the TestMethod is not considered runnable. - - Methods not meeting these criteria will be marked as - non-runnable and the method will return false in that case. - - The TestMethod to be checked. If it - is found to be non-runnable, it will be modified. - Parameters to be used for this test, or null - True if the method signature is valid, false if not - - The return value is no longer used internally, but is retained - for testing purposes. - - - - - NUnitTestFixtureBuilder is able to build a fixture given - a class marked with a TestFixtureAttribute or an unmarked - class containing test methods. In the first case, it is - called by the attribute and in the second directly by - NUnitSuiteBuilder. - - - - - Build a TestFixture from type provided. A non-null TestSuite - must always be returned, since the method is generally called - because the user has marked the target class as a fixture. - If something prevents the fixture from being used, it should - be returned nonetheless, labelled as non-runnable. - - An ITypeInfo for the fixture to be used. - A TestSuite object or one derived from TestSuite. - - - - Overload of BuildFrom called by tests that have arguments. - Builds a fixture using the provided type and information - in the ITestFixtureData object. - - The TypeInfo for which to construct a fixture. - An object implementing ITestFixtureData or null. - - - - - Method to add test cases to the newly constructed fixture. - - The fixture to which cases should be added - - - - Method to create a test case from a MethodInfo and add - it to the fixture being built. It first checks to see if - any global TestCaseBuilder addin wants to build the - test case. If not, it uses the internal builder - collection maintained by this fixture builder. - - The default implementation has no test case builders. - Derived classes should add builders to the collection - in their constructor. - - The method for which a test is to be created - The test suite being built. - A newly constructed Test - - - - PairwiseStrategy creates test cases by combining the parameter - data so that all possible pairs of data items are used. - - - - The number of test cases that cover all possible pairs of test function - parameters values is significantly less than the number of test cases - that cover all possible combination of test function parameters values. - And because different studies show that most of software failures are - caused by combination of no more than two parameters, pairwise testing - can be an effective ways to test the system when it's impossible to test - all combinations of parameters. - - - The PairwiseStrategy code is based on "jenny" tool by Bob Jenkins: - http://burtleburtle.net/bob/math/jenny.html - - - - - - FleaRand is a pseudo-random number generator developed by Bob Jenkins: - http://burtleburtle.net/bob/rand/talksmall.html#flea - - - - - Initializes a new instance of the FleaRand class. - - The seed. - - - - FeatureInfo represents coverage of a single value of test function - parameter, represented as a pair of indices, Dimension and Feature. In - terms of unit testing, Dimension is the index of the test parameter and - Feature is the index of the supplied value in that parameter's list of - sources. - - - - - Initializes a new instance of FeatureInfo class. - - Index of a dimension. - Index of a feature. - - - - A FeatureTuple represents a combination of features, one per test - parameter, which should be covered by a test case. In the - PairwiseStrategy, we are only trying to cover pairs of features, so the - tuples actually may contain only single feature or pair of features, but - the algorithm itself works with triplets, quadruples and so on. - - - - - Initializes a new instance of FeatureTuple class for a single feature. - - Single feature. - - - - Initializes a new instance of FeatureTuple class for a pair of features. - - First feature. - Second feature. - - - - TestCase represents a single test case covering a list of features. - - - - - Initializes a new instance of TestCaseInfo class. - - A number of features in the test case. - - - - PairwiseTestCaseGenerator class implements an algorithm which generates - a set of test cases which covers all pairs of possible values of test - function. - - - - The algorithm starts with creating a set of all feature tuples which we - will try to cover (see method). This set - includes every single feature and all possible pairs of features. We - store feature tuples in the 3-D collection (where axes are "dimension", - "feature", and "all combinations which includes this feature"), and for - every two feature (e.g. "A" and "B") we generate both ("A", "B") and - ("B", "A") pairs. This data structure extremely reduces the amount of - time needed to calculate coverage for a single test case (this - calculation is the most time-consuming part of the algorithm). - - - Then the algorithm picks one tuple from the uncovered tuple, creates a - test case that covers this tuple, and then removes this tuple and all - other tuples covered by this test case from the collection of uncovered - tuples. - - - Picking a tuple to cover - - - There are no any special rules defined for picking tuples to cover. We - just pick them one by one, in the order they were generated. - - - Test generation - - - Test generation starts from creating a completely random test case which - covers, nevertheless, previously selected tuple. Then the algorithm - tries to maximize number of tuples which this test covers. - - - Test generation and maximization process repeats seven times for every - selected tuple and then the algorithm picks the best test case ("seven" - is a magic number which provides good results in acceptable time). - - Maximizing test coverage - - To maximize tests coverage, the algorithm walks thru the list of mutable - dimensions (mutable dimension is a dimension that are not included in - the previously selected tuple). Then for every dimension, the algorithm - walks thru the list of features and checks if this feature provides - better coverage than randomly selected feature, and if yes keeps this - feature. - - - This process repeats while it shows progress. If the last iteration - doesn't improve coverage, the process ends. - - - In addition, for better results, before start every iteration, the - algorithm "scrambles" dimensions - so for every iteration dimension - probes in a different order. - - - - - - Creates a set of test cases for specified dimensions. - - - An array which contains information about dimensions. Each element of - this array represents a number of features in the specific dimension. - - - A set of test cases. - - - - - Gets the test cases generated by this strategy instance. - - A set of test cases. - - - - The ParameterDataProvider class implements IParameterDataProvider - and hosts one or more individual providers. - - - - - Construct with a collection of individual providers - - - - - Determine whether any data is available for a parameter. - - An IParameterInfo representing one - argument to a parameterized test - True if any data is available, otherwise false. - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - An IEnumerable providing the required data - - - - ParameterDataSourceProvider supplies individual argument _values for - single parameters using attributes implementing IParameterDataSource. - - - - - Determine whether any data is available for a parameter. - - A ParameterInfo representing one - argument to a parameterized test - - True if any data is available, otherwise false. - - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - - An IEnumerable providing the required data - - - - - SequentialStrategy creates test cases by using all of the - parameter data sources in parallel, substituting null - when any of them run out of data. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - Waits for pending asynchronous operations to complete, if appropriate, - and returns a proper result of the invocation by unwrapping task results - - The raw result of the method invocation - The unwrapped result, if necessary - - - - OneTimeSetUpCommand runs any one-time setup methods for a suite, - constructing the user test object if necessary. - - - - - Constructs a OneTimeSetUpCommand for a suite - - The suite to which the command applies - A SetUpTearDownList for use by the command - A List of TestActionItems to be run after Setup - - - - Overridden to run the one-time setup for a suite. - - The TestExecutionContext to be used. - A TestResult - - - - OneTimeTearDownCommand performs any teardown actions - specified for a suite and calls Dispose on the user - test object, if any. - - - - - Construct a OneTimeTearDownCommand - - The test suite to which the command applies - A SetUpTearDownList for use by the command - A List of TestActionItems to be run before teardown. - - - - Overridden to run the teardown methods specified on the test. - - The TestExecutionContext to be used. - A TestResult - - - - ContextSettingsCommand applies specified changes to the - TestExecutionContext prior to running a test. No special - action is needed after the test runs, since the prior - context will be restored automatically. - - - - - The CommandStage enumeration represents the defined stages - of execution for a series of TestCommands. The int _values - of the enum are used to apply decorators in the proper - order. Lower _values are applied first and are therefore - "closer" to the actual test execution. - - - No CommandStage is defined for actual invocation of the test or - for creation of the context. Execution may be imagined as - proceeding from the bottom of the list upwards, with cleanup - after the test running in the opposite order. - - - - - Use an application-defined default value. - - - - - Make adjustments needed before and after running - the raw test - that is, after any SetUp has run - and before TearDown. - - - - - Run SetUp and TearDown for the test. This stage is used - internally by NUnit and should not normally appear - in user-defined decorators. - - - - - Make adjustments needed before and after running - the entire test - including SetUp and TearDown. - - - - - TODO: Documentation needed for class - - - - TODO: Documentation needed for field - - - - TODO: Documentation needed for constructor - - - - - - TODO: Documentation needed for class - - - - - Initializes a new instance of the class. - - The inner command. - The max time allowed in milliseconds - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext - - The context in which the test should run. - A TestResult - - - - SetUpTearDownCommand runs any SetUp methods for a suite, - runs the test and then runs any TearDown methods. - - - - - Initializes a new instance of the class. - - The inner command. - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - SetUpTearDownItem holds the setup and teardown methods - for a single level of the inheritance hierarchy. - - - - - Construct a SetUpTearDownNode - - A list of setup methods for this level - A list teardown methods for this level - - - - Returns true if this level has any methods at all. - This flag is used to discard levels that do nothing. - - - - - Run SetUp on this level. - - The execution context to use for running. - - - - Run TearDown for this level. - - - - - - TODO: Documentation needed for class - - - - - Initializes a new instance of the class. - - The test being skipped. - - - - Overridden to simply set the CurrentResult to the - appropriate Skipped state. - - The execution context for the test - A TestResult - - - - TestActionCommand runs the BeforeTest actions for a test, - then runs the test and finally runs the AfterTestActions. - - - - - Initializes a new instance of the class. - - The inner command. - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - TestActionItem represents a single execution of an - ITestAction. It is used to track whether the BeforeTest - method has been called and suppress calling the - AfterTest method if it has not. - - - - - Construct a TestActionItem - - The ITestAction to be included - - - - Run the BeforeTest method of the action and remember that it has been run. - - The test to which the action applies - - - - Run the AfterTest action, but only if the BeforeTest - action was actually run. - - The test to which the action applies - - - - TestCommand is the abstract base class for all test commands - in the framework. A TestCommand represents a single stage in - the execution of a test, e.g.: SetUp/TearDown, checking for - Timeout, verifying the returned result from a method, etc. - - TestCommands may decorate other test commands so that the - execution of a lower-level command is nested within that - of a higher level command. All nested commands are executed - synchronously, as a single unit. Scheduling test execution - on separate threads is handled at a higher level, using the - task dispatcher. - - - - - Construct a TestCommand for a test. - - The test to be executed - - - - Gets the test associated with this command. - - - - - Runs the test in a specified context, returning a TestResult. - - The TestExecutionContext to be used for running the test. - A TestResult - - - - TestMethodCommand is the lowest level concrete command - used to run actual test cases. - - - - - Initializes a new instance of the class. - - The test. - - - - Runs the test, saving a TestResult in the execution context, as - well as returning it. If the test has an expected result, it - is asserts on that value. Since failed tests and errors throw - an exception, this command must be wrapped in an outer command, - will handle that exception and records the failure. This role - is usually played by the SetUpTearDown command. - - The execution context - - - - TheoryResultCommand adjusts the result of a Theory so that - it fails if all the results were inconclusive. - - - - - Constructs a TheoryResultCommand - - The command to be wrapped by this one - - - - Overridden to call the inner command and adjust the result - in case all chlid results were inconclusive. - - - - - - - ClassName filter selects tests based on the class FullName - - - - - Construct a FullNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - A base class for multi-part filters - - - - - Constructs an empty CompositeFilter - - - - - Constructs a CompositeFilter from an array of filters - - - - - - Adds a filter to the list of filters - - The filter to be added - - - - Return a list of the composing filters. - - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - FullName filter selects tests based on their FullName - - - - - Construct a FullNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - FullName filter selects tests based on their FullName - - - - - Construct a MethodNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - PropertyFilter is able to select or exclude tests - based on their properties. - - - - - - Construct a PropertyFilter using a property name and expected value - - A property name - The expected value of the property - - - - Check whether the filter matches a test - - The test to be matched - - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - TestName filter selects tests based on their Name - - - - - Construct a TestNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - Combines multiple filters so that a test must pass all - of them in order to pass this filter. - - - - - Constructs an empty AndFilter - - - - - Constructs an AndFilter from an array of filters - - - - - - Checks whether the AndFilter is matched by a test - - The test to be matched - True if all the component filters pass, otherwise false - - - - Checks whether the AndFilter is matched by a test - - The test to be matched - True if all the component filters match, otherwise false - - - - Gets the element name - - Element name - - - - CategoryFilter is able to select or exclude tests - based on their categories. - - - - - - Construct a CategoryFilter using a single category name - - A category name - - - - Check whether the filter matches a test - - The test to be matched - - - - - Gets the element name - - Element name - - - - IdFilter selects tests based on their id - - - - - Construct an IdFilter for a single value - - The id the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - NotFilter negates the operation of another filter - - - - - Construct a not filter on another filter - - The filter to be negated - - - - Gets the base filter - - - - - Determine if a particular test passes the filter criteria. The default - implementation checks the test itself, its parents and any descendants. - - Derived classes may override this method or any of the Match methods - to change the behavior of the filter. - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Check whether the filter matches a test - - The test to be matched - True if it matches, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Combines multiple filters so that a test must pass one - of them in order to pass this filter. - - - - - Constructs an empty OrFilter - - - - - Constructs an AndFilter from an array of filters - - - - - - Checks whether the OrFilter is matched by a test - - The test to be matched - True if any of the component filters pass, otherwise false - - - - Checks whether the OrFilter is matched by a test - - The test to be matched - True if any of the component filters match, otherwise false - - - - Gets the element name - - Element name - - - - ValueMatchFilter selects tests based on some value, which - is expected to be contained in the test. - - - - - Returns the value matched by the filter - used for testing - - - - - Indicates whether the value is a regular expression - - - - - Construct a ValueMatchFilter for a single value. - - The value to be included. - - - - Match the input provided by the derived class - - The value to be matchedT - True for a match, false otherwise. - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - GenericMethodHelper is able to deduce the Type arguments for - a generic method from the actual arguments provided. - - - - - Construct a GenericMethodHelper for a method - - MethodInfo for the method to examine - - - - Return the type argments for the method, deducing them - from the arguments actually provided. - - The arguments to the method - An array of type arguments. - - - - InvalidTestFixtureException is thrown when an appropriate test - fixture constructor using the provided arguments cannot be found. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The message. - - - - Initializes a new instance of the class. - - The message. - The inner. - - - - Serialization Constructor - - - - - CultureDetector is a helper class used by NUnit to determine - whether a test should be run based on the current culture. - - - - - Default constructor uses the current culture. - - - - - Construct a CultureDetector for a particular culture for testing. - - The culture to be used - - - - Test to determine if one of a collection of cultures - is being used currently. - - - - - - - Tests to determine if the current culture is supported - based on a culture attribute. - - The attribute to examine - - - - - Test to determine if the a particular culture or comma- - delimited set of cultures is in use. - - Name of the culture or comma-separated list of culture ids - True if the culture is in use on the system - - - - Return the last failure reason. Results are not - defined if called before IsSupported( Attribute ) - is called. - - - - - ExceptionHelper provides static methods for working with exceptions - - - - - Builds up a message, using the Message field of the specified exception - as well as any InnerExceptions. - - The exception. - A combined message string. - - - - Builds up a message, using the Message field of the specified exception - as well as any InnerExceptions. - - The exception. - A combined stack trace. - - - - Gets the stack trace of the exception. - - The exception. - A string representation of the stack trace. - - - - A utility class to create TestCommands - - - - - Gets the command to be executed before any of - the child tests are run. - - A TestCommand - - - - Gets the command to be executed after all of the - child tests are run. - - A TestCommand - - - - Creates a test command for use in running this test. - - - - - - Creates a command for skipping a test. The result returned will - depend on the test RunState. - - - - - Builds the set up tear down list. - - Type of the fixture. - Type of the set up attribute. - Type of the tear down attribute. - A list of SetUpTearDownItems - - - - A CompositeWorkItem represents a test suite and - encapsulates the execution of the suite as well - as all its child tests. - - - - - Construct a CompositeWorkItem for executing a test suite - using a filter to select child tests. - - The TestSuite to be executed - A filter used to select child tests - - - - Method that actually performs the work. Overridden - in CompositeWorkItem to do setup, run all child - items and then do teardown. - - - - - The EventPumpState enum represents the state of an - EventPump. - - - - - The pump is stopped - - - - - The pump is pumping events with no stop requested - - - - - The pump is pumping events but a stop has been requested - - - - - EventPump pulls events out of an EventQueue and sends - them to a listener. It is used to send events back to - the client without using the CallContext of the test - runner thread. - - - - - The handle on which a thread enqueuing an event with == true - waits, until the EventPump has sent the event to its listeners. - - - - - The downstream listener to which we send events - - - - - The queue that holds our events - - - - - Thread to do the pumping - - - - - The current state of the eventpump - - - - - Constructor - - The EventListener to receive events - The event queue to pull events from - - - - Gets or sets the current state of the pump - - - On volatile and , see - "http://www.albahari.com/threading/part4.aspx". - - - - - Gets or sets the name of this EventPump - (used only internally and for testing). - - - - - Dispose stops the pump - Disposes the used WaitHandle, too. - - - - - Start the pump - - - - - Tell the pump to stop after emptying the queue. - - - - - Our thread proc for removing items from the event - queue and sending them on. Note that this would - need to do more locking if any other thread were - removing events from the queue. - - - - - NUnit.Core.Event is the abstract base for all stored events. - An Event is the stored representation of a call to the - ITestListener interface and is used to record such calls - or to queue them for forwarding on another thread or at - a later time. - - - - - The Send method is implemented by derived classes to send the event to the specified listener. - - The listener. - - - - Gets a value indicating whether this event is delivered synchronously by the NUnit . - - If true, and if has been used to - set a WaitHandle, blocks its calling thread until the - thread has delivered the event and sets the WaitHandle. - - - - - - TestStartedEvent holds information needed to call the TestStarted method. - - - - - Initializes a new instance of the class. - - The test. - - - - Calls TestStarted on the specified listener. - - The listener. - - - - TestFinishedEvent holds information needed to call the TestFinished method. - - - - - Initializes a new instance of the class. - - The result. - - - - Calls TestFinished on the specified listener. - - The listener. - - - - Implements a queue of work items each of which - is queued as a WaitCallback. - - - - - Construct a new EventQueue - - - - - WaitHandle for synchronous event delivery in . - - Having just one handle for the whole implies that - there may be only one producer (the test thread) for synchronous events. - If there can be multiple producers for synchronous events, one would have - to introduce one WaitHandle per event. - - - - - - Gets the count of items in the queue. - - - - - Sets a handle on which to wait, when is called - for an with == true. - - - The wait handle on which to wait, when is called - for an with == true. - The caller is responsible for disposing this wait handle. - - - - - Enqueues the specified event - - The event to enqueue. - - - - Removes the first element from the queue and returns it (or null). - - - If true and the queue is empty, the calling thread is blocked until - either an element is enqueued, or is called. - - - - - If the queue not empty - the first element. - - - otherwise, if ==false - or has been called - null. - - - - - - - Stop processing of the queue - - - - - An IWorkItemDispatcher handles execution of work items. - - - - - Dispatch a single work item for execution. The first - work item dispatched is saved as the top-level - work item and used when stopping the run. - - The item to dispatch - - - - Cancel the ongoing run completely. - If no run is in process, the call has no effect. - - - - - ParallelWorkItemDispatcher handles execution of work items by - queuing them for worker threads to process. - - - - - Construct a ParallelWorkItemDispatcher - - Number of workers to use - - - - Enumerates all the shifts supported by the dispatcher - - - - - Dispatch a single work item for execution. The first - work item dispatched is saved as the top-level - work item and used when stopping the run. - - The item to dispatch - - - - Cancel the ongoing run completely. - If no run is in process, the call has no effect. - - - - - QueuingEventListener uses an EventQueue to store any - events received on its EventListener interface. - - - - - The EvenQueue created and filled by this listener - - - - - A test has started - - The test that is starting - - - - A test case finished - - Result of the test case - - - - A SimpleWorkItem represents a single test case and is - marked as completed immediately upon execution. This - class is also used for skipped or ignored test suites. - - - - - Construct a simple work item for a test. - - The test to be executed - The filter used to select this test - - - - Method that performs actually performs the work. - - - - - SimpleWorkItemDispatcher handles execution of WorkItems by - directly executing them. It is provided so that a dispatcher - is always available in the context, thereby simplifying the - code needed to run child tests. - - - - - Dispatch a single work item for execution. The first - work item dispatched is saved as the top-level - work item and a thread is created on which to - run it. Subsequent calls come from the top level - item or its descendants on the proper thread. - - The item to dispatch - - - - Cancel the ongoing run completely. - If no run is in process, the call has no effect. - - - - - A TestWorker pulls work items from a queue - and executes them. - - - - - Event signaled immediately before executing a WorkItem - - - - - Event signaled immediately after executing a WorkItem - - - - - Construct a new TestWorker. - - The queue from which to pull work items - The name of this worker - The apartment state to use for running tests - - - - The name of this worker - also used for the thread - - - - - Indicates whether the worker thread is running - - - - - Our ThreadProc, which pulls and runs tests in a loop - - - - - Start processing work items. - - - - - Stop the thread, either immediately or after finishing the current WorkItem - - - - - The TextCapture class intercepts console output and writes it - to the current execution context, if one is present on the thread. - If no execution context is found, the output is written to a - default destination, normally the original destination of the - intercepted output. - - - - - Construct a TextCapture object - - The default destination for non-intercepted output - - - - Gets the Encoding in use by this TextWriter - - - - - Writes a single character - - The char to write - - - - Writes a string - - The string to write - - - - Writes a string followed by a line terminator - - The string to write - - - - A WorkItem may be an individual test case, a fixture or - a higher level grouping of tests. All WorkItems inherit - from the abstract WorkItem class, which uses the template - pattern to allow derived classes to perform work in - whatever way is needed. - - A WorkItem is created with a particular TestExecutionContext - and is responsible for re-establishing that context in the - current thread before it begins or resumes execution. - - - - - Creates a work item. - - The test for which this WorkItem is being created. - The filter to be used in selecting any child Tests. - - - - - Construct a WorkItem for a particular test. - - The test that the WorkItem will run - - - - Initialize the TestExecutionContext. This must be done - before executing the WorkItem. - - - Originally, the context was provided in the constructor - but delaying initialization of the context until the item - is about to be dispatched allows changes in the parent - context during OneTimeSetUp to be reflected in the child. - - The TestExecutionContext to use - - - - Event triggered when the item is complete - - - - - Gets the current state of the WorkItem - - - - - The test being executed by the work item - - - - - The execution context - - - - - The test actions to be performed before and after this test - - - - - Indicates whether this WorkItem may be run in parallel - - - - - The test result - - - - - Execute the current work item, including any - child work items. - - - - - Method that performs actually performs the work. It should - set the State to WorkItemState.Complete when done. - - - - - Method called by the derived class when all work is complete - - - - - WorkItemQueueState indicates the current state of a WorkItemQueue - - - - - The queue is paused - - - - - The queue is running - - - - - The queue is stopped - - - - - A WorkItemQueue holds work items that are ready to - be run, either initially or after some dependency - has been satisfied. - - - - - Initializes a new instance of the class. - - The name of the queue. - - - - Gets the name of the work item queue. - - - - - Gets the total number of items processed so far - - - - - Gets the maximum number of work items. - - - - - Gets the current state of the queue - - - - - Get a bool indicating whether the queue is empty. - - - - - Enqueue a WorkItem to be processed - - The WorkItem to process - - - - Dequeue a WorkItem for processing - - A WorkItem or null if the queue has stopped - - - - Start or restart processing of items from the queue - - - - - Signal the queue to stop - - - - - Pause the queue for restarting later - - - - - The current state of a work item - - - - - Ready to run or continue - - - - - Work Item is executing - - - - - Complete - - - - - The dispatcher needs to do different things at different, - non-overlapped times. For example, non-parallel tests may - not be run at the same time as parallel tests. We model - this using the metaphor of a working shift. The WorkShift - class associates one or more WorkItemQueues with one or - more TestWorkers. - - Work in the queues is processed until all queues are empty - and all workers are idle. Both tests are needed because a - worker that is busy may end up adding more work to one of - the queues. At that point, the shift is over and another - shift may begin. This cycle continues until all the tests - have been run. - - - - - Construct a WorkShift - - - - - Event that fires when the shift has ended - - - - - Gets a flag indicating whether the shift is currently active - - - - - Gets a list of the queues associated with this shift. - - Used for testing - - - - Gets the list of workers associated with this shift. - - - - - Gets a bool indicating whether this shift has any work to do - - - - - Add a WorkItemQueue to the shift, starting it if the - shift is currently active. - - - - - Assign a worker to the shift. - - - - - - Start or restart processing for the shift - - - - - End the shift, pausing all queues and raising - the EndOfShift event. - - - - - Shut down the shift. - - - - - Cancel the shift without completing all work - - - - - TextMessageWriter writes constraint descriptions and messages - in displayable form as a text stream. It tailors the display - of individual message components to form the standard message - format of NUnit assertion failure messages. - - - - - Prefix used for the expected value line of a message - - - - - Prefix used for the actual value line of a message - - - - - Length of a message prefix - - - - - Construct a TextMessageWriter - - - - - Construct a TextMessageWriter, specifying a user message - and optional formatting arguments. - - - - - - - Gets or sets the maximum line length for this writer - - - - - Method to write single line message with optional args, usually - written to precede the general failure message, at a given - indentation level. - - The indentation level of the message - The message to be written - Any arguments used in formatting the message - - - - Display Expected and Actual lines for a constraint. This - is called by MessageWriter's default implementation of - WriteMessageTo and provides the generic two-line display. - - The result of the constraint that failed - - - - Display Expected and Actual lines for given _values. This - method may be called by constraints that need more control over - the display of actual and expected _values than is provided - by the default implementation. - - The expected value - The actual value causing the failure - - - - Display Expected and Actual lines for given _values, including - a tolerance value on the expected line. - - The expected value - The actual value causing the failure - The tolerance within which the test was made - - - - Display the expected and actual string _values on separate lines. - If the mismatch parameter is >=0, an additional line is displayed - line containing a caret that points to the mismatch point. - - The expected string value - The actual string value - The point at which the strings don't match or -1 - If true, case is ignored in string comparisons - If true, clip the strings to fit the max line length - - - - Writes the text for an actual value. - - The actual value. - - - - Writes the text for a generalized value. - - The value. - - - - Writes the text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Write the generic 'Expected' line for a constraint - - The constraint that failed - - - - Write the generic 'Expected' line for a given value - - The expected value - - - - Write the generic 'Expected' line for a given value - and tolerance. - - The expected value - The tolerance within which the test was made - - - - Write the generic 'Actual' line for a constraint - - The ConstraintResult for which the actual value is to be written - - - - Write the generic 'Actual' line for a given value - - The actual value causing a failure - - - - InvalidTestFixtureException is thrown when an appropriate test - fixture constructor using the provided arguments cannot be found. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The message. - - - - Initializes a new instance of the class. - - The message. - The inner. - - - - Serialization Constructor - - - - - The MethodWrapper class wraps a MethodInfo so that it may - be used in a platform-independent manner. - - - - - Construct a MethodWrapper for a Type and a MethodInfo. - - - - - Construct a MethodInfo for a given Type and method name. - - - - - Gets the Type from which this method was reflected. - - - - - Gets the MethodInfo for this method. - - - - - Gets the name of the method. - - - - - Gets a value indicating whether the method is abstract. - - - - - Gets a value indicating whether the method is public. - - - - - Gets a value indicating whether the method contains unassigned generic type parameters. - - - - - Gets a value indicating whether the method is a generic method. - - - - - Gets a value indicating whether the MethodInfo represents the definition of a generic method. - - - - - Gets the return Type of the method. - - - - - Gets the parameters of the method. - - - - - - Returns the Type arguments of a generic method or the Type parameters of a generic method definition. - - - - - Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. - - The type arguments to be used - A new IMethodInfo with the type arguments replaced - - - - Returns an array of custom attributes of the specified type applied to this method - - - - - Gets a value indicating whether one or more attributes of the spcified type are defined on the method. - - - - - Invokes the method, converting any TargetInvocationException to an NUnitException. - - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - Override ToString() so that error messages in NUnit's own tests make sense - - - - - Thrown when an assertion failed. Here to preserve the inner - exception and hence its stack trace. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The error message that explains - the reason for the exception - - - - Initializes a new instance of the class. - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - OSPlatform represents a particular operating system platform - - - - - Platform ID for Unix as defined by Microsoft .NET 2.0 and greater - - - - - Platform ID for Unix as defined by Mono - - - - - Platform ID for XBox as defined by .NET and Mono, but not CF - - - - - Platform ID for MacOSX as defined by .NET and Mono, but not CF - - - - - Get the OSPlatform under which we are currently running - - - - - Gets the actual OS Version, not the incorrect value that might be - returned for Win 8.1 and Win 10 - - - If an application is not manifested as Windows 8.1 or Windows 10, - the version returned from Environment.OSVersion will not be 6.3 and 10.0 - respectively, but will be 6.2 and 6.3. The correct value can be found in - the registry. - - The original version - The correct OS version - - - - Product Type Enumeration used for Windows - - - - - Product type is unknown or unspecified - - - - - Product type is Workstation - - - - - Product type is Domain Controller - - - - - Product type is Server - - - - - Construct from a platform ID and version - - - - - Construct from a platform ID, version and product type - - - - - Get the platform ID of this instance - - - - - Get the Version of this instance - - - - - Get the Product Type of this instance - - - - - Return true if this is a windows platform - - - - - Return true if this is a Unix or Linux platform - - - - - Return true if the platform is Win32S - - - - - Return true if the platform is Win32Windows - - - - - Return true if the platform is Win32NT - - - - - Return true if the platform is Windows CE - - - - - Return true if the platform is Xbox - - - - - Return true if the platform is MacOSX - - - - - Return true if the platform is Windows 95 - - - - - Return true if the platform is Windows 98 - - - - - Return true if the platform is Windows ME - - - - - Return true if the platform is NT 3 - - - - - Return true if the platform is NT 4 - - - - - Return true if the platform is NT 5 - - - - - Return true if the platform is Windows 2000 - - - - - Return true if the platform is Windows XP - - - - - Return true if the platform is Windows 2003 Server - - - - - Return true if the platform is NT 6 - - - - - Return true if the platform is NT 6.0 - - - - - Return true if the platform is NT 6.1 - - - - - Return true if the platform is NT 6.2 - - - - - Return true if the platform is NT 6.3 - - - - - Return true if the platform is Vista - - - - - Return true if the platform is Windows 2008 Server (original or R2) - - - - - Return true if the platform is Windows 2008 Server (original) - - - - - Return true if the platform is Windows 2008 Server R2 - - - - - Return true if the platform is Windows 2012 Server (original or R2) - - - - - Return true if the platform is Windows 2012 Server (original) - - - - - Return true if the platform is Windows 2012 Server R2 - - - - - Return true if the platform is Windows 7 - - - - - Return true if the platform is Windows 8 - - - - - Return true if the platform is Windows 8.1 - - - - - Return true if the platform is Windows 10 - - - - - Return true if the platform is Windows Server. This is named Windows - Server 10 to distinguish it from previous versions of Windows Server. - - - - - The ParameterWrapper class wraps a ParameterInfo so that it may - be used in a platform-independent manner. - - - - - Construct a ParameterWrapper for a given method and parameter - - - - - - - Gets a value indicating whether the parameter is optional - - - - - Gets an IMethodInfo representing the method for which this is a parameter. - - - - - Gets the underlying ParameterInfo - - - - - Gets the Type of the parameter - - - - - Returns an array of custom attributes of the specified type applied to this method - - - - - Gets a value indicating whether one or more attributes of the specified type are defined on the parameter. - - - - - PlatformHelper class is used by the PlatformAttribute class to - determine whether a platform is supported. - - - - - Comma-delimited list of all supported OS platform constants - - - - - Comma-delimited list of all supported Runtime platform constants - - - - - Default constructor uses the operating system and - common language runtime of the system. - - - - - Construct a PlatformHelper for a particular operating - system and common language runtime. Used in testing. - - OperatingSystem to be used - RuntimeFramework to be used - - - - Test to determine if one of a collection of platforms - is being used currently. - - - - - - - Tests to determine if the current platform is supported - based on a platform attribute. - - The attribute to examine - - - - - Tests to determine if the current platform is supported - based on a platform attribute. - - The attribute to examine - - - - - Test to determine if the a particular platform or comma- - delimited set of platforms is in use. - - Name of the platform or comma-separated list of platform ids - True if the platform is in use on the system - - - - Return the last failure reason. Results are not - defined if called before IsSupported( Attribute ) - is called. - - - - - A PropertyBag represents a collection of name value pairs - that allows duplicate entries with the same key. Methods - are provided for adding a new pair as well as for setting - a key to a single value. All keys are strings but _values - may be of any type. Null _values are not permitted, since - a null entry represents the absence of the key. - - - - - Adds a key/value pair to the property set - - The key - The value - - - - Sets the value for a key, removing any other - _values that are already in the property set. - - - - - - - Gets a single value for a key, using the first - one if multiple _values are present and returning - null if the value is not found. - - - - - - - Gets a flag indicating whether the specified key has - any entries in the property set. - - The key to be checked - - True if their are _values present, otherwise false - - - - - Gets a collection containing all the keys in the property set - - - - - - Gets or sets the list of _values for a particular key - - - - - Returns an XmlNode representating the current PropertyBag. - - Not used - An XmlNode representing the PropertyBag - - - - Returns an XmlNode representing the PropertyBag after - adding it as a child of the supplied parent node. - - The parent node. - Not used - - - - - The PropertyNames class provides static constants for the - standard property ids that NUnit uses on tests. - - - - - The FriendlyName of the AppDomain in which the assembly is running - - - - - The selected strategy for joining parameter data into test cases - - - - - The process ID of the executing assembly - - - - - The stack trace from any data provider that threw - an exception. - - - - - The reason a test was not run - - - - - The author of the tests - - - - - The ApartmentState required for running the test - - - - - The categories applying to a test - - - - - The Description of a test - - - - - The number of threads to be used in running tests - - - - - The maximum time in ms, above which the test is considered to have failed - - - - - The ParallelScope associated with a test - - - - - The number of times the test should be repeated - - - - - Indicates that the test should be run on a separate thread - - - - - The culture to be set for a test - - - - - The UI culture to be set for a test - - - - - The type that is under test - - - - - The timeout value for the test - - - - - The test will be ignored until the given date - - - - - Randomizer returns a set of random _values in a repeatable - way, to allow re-running of tests if necessary. It extends - the .NET Random class, providing random values for a much - wider range of types. - - The class is used internally by the framework to generate - test case data and is also exposed for use by users through - the TestContext.Random property. - - - For consistency with the underlying Random Type, methods - returning a single value use the prefix "Next..." Those - without an argument return a non-negative value up to - the full positive range of the Type. Overloads are provided - for specifying a maximum or a range. Methods that return - arrays or strings use the prefix "Get..." to avoid - confusion with the single-value methods. - - - - - Initial seed used to create randomizers for this run - - - - - Get a Randomizer for a particular member, returning - one that has already been created if it exists. - This ensures that the same _values are generated - each time the tests are reloaded. - - - - - Get a randomizer for a particular parameter, returning - one that has already been created if it exists. - This ensures that the same values are generated - each time the tests are reloaded. - - - - - Create a new Randomizer using the next seed - available to ensure that each randomizer gives - a unique sequence of values. - - - - - - Default constructor - - - - - Construct based on seed value - - - - - - Returns a random unsigned int. - - - - - Returns a random unsigned int less than the specified maximum. - - - - - Returns a random unsigned int within a specified range. - - - - - Returns a non-negative random short. - - - - - Returns a non-negative random short less than the specified maximum. - - - - - Returns a non-negative random short within a specified range. - - - - - Returns a random unsigned short. - - - - - Returns a random unsigned short less than the specified maximum. - - - - - Returns a random unsigned short within a specified range. - - - - - Returns a random long. - - - - - Returns a random long less than the specified maximum. - - - - - Returns a non-negative random long within a specified range. - - - - - Returns a random ulong. - - - - - Returns a random ulong less than the specified maximum. - - - - - Returns a non-negative random long within a specified range. - - - - - Returns a random Byte - - - - - Returns a random Byte less than the specified maximum. - - - - - Returns a random Byte within a specified range - - - - - Returns a random SByte - - - - - Returns a random sbyte less than the specified maximum. - - - - - Returns a random sbyte within a specified range - - - - - Returns a random bool - - - - - Returns a random bool based on the probablility a true result - - - - - Returns a random double between 0.0 and the specified maximum. - - - - - Returns a random double within a specified range. - - - - - Returns a random float. - - - - - Returns a random float between 0.0 and the specified maximum. - - - - - Returns a random float within a specified range. - - - - - Returns a random enum value of the specified Type as an object. - - - - - Returns a random enum value of the specified Type. - - - - - Default characters for random functions. - - Default characters are the English alphabet (uppercase & lowercase), arabic numerals, and underscore - - - - Generate a random string based on the characters from the input string. - - desired length of output string. - string representing the set of characters from which to construct the resulting string - A random string of arbitrary length - - - - Generate a random string based on the characters from the input string. - - desired length of output string. - A random string of arbitrary length - Uses DefaultStringChars as the input character set - - - - Generate a random string based on the characters from the input string. - - A random string of the default length - Uses DefaultStringChars as the input character set - - - - Returns a random decimal. - - - - - Returns a random decimal between positive zero and the specified maximum. - - - - - Returns a random decimal within a specified range, which is not - permitted to exceed decimal.MaxVal in the current implementation. - - - A limitation of this implementation is that the range from min - to max must not exceed decimal.MaxVal. - - - - - Helper methods for inspecting a type by reflection. - - Many of these methods take ICustomAttributeProvider as an - argument to avoid duplication, even though certain attributes can - only appear on specific types of members, like MethodInfo or Type. - - In the case where a type is being examined for the presence of - an attribute, interface or named member, the Reflect methods - operate with the full name of the member being sought. This - removes the necessity of the caller having a reference to the - assembly that defines the item being sought and allows the - NUnit core to inspect assemblies that reference an older - version of the NUnit framework. - - - - - Examine a fixture type and return an array of methods having a - particular attribute. The array is order with base methods first. - - The type to examine - The attribute Type to look for - Specifies whether to search the fixture type inheritance chain - The array of methods found - - - - Examine a fixture type and return true if it has a method with - a particular attribute. - - The type to examine - The attribute Type to look for - True if found, otherwise false - - - - Invoke the default constructor on a Type - - The Type to be constructed - An instance of the Type - - - - Invoke a constructor on a Type with arguments - - The Type to be constructed - Arguments to the constructor - An instance of the Type - - - - Returns an array of types from an array of objects. - Used because the compact framework doesn't support - Type.GetTypeArray() - - An array of objects - An array of Types - - - - Invoke a parameterless method returning void on an object. - - A MethodInfo for the method to be invoked - The object on which to invoke the method - - - - Invoke a method, converting any TargetInvocationException to an NUnitException. - - A MethodInfo for the method to be invoked - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - The TestResult class represents the result of a test. - - - - - Error message for when child tests have errors - - - - - Error message for when child tests are ignored - - - - - The minimum duration for tests - - - - - List of child results - - - - - Construct a test result given a Test - - The test to be used - - - - Gets the test with which this result is associated. - - - - - Gets the ResultState of the test result, which - indicates the success or failure of the test. - - - - - Gets the name of the test result - - - - - Gets the full name of the test result - - - - - Gets or sets the elapsed time for running the test in seconds - - - - - Gets or sets the time the test started running. - - - - - Gets or sets the time the test finished running. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. - - - - - Gets or sets the count of asserts executed - when running the test. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Indicates whether this result has any child results. - Test HasChildren before accessing Children to avoid - the creation of an empty collection. - - - - - Gets the collection of child results. - - - - - Gets a TextWriter, which will write output to be included in the result. - - - - - Gets any text output written to this result. - - - - - Returns the Xml representation of the result. - - If true, descendant results are included - An XmlNode representing the result - - - - Adds the XML representation of the result as a child of the - supplied parent node.. - - The parent node. - If true, descendant results are included - - - - - Adds a child result to this result, setting this result's - ResultState to Failure if the child result failed. - - The result to be added - - - - Set the result of the test - - The ResultState to use in the result - - - - Set the result of the test - - The ResultState to use in the result - A message associated with the result state - - - - Set the result of the test - - The ResultState to use in the result - A message associated with the result state - Stack trace giving the location of the command - - - - Set the test result based on the type of exception thrown - - The exception that was thrown - - - - Set the test result based on the type of exception thrown - - The exception that was thrown - THe FailureSite to use in the result - - - - RecordTearDownException appends the message and stacktrace - from an exception arising during teardown of the test - to any previously recorded information, so that any - earlier failure information is not lost. Note that - calling Assert.Ignore, Assert.Inconclusive, etc. during - teardown is treated as an error. If the current result - represents a suite, it may show a teardown error even - though all contained tests passed. - - The Exception to be recorded - - - - Adds a reason element to a node and returns it. - - The target node. - The new reason element. - - - - Adds a failure element to a node and returns it. - - The target node. - The new failure element. - - - - Enumeration identifying a common language - runtime implementation. - - - - Any supported runtime framework - - - Microsoft .NET Framework - - - Microsoft .NET Compact Framework - - - Microsoft Shared Source CLI - - - Mono - - - Silverlight - - - MonoTouch - - - - RuntimeFramework represents a particular version - of a common language runtime implementation. - - - - - DefaultVersion is an empty Version, used to indicate that - NUnit should select the CLR version to use for the test. - - - - - Construct from a runtime type and version. If the version has - two parts, it is taken as a framework version. If it has three - or more, it is taken as a CLR version. In either case, the other - version is deduced based on the runtime type and provided version. - - The runtime type of the framework - The version of the framework - - - - Static method to return a RuntimeFramework object - for the framework that is currently in use. - - - - - The type of this runtime framework - - - - - The framework version for this runtime framework - - - - - The CLR version for this runtime framework - - - - - Return true if any CLR version may be used in - matching this RuntimeFramework object. - - - - - Returns the Display name for this framework - - - - - Parses a string representing a RuntimeFramework. - The string may be just a RuntimeType name or just - a Version or a hyphenated RuntimeType-Version or - a Version prefixed by 'versionString'. - - - - - - - Overridden to return the short name of the framework - - - - - - Returns true if the current framework matches the - one supplied as an argument. Two frameworks match - if their runtime types are the same or either one - is RuntimeType.Any and all specified version components - are equal. Negative (i.e. unspecified) version - components are ignored. - - The RuntimeFramework to be matched. - True on match, otherwise false - - - - StackFilter class is used to remove internal NUnit - entries from a stack trace so that the resulting - trace provides better information about the test. - - - - - Filters a raw stack trace and returns the result. - - The original stack trace - A filtered stack trace - - - - Provides methods to support legacy string comparison methods. - - - - - Compares two strings for equality, ignoring case if requested. - - The first string. - The second string.. - if set to true, the case of the letters in the strings is ignored. - Zero if the strings are equivalent, a negative number if strA is sorted first, a positive number if - strB is sorted first - - - - Compares two strings for equality, ignoring case if requested. - - The first string. - The second string.. - if set to true, the case of the letters in the strings is ignored. - True if the strings are equivalent, false if not. - - - - The TestCaseParameters class encapsulates method arguments and - other selected parameters needed for constructing - a parameterized test case. - - - - - The expected result to be returned - - - - - Default Constructor creates an empty parameter set - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a ParameterSet from an object implementing ITestCaseData - - - - - - The expected result of the test, which - must match the method return type. - - - - - Gets a value indicating whether an expected result was specified. - - - - - Helper class used to save and restore certain static or - singleton settings in the environment that affect tests - or which might be changed by the user tests. - - An internal class is used to hold settings and a stack - of these objects is pushed and popped as Save and Restore - are called. - - - - - Link to a prior saved context - - - - - Indicates that a stop has been requested - - - - - The event listener currently receiving notifications - - - - - The number of assertions for the current test - - - - - The current culture - - - - - The current UI culture - - - - - The current test result - - - - - The current Principal. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - An existing instance of TestExecutionContext. - - - - The current context, head of the list of saved contexts. - - - - - Gets the current context. - - The current context. - - - - Get the current context or return null if none is found. - - - - - Clear the current context. This is provided to - prevent "leakage" of the CallContext containing - the current context back to any runners. - - - - - Gets or sets the current test - - - - - The time the current test started execution - - - - - The time the current test started in Ticks - - - - - Gets or sets the current test result - - - - - Gets a TextWriter that will send output to the current test result. - - - - - The current test object - that is the user fixture - object on which tests are being executed. - - - - - Get or set the working directory - - - - - Get or set indicator that run should stop on the first error - - - - - Gets an enum indicating whether a stop has been requested. - - - - - The current test event listener - - - - - The current WorkItemDispatcher - - - - - The ParallelScope to be used by tests running in this context. - For builds with out the parallel feature, it has no effect. - - - - - Gets the RandomGenerator specific to this Test - - - - - Gets the assert count. - - The assert count. - - - - Gets or sets the test case timeout value - - - - - Gets a list of ITestActions set by upstream tests - - - - - Saves or restores the CurrentCulture - - - - - Saves or restores the CurrentUICulture - - - - - Gets or sets the current for the Thread. - - - - - Record any changes in the environment made by - the test code in the execution context so it - will be passed on to lower level tests. - - - - - Set up the execution environment to match a context. - Note that we may be running on the same thread where the - context was initially created or on a different thread. - - - - - Increments the assert count by one. - - - - - Increments the assert count by a specified amount. - - - - - Obtain lifetime service object - - - - - - Enumeration indicating whether the tests are - running normally or being cancelled. - - - - - Running normally with no stop requested - - - - - A graceful stop has been requested - - - - - A forced stop has been requested - - - - - Interface to be implemented by filters applied to tests. - The filter applies when running the test, after it has been - loaded, since this is the only time an ITest exists. - - - - - Unique Empty filter. - - - - - Indicates whether this is the EmptyFilter - - - - - Indicates whether this is a top-level filter, - not contained in any other filter. - - - - - Determine if a particular test passes the filter criteria. The default - implementation checks the test itself, its parents and any descendants. - - Derived classes may override this method or any of the Match methods - to change the behavior of the filter. - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - Determine whether the test itself matches the filter criteria, without - examining either parents or descendants. This is overridden by each - different type of filter to perform the necessary tests. - - The test to which the filter is applied - True if the filter matches the any parent of the test - - - - Determine whether any ancestor of the test matches the filter criteria - - The test to which the filter is applied - True if the filter matches the an ancestor of the test - - - - Determine whether any descendant of the test matches the filter criteria. - - The test to be matched - True if at least one descendant matches the filter criteria - - - - Create a TestFilter instance from an xml representation. - - - - - Create a TestFilter from it's TNode representation - - - - - Nested class provides an empty filter - one that always - returns true when called. It never matches explicitly. - - - - - Adds an XML node - - True if recursive - The added XML node - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - The TestCaseParameters class encapsulates method arguments and - other selected parameters needed for constructing - a parameterized test case. - - - - - Default Constructor creates an empty parameter set - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a ParameterSet from an object implementing ITestCaseData - - - - - - Type arguments used to create a generic fixture instance - - - - - TestListener provides an implementation of ITestListener that - does nothing. It is used only through its NULL property. - - - - - Called when a test has just started - - The test that is starting - - - - Called when a test case has finished - - The result of the test - - - - Construct a new TestListener - private so it may not be used. - - - - - Get a listener that does nothing - - - - - TestNameGenerator is able to create test names according to - a coded pattern. - - - - - Construct a TestNameGenerator - - The pattern used by this generator. - - - - Get the display name for a TestMethod and it's arguments - - A TestMethod - The display name - - - - Get the display name for a TestMethod and it's arguments - - A TestMethod - Arguments to be used - The display name - - - - Get the display name for a MethodInfo - - A MethodInfo - The display name - - - - Get the display name for a method with args - - A MethodInfo - Argument list for the method - The display name - - - - TestParameters is the abstract base class for all classes - that know how to provide data for constructing a test. - - - - - Default Constructor creates an empty parameter set - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a ParameterSet from an object implementing ITestData - - - - - - The RunState for this set of parameters. - - - - - The arguments to be used in running the test, - which must match the method signature. - - - - - A name to be used for this test case in lieu - of the standard generated name containing - the argument list. - - - - - Gets the property dictionary for this test - - - - - Applies ParameterSet _values to the test itself. - - A test. - - - - The original arguments provided by the user, - used for display purposes. - - - - - TestProgressReporter translates ITestListener events into - the async callbacks that are used to inform the client - software about the progress of a test run. - - - - - Initializes a new instance of the class. - - The callback handler to be used for reporting progress. - - - - Called when a test has just started - - The test that is starting - - - - Called when a test has finished. Sends a result summary to the callback. - to - - The result of the test - - - - Returns the parent test item for the targer test item if it exists - - - parent test item - - - - Makes a string safe for use as an attribute, replacing - characters characters that can't be used with their - corresponding xml representations. - - The string to be used - A new string with the _values replaced - - - - ParameterizedFixtureSuite serves as a container for the set of test - fixtures created from a given Type using various parameters. - - - - - Initializes a new instance of the class. - - The ITypeInfo for the type that represents the suite. - - - - Gets a string representing the type of test - - - - - - ParameterizedMethodSuite holds a collection of individual - TestMethods with their arguments applied. - - - - - Construct from a MethodInfo - - - - - - Gets a string representing the type of test - - - - - - SetUpFixture extends TestSuite and supports - Setup and TearDown methods. - - - - - Initializes a new instance of the class. - - The type. - - - - The Test abstract class represents a test within the framework. - - - - - Static value to seed ids. It's started at 1000 so any - uninitialized ids will stand out. - - - - - The SetUp methods. - - - - - The teardown methods - - - - - Constructs a test given its name - - The name of the test - - - - Constructs a test given the path through the - test hierarchy to its parent and a name. - - The parent tests full name - The name of the test - - - - TODO: Documentation needed for constructor - - - - - - Construct a test from a MethodInfo - - - - - - Gets or sets the id of the test - - - - - - Gets or sets the name of the test - - - - - Gets or sets the fully qualified name of the test - - - - - - Gets the name of the class containing this test. Returns - null if the test is not associated with a class. - - - - - Gets the name of the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the TypeInfo of the fixture used in running this test - or null if no fixture type is associated with it. - - - - - Gets a MethodInfo for the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Whether or not the test should be run - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Gets a string representing the type of test. Used as an attribute - value in the XML representation of a test and has no other - function in the framework. - - - - - Gets a count of test cases represented by - or contained under this test. - - - - - Gets the properties for this test - - - - - Returns true if this is a TestSuite - - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets the parent as a Test object. - Used by the core to set the parent. - - - - - Gets this test's child tests - - A list of child tests - - - - Gets or sets a fixture object for running this test. - - - - - Static prefix used for ids in this AppDomain. - Set by FrameworkController. - - - - - Gets or Sets the Int value representing the seed for the RandomGenerator - - - - - - Creates a TestResult for this test. - - A TestResult suitable for this type of test. - - - - Modify a newly constructed test by applying any of NUnit's common - attributes, based on a supplied ICustomAttributeProvider, which is - usually the reflection element from which the test was constructed, - but may not be in some instances. The attributes retrieved are - saved for use in subsequent operations. - - An object implementing ICustomAttributeProvider - - - - Add standard attributes and members to a test node. - - - - - - - Returns the Xml representation of the test - - If true, include child tests recursively - - - - - Returns an XmlNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Compares this test to another test for sorting purposes - - The other test - Value of -1, 0 or +1 depending on whether the current test is less than, equal to or greater than the other test - - - - TestAssembly is a TestSuite that represents the execution - of tests in a managed assembly. - - - - - Initializes a new instance of the class - specifying the Assembly and the path from which it was loaded. - - The assembly this test represents. - The path used to load the assembly. - - - - Initializes a new instance of the class - for a path which could not be loaded. - - The path used to load the assembly. - - - - Gets the Assembly represented by this instance. - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - TestFixture is a surrogate for a user test fixture class, - containing one or more tests. - - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - The TestMethod class represents a Test implemented as a method. - - - - - The ParameterSet used to create this test method - - - - - Initializes a new instance of the class. - - The method to be used as a test. - - - - Initializes a new instance of the class. - - The method to be used as a test. - The suite or fixture to which the new test will be added - - - - Overridden to return a TestCaseResult. - - A TestResult for this test. - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Returns a TNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Gets this test's child tests - - A list of child tests - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Returns the name of the method - - - - - TestSuite represents a composite test, which contains other tests. - - - - - Our collection of child tests - - - - - Initializes a new instance of the class. - - The name of the suite. - - - - Initializes a new instance of the class. - - Name of the parent suite. - The name of the suite. - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - Sorts tests under this suite. - - - - - Adds a test to the suite. - - The test. - - - - Gets this test's child tests - - The list of child tests - - - - Gets a count of test cases represented by - or contained under this test. - - - - - - The arguments to use in creating the fixture - - - - - Set to true to suppress sorting this suite's contents - - - - - Overridden to return a TestSuiteResult. - - A TestResult for this test. - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Returns an XmlNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Check that setup and teardown methods marked by certain attributes - meet NUnit's requirements and mark the tests not runnable otherwise. - - The attribute type to check for - - - - ThreadUtility provides a set of static methods convenient - for working with threads. - - - - - Do our best to Kill a thread - - The thread to kill - - - - Do our best to kill a thread, passing state info - - The thread to kill - Info for the ThreadAbortException handler - - - - TypeHelper provides static methods that operate on Types. - - - - - A special value, which is used to indicate that BestCommonType() method - was unable to find a common type for the specified arguments. - - - - - Gets the display name for a Type as used by NUnit. - - The Type for which a display name is needed. - The display name for the Type - - - - Gets the display name for a Type as used by NUnit. - - The Type for which a display name is needed. - The arglist provided. - The display name for the Type - - - - Returns the best fit for a common type to be used in - matching actual arguments to a methods Type parameters. - - The first type. - The second type. - Either type1 or type2, depending on which is more general. - - - - Determines whether the specified type is numeric. - - The type to be examined. - - true if the specified type is numeric; otherwise, false. - - - - - Convert an argument list to the required parameter types. - Currently, only widening numeric conversions are performed. - - An array of args to be converted - A ParameterInfo[] whose types will be used as targets - - - - Determines whether this instance can deduce type args for a generic type from the supplied arguments. - - The type to be examined. - The arglist. - The type args to be used. - - true if this the provided args give sufficient information to determine the type args to be used; otherwise, false. - - - - - Gets the _values for an enumeration, using Enum.GetTypes - where available, otherwise through reflection. - - - - - - - Gets the ids of the _values for an enumeration, - using Enum.GetNames where available, otherwise - through reflection. - - - - - - - The TypeWrapper class wraps a Type so it may be used in - a platform-independent manner. - - - - - Construct a TypeWrapper for a specified Type. - - - - - Gets the underlying Type on which this TypeWrapper is based. - - - - - Gets the base type of this type as an ITypeInfo - - - - - Gets the Name of the Type - - - - - Gets the FullName of the Type - - - - - Gets the assembly in which the type is declared - - - - - Gets the namespace of the Type - - - - - Gets a value indicating whether the type is abstract. - - - - - Gets a value indicating whether the Type is a generic Type - - - - - Returns true if the Type wrapped is T - - - - - Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. - - - - - Gets a value indicating whether the Type is a generic Type definition - - - - - Gets a value indicating whether the type is sealed. - - - - - Gets a value indicating whether this type represents a static class. - - - - - Get the display name for this type - - - - - Get the display name for an object of this type, constructed with the specified args. - - - - - Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments - - - - - Returns a Type representing a generic type definition from which this Type can be constructed. - - - - - Returns an array of custom attributes of the specified type applied to this type - - - - - Returns a value indicating whether the type has an attribute of the specified type. - - - - - - - - Returns a flag indicating whether this type has a method with an attribute of the specified type. - - - - - - - Returns an array of IMethodInfos for methods of this Type - that match the specified flags. - - - - - Returns a value indicating whether this Type has a public constructor taking the specified argument Types. - - - - - Construct an object of this Type, using the specified arguments. - - - - - Override ToString() so that error messages in NUnit's own tests make sense - - - - - Represents the result of running a single test case. - - - - - Construct a TestCaseResult based on a TestMethod - - A TestMethod to which the result applies. - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Represents the result of running a test suite - - - - - Construct a TestSuiteResult base on a TestSuite - - The TestSuite to which the result applies - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Add a child result - - The child result to be added - - - - Class used to guard against unexpected argument values - or operations by throwing an appropriate exception. - - - - - Throws an exception if an argument is null - - The value to be tested - The name of the argument - - - - Throws an exception if a string argument is null or empty - - The value to be tested - The name of the argument - - - - Throws an ArgumentOutOfRangeException if the specified condition is not met. - - The condition that must be met - The exception message to be used - The name of the argument - - - - Throws an ArgumentException if the specified condition is not met. - - The condition that must be met - The exception message to be used - The name of the argument - - - - Throws an InvalidOperationException if the specified condition is not met. - - The condition that must be met - The exception message to be used - - - - The different targets a test action attribute can be applied to - - - - - Default target, which is determined by where the action attribute is attached - - - - - Target a individual test case - - - - - Target a suite of test cases - - - - - DefaultTestAssemblyBuilder loads a single assembly and builds a TestSuite - containing test fixtures present in the assembly. - - - - - The default suite builder used by the test assembly builder. - - - - - Initializes a new instance of the class. - - - - - Build a suite of tests from a provided assembly - - The assembly from which tests are to be built - A dictionary of options to use in building the suite - - A TestSuite containing the tests found in the assembly - - - - - Build a suite of tests given the filename of an assembly - - The filename of the assembly from which tests are to be built - A dictionary of options to use in building the suite - - A TestSuite containing the tests found in the assembly - - - - - FrameworkController provides a facade for use in loading, browsing - and running tests without requiring a reference to the NUnit - framework. All calls are encapsulated in constructors for - this class and its nested classes, which only require the - types of the Common Type System as arguments. - - The controller supports four actions: Load, Explore, Count and Run. - They are intended to be called by a driver, which should allow for - proper sequencing of calls. Load must be called before any of the - other actions. The driver may support other actions, such as - reload on run, by combining these calls. - - - - - Construct a FrameworkController using the default builder and runner. - - The AssemblyName or path to the test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - - - - Construct a FrameworkController using the default builder and runner. - - The test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - - - - Construct a FrameworkController, specifying the types to be used - for the runner and builder. This constructor is provided for - purposes of development. - - The full AssemblyName or the path to the test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - The Type of the test runner - The Type of the test builder - - - - Construct a FrameworkController, specifying the types to be used - for the runner and builder. This constructor is provided for - purposes of development. - - The test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - The Type of the test runner - The Type of the test builder - - - - Gets the ITestAssemblyBuilder used by this controller instance. - - The builder. - - - - Gets the ITestAssemblyRunner used by this controller instance. - - The runner. - - - - Gets the AssemblyName or the path for which this FrameworkController was created - - - - - Gets the Assembly for which this - - - - - Gets a dictionary of settings for the FrameworkController - - - - - Inserts environment element - - Target node - The new node - - - - Inserts settings element - - Target node - Settings dictionary - The new node - - - - FrameworkControllerAction is the base class for all actions - performed against a FrameworkController. - - - - - LoadTestsAction loads a test into the FrameworkController - - - - - LoadTestsAction loads the tests in an assembly. - - The controller. - The callback handler. - - - - ExploreTestsAction returns info about the tests in an assembly - - - - - Initializes a new instance of the class. - - The controller for which this action is being performed. - Filter used to control which tests are included (NYI) - The callback handler. - - - - CountTestsAction counts the number of test cases in the loaded TestSuite - held by the FrameworkController. - - - - - Construct a CountsTestAction and perform the count of test cases. - - A FrameworkController holding the TestSuite whose cases are to be counted - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - RunTestsAction runs the loaded TestSuite held by the FrameworkController. - - - - - Construct a RunTestsAction and run all tests in the loaded TestSuite. - - A FrameworkController holding the TestSuite to run - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - RunAsyncAction initiates an asynchronous test run, returning immediately - - - - - Construct a RunAsyncAction and run all tests in the loaded TestSuite. - - A FrameworkController holding the TestSuite to run - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - StopRunAction stops an ongoing run. - - - - - Construct a StopRunAction and stop any ongoing run. If no - run is in process, no error is raised. - - The FrameworkController for which a run is to be stopped. - True the stop should be forced, false for a cooperative stop. - >A callback handler used to report results - A forced stop will cause threads and processes to be killed as needed. - - - - The ITestAssemblyBuilder interface is implemented by a class - that is able to build a suite of tests given an assembly or - an assembly filename. - - - - - Build a suite of tests from a provided assembly - - The assembly from which tests are to be built - A dictionary of options to use in building the suite - A TestSuite containing the tests found in the assembly - - - - Build a suite of tests given the filename of an assembly - - The filename of the assembly from which tests are to be built - A dictionary of options to use in building the suite - A TestSuite containing the tests found in the assembly - - - - The ITestAssemblyRunner interface is implemented by classes - that are able to execute a suite of tests loaded - from an assembly. - - - - - Gets the tree of loaded tests, or null if - no tests have been loaded. - - - - - Gets the tree of test results, if the test - run is completed, otherwise null. - - - - - Indicates whether a test has been loaded - - - - - Indicates whether a test is currently running - - - - - Indicates whether a test run is complete - - - - - Loads the tests found in an Assembly, returning an - indication of whether or not the load succeeded. - - File name of the assembly to load - Dictionary of options to use in loading the test - An ITest representing the loaded tests - - - - Loads the tests found in an Assembly, returning an - indication of whether or not the load succeeded. - - The assembly to load - Dictionary of options to use in loading the test - An ITest representing the loaded tests - - - - Count Test Cases using a filter - - The filter to apply - The number of test cases found - - - - Run selected tests and return a test result. The test is run synchronously, - and the listener interface is notified as it progresses. - - Interface to receive ITestListener notifications. - A test filter used to select tests to be run - - - - Run selected tests asynchronously, notifying the listener interface as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - - - Wait for the ongoing run to complete. - - Time to wait in milliseconds - True if the run completed, otherwise false - - - - Signal any test run that is in process to stop. Return without error if no test is running. - - If true, kill any test-running threads - - - - Implementation of ITestAssemblyRunner - - - - - Initializes a new instance of the class. - - The builder. - - - - Gets the default level of parallel execution (worker threads) - - - - - The tree of tests that was loaded by the builder - - - - - The test result, if a run has completed - - - - - Indicates whether a test is loaded - - - - - Indicates whether a test is running - - - - - Indicates whether a test run is complete - - - - - Our settings, specified when loading the assembly - - - - - The top level WorkItem created for the assembly as a whole - - - - - The TestExecutionContext for the top level WorkItem - - - - - Loads the tests found in an Assembly - - File name of the assembly to load - Dictionary of option settings for loading the assembly - True if the load was successful - - - - Loads the tests found in an Assembly - - The assembly to load - Dictionary of option settings for loading the assembly - True if the load was successful - - - - Count Test Cases using a filter - - The filter to apply - The number of test cases found - - - - Run selected tests and return a test result. The test is run synchronously, - and the listener interface is notified as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - - - - Run selected tests asynchronously, notifying the listener interface as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - RunAsync is a template method, calling various abstract and - virtual methods to be overridden by derived classes. - - - - - Wait for the ongoing run to complete. - - Time to wait in milliseconds - True if the run completed, otherwise false - - - - Initiate the test run. - - - - - Signal any test run that is in process to stop. Return without error if no test is running. - - If true, kill any test-running threads - - - - Create the initial TestExecutionContext used to run tests - - The ITestListener specified in the RunAsync call - - - - Handle the the Completed event for the top level work item - - - - - The Assert class contains a collection of static methods that - implement the most common assertions used in NUnit. - - - - - Verifies that the first int is greater than the second - int. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first int is greater than the second - int. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - - - - Assert that a string is empty - that is equal to string.Empty - - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that a string is empty - that is equal to string.Empty - - The string to be tested - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing ICollection - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing ICollection - - - - Assert that a string is not empty - that is not equal to string.Empty - - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that a string is not empty - that is not equal to string.Empty - - The string to be tested - - - - Assert that an array, list or other collection is not empty - - An array, list or other collection implementing ICollection - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that an array, list or other collection is not empty - - An array, list or other collection implementing ICollection - - - - We don't actually want any instances of this object, but some people - like to inherit from it to add other static methods. Hence, the - protected constructor disallows any instances of this object. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - The message to initialize the with. - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - - - - Throws an with the message and arguments - that are passed in. This is used by the other Assert functions. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This is used by the other Assert functions. - - The message to initialize the with. - - - - Throws an . - This is used by the other Assert functions. - - - - - Throws an with the message and arguments - that are passed in. This causes the test to be reported as ignored. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This causes the test to be reported as ignored. - - The message to initialize the with. - - - - Throws an . - This causes the test to be reported as ignored. - - - - - Throws an with the message and arguments - that are passed in. This causes the test to be reported as inconclusive. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This causes the test to be reported as inconclusive. - - The message to initialize the with. - - - - Throws an . - This causes the test to be reported as Inconclusive. - - - - - Asserts that an object is contained in a list. - - The expected object - The list to be examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is contained in a list. - - The expected object - The list to be examined - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - - - - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. - - The value that is expected - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. - - The value that is expected - The actual value - - - - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. - - The value that is expected - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. - - The value that is expected - The actual value - - - - Asserts that two objects refer to the same object. If they - are not the same an is thrown. - - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that two objects refer to the same object. If they - are not the same an is thrown. - - The expected object - The actual object - - - - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. - - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. - - The expected object - The actual object - - - - Helper for Assert.AreEqual(double expected, double actual, ...) - allowing code generation to work consistently. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - A constraint to be satisfied by the exception - A TestSnippet delegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - A constraint to be satisfied by the exception - A TestSnippet delegate - - - - Verifies that a delegate throws a particular exception when called. - - The exception Type expected - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - The exception Type expected - A TestDelegate - - - - Verifies that a delegate throws a particular exception when called. - - Type of the expected exception - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - Type of the expected exception - A TestDelegate - - - - Verifies that a delegate throws an exception when called - and returns it. - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception when called - and returns it. - - A TestDelegate - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - A TestDelegate - - - - Verifies that a delegate does not throw an exception - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate does not throw an exception. - - A TestDelegate - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - Used as a synonym for That in rare cases where a private setter - causes a Visual Basic compilation error. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - Used as a synonym for That in rare cases where a private setter - causes a Visual Basic compilation error. - - - This method is provided for use by VB developers needing to test - the value of properties with private setters. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - - - - Delegate used by tests that execute code and - capture any thrown exception. - - - - - AssertionHelper is an optional base class for user tests, - allowing the use of shorter ids for constraints and - asserts and avoiding conflict with the definition of - , from which it inherits much of its - behavior, in certain mock object frameworks. - - - - - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to - . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to . - - The evaluated condition - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Returns a ListMapper based on a collection. - - The original collection - - - - - Provides static methods to express the assumptions - that must be met for a test to give a meaningful - result. If an assumption is not met, the test - should produce an inconclusive result. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the - method throws an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Marks a test that must run in a particular threading apartment state, causing it - to run in a separate thread if necessary. - - - - - Construct an ApartmentAttribute - - The apartment state that this test must be run under. You must pass in a valid apartment state. - - - - Provides the Author of a test or test fixture. - - - - - Initializes a new instance of the class. - - The name of the author. - - - - Initializes a new instance of the class. - - The name of the author. - The email address of the author. - - - - Attribute used to apply a category to a test - - - - - The name of the category - - - - - Construct attribute for a given category based on - a name. The name may not contain the characters ',', - '+', '-' or '!'. However, this is not checked in the - constructor since it would cause an error to arise at - as the test was loaded without giving a clear indication - of where the problem is located. The error is handled - in NUnitFramework.cs by marking the test as not - runnable. - - The name of the category - - - - Protected constructor uses the Type name as the name - of the category. - - - - - The name of the category - - - - - Modifies a test by adding a category to it. - - The test to modify - - - - Marks a test to use a combinatorial join of any argument - data provided. Since this is the default, the attribute is - optional. - - - - - Default constructor - - - - - Marks a test to use a particular CombiningStrategy to join - any parameter data provided. Since this is the default, the - attribute is optional. - - - - - Construct a CombiningStrategyAttribute incorporating an - ICombiningStrategy and an IParamterDataProvider. - - Combining strategy to be used in combining data - An IParameterDataProvider to supply data - - - - Construct a CombiningStrategyAttribute incorporating an object - that implements ICombiningStrategy and an IParameterDataProvider. - This constructor is provided for CLS compliance. - - Combining strategy to be used in combining data - An IParameterDataProvider to supply data - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The MethodInfo for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - Modify the test by adding the name of the combining strategy - to the properties. - - The test to modify - - - - CultureAttribute is used to mark a test fixture or an - individual method as applying to a particular Culture only. - - - - - Constructor with no cultures specified, for use - with named property syntax. - - - - - Constructor taking one or more cultures - - Comma-deliminted list of cultures - - - - Causes a test to be skipped if this CultureAttribute is not satisfied. - - The test to modify - - - - Tests to determine if the current culture is supported - based on the properties of this attribute. - - True, if the current culture is supported - - - - Test to determine if the a particular culture or comma- - delimited set of cultures is in use. - - Name of the culture or comma-separated list of culture ids - True if the culture is in use on the system - - - - Test to determine if one of a collection of cultures - is being used currently. - - - - - - - The abstract base class for all data-providing attributes - defined by NUnit. Used to select all data sources for a - method, class or parameter. - - - - - Default constructor - - - - - Used to mark a field for use as a datapoint when executing a theory - within the same fixture that requires an argument of the field's Type. - - - - - Used to mark a field, property or method providing a set of datapoints to - be used in executing any theories within the same fixture that require an - argument of the Type provided. The data source may provide an array of - the required Type or an . - Synonymous with DatapointSourceAttribute. - - - - - Used to mark a field, property or method providing a set of datapoints to - be used in executing any theories within the same fixture that require an - argument of the Type provided. The data source may provide an array of - the required Type or an . - Synonymous with DatapointsAttribute. - - - - - Attribute used to provide descriptive text about a - test case or fixture. - - - - - Construct a description Attribute - - The text of the description - - - - ExplicitAttribute marks a test or test fixture so that it will - only be run if explicitly executed from the gui or command line - or if it is included by use of a filter. The test will not be - run simply because an enclosing suite is run. - - - - - Default constructor - - - - - Constructor with a reason - - The reason test is marked explicit - - - - Modifies a test by marking it as explicit. - - The test to modify - - - - Attribute used to mark a test that is to be ignored. - Ignored tests result in a warning message when the - tests are run. - - - - - Constructs the attribute giving a reason for ignoring the test - - The reason for ignoring the test - - - - The date in the future to stop ignoring the test as a string in UTC time. - For example for a date and time, "2014-12-25 08:10:00Z" or for just a date, - "2014-12-25". If just a date is given, the Ignore will expire at midnight UTC. - - - Once the ignore until date has passed, the test will be marked - as runnable. Tests with an ignore until date will have an IgnoreUntilDate - property set which will appear in the test results. - - The string does not contain a valid string representation of a date and time. - - - - Modifies a test by marking it as Ignored. - - The test to modify - - - - Abstract base for Attributes that are used to include tests - in the test run based on environmental settings. - - - - - Constructor with no included items specified, for use - with named property syntax. - - - - - Constructor taking one or more included items - - Comma-delimited list of included items - - - - Name of the item that is needed in order for - a test to run. Multiple items may be given, - separated by a comma. - - - - - Name of the item to be excluded. Multiple items - may be given, separated by a comma. - - - - - The reason for including or excluding the test - - - - - LevelOfParallelismAttribute is used to set the number of worker threads - that may be allocated by the framework for running tests. - - - - - Construct a LevelOfParallelismAttribute. - - The number of worker threads to be created by the framework. - - - - Summary description for MaxTimeAttribute. - - - - - Construct a MaxTimeAttribute, given a time in milliseconds. - - The maximum elapsed time in milliseconds - - - - The abstract base class for all custom attributes defined by NUnit. - - - - - Default constructor - - - - - Attribute used to identify a method that is called once - to perform setup before any child tests are run. - - - - - Attribute used to identify a method that is called once - after all the child tests have run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Marks a test to use a pairwise join of any argument - data provided. Arguments will be combined in such a - way that all possible pairs of arguments are used. - - - - - Default constructor - - - - - ParallelizableAttribute is used to mark tests that may be run in parallel. - - - - - Construct a ParallelizableAttribute using default ParallelScope.Self. - - - - - Construct a ParallelizableAttribute with a specified scope. - - The ParallelScope associated with this attribute. - - - - Modify the context to be used for child tests - - The current TestExecutionContext - - - - The ParallelScope enumeration permits specifying the degree to - which a test and its descendants may be run in parallel. - - - - - No Parallelism is permitted - - - - - The test itself may be run in parallel with others at the same level - - - - - Descendants of the test may be run in parallel with one another - - - - - Descendants of the test down to the level of TestFixtures may be run in parallel - - - - - PlatformAttribute is used to mark a test fixture or an - individual method as applying to a particular platform only. - - - - - Constructor with no platforms specified, for use - with named property syntax. - - - - - Constructor taking one or more platforms - - Comma-delimited list of platforms - - - - Causes a test to be skipped if this PlatformAttribute is not satisfied. - - The test to modify - - - - PropertyAttribute is used to attach information to a test as a name/value pair.. - - - - - Construct a PropertyAttribute with a name and string value - - The name of the property - The property value - - - - Construct a PropertyAttribute with a name and int value - - The name of the property - The property value - - - - Construct a PropertyAttribute with a name and double value - - The name of the property - The property value - - - - Constructor for derived classes that set the - property dictionary directly. - - - - - Constructor for use by derived classes that use the - name of the type as the property name. Derived classes - must ensure that the Type of the property value is - a standard type supported by the BCL. Any custom - types will cause a serialization Exception when - in the client. - - - - - Gets the property dictionary for this attribute - - - - - Modifies a test by adding properties to it. - - The test to modify - - - - RandomAttribute is used to supply a set of random _values - to a single parameter of a parameterized test. - - - - - Construct a random set of values appropriate for the Type of the - parameter on which the attribute appears, specifying only the count. - - - - - - Construct a set of ints within a specified range - - - - - Construct a set of unsigned ints within a specified range - - - - - Construct a set of longs within a specified range - - - - - Construct a set of unsigned longs within a specified range - - - - - Construct a set of shorts within a specified range - - - - - Construct a set of unsigned shorts within a specified range - - - - - Construct a set of doubles within a specified range - - - - - Construct a set of floats within a specified range - - - - - Construct a set of bytes within a specified range - - - - - Construct a set of sbytes within a specified range - - - - - Get the collection of _values to be used as arguments. - - - - - RangeAttribute is used to supply a range of _values to an - individual parameter of a parameterized test. - - - - - Construct a range of ints using default step of 1 - - - - - - - Construct a range of ints specifying the step size - - - - - - - - Construct a range of unsigned ints using default step of 1 - - - - - - - Construct a range of unsigned ints specifying the step size - - - - - - - - Construct a range of longs using a default step of 1 - - - - - - - Construct a range of longs - - - - - - - - Construct a range of unsigned longs using default step of 1 - - - - - - - Construct a range of unsigned longs specifying the step size - - - - - - - - Construct a range of doubles - - - - - - - - Construct a range of floats - - - - - - - - RepeatAttribute may be applied to test case in order - to run it multiple times. - - - - - Construct a RepeatAttribute - - The number of times to run the test - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - The test command for the RepeatAttribute - - - - - Initializes a new instance of the class. - - The inner command. - The number of repetitions - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - Marks a test that must run in the MTA, causing it - to run in a separate thread if necessary. - - On methods, you may also use MTAThreadAttribute - to serve the same purpose. - - - - - Construct a RequiresMTAAttribute - - - - - Marks a test that must run in the STA, causing it - to run in a separate thread if necessary. - - - - - Construct a RequiresSTAAttribute - - - - - Marks a test that must run on a separate thread. - - - - - Construct a RequiresThreadAttribute - - - - - Construct a RequiresThreadAttribute, specifying the apartment - - - - - RepeatAttribute may be applied to test case in order - to run it multiple times. - - - - - Construct a RepeatAttribute - - The number of times to run the test - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - The test command for the RetryAttribute - - - - - Initializes a new instance of the class. - - The inner command. - The number of repetitions - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - Marks a test to use a Sequential join of any argument - data provided. Arguments will be combined into test cases, - taking the next value of each argument until all are used. - - - - - Default constructor - - - - - Summary description for SetCultureAttribute. - - - - - Construct given the name of a culture - - - - - - Summary description for SetUICultureAttribute. - - - - - Construct given the name of a culture - - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - SetUpFixtureAttribute is used to identify a SetUpFixture - - - - - Build a SetUpFixture from type provided. Normally called for a Type - on which the attribute has been placed. - - The type info of the fixture to be used. - A SetUpFixture object as a TestSuite. - - - - Attribute used to identify a method that is called - immediately after each test is run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Provide actions to execute before and after tests. - - - - - Executed before each test is run - - The test that is going to be run. - - - - Executed after each test is run - - The test that has just been run. - - - - Provides the target for the action attribute - - - - - Adding this attribute to a method within a - class makes the method callable from the NUnit test runner. There is a property - called Description which is optional which you can provide a more detailed test - description. This class cannot be inherited. - - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - public void TestDescriptionMethod() - {} - } - - - - - - Descriptive text for this test - - - - - The author of this test - - - - - The type that this test is testing - - - - - Modifies a test by adding a description, if not already set. - - The test to modify - - - - Gets or sets the expected result. - - The result. - - - - Returns true if an expected result has been set - - - - - Construct a TestMethod from a given method. - - The method for which a test is to be constructed. - The suite to which the test will be added. - A TestMethod - - - - TestCaseAttribute is used to mark parameterized test cases - and provide them with their arguments. - - - - - Construct a TestCaseAttribute with a list of arguments. - This constructor is not CLS-Compliant - - - - - - Construct a TestCaseAttribute with a single argument - - - - - - Construct a TestCaseAttribute with a two arguments - - - - - - - Construct a TestCaseAttribute with a three arguments - - - - - - - - Gets or sets the name of the test. - - The name of the test. - - - - Gets or sets the RunState of this test case. - - - - - Gets the list of arguments to a test case - - - - - Gets the properties of the test case - - - - - Gets or sets the expected result. - - The result. - - - - Returns true if the expected result has been set - - - - - Gets or sets the description. - - The description. - - - - The author of this test - - - - - The type that this test is testing - - - - - Gets or sets the reason for ignoring the test - - - - - Gets or sets a value indicating whether this is explicit. - - - true if explicit; otherwise, false. - - - - - Gets or sets the reason for not running the test. - - The reason. - - - - Gets or sets the ignore reason. When set to a non-null - non-empty value, the test is marked as ignored. - - The ignore reason. - - - - Comma-delimited list of platforms to run the test for - - - - - Comma-delimited list of platforms to not run the test for - - - - - Gets and sets the category for this test case. - May be a comma-separated list of categories. - - - - - Performs several special conversions allowed by NUnit in order to - permit arguments with types that cannot be used in the constructor - of an Attribute such as TestCaseAttribute or to simplify their use. - - The arguments to be converted - The ParameterInfo array for the method - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The MethodInfo for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - TestCaseSourceAttribute indicates the source to be used to - provide test cases for a test method. - - - - - Construct with the name of the method, property or field that will provide data - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - Construct with a Type - - The type that will provide data - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets or sets the category associated with every fixture created from - this attribute. May be a single category or a comma-separated list. - - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The IMethod for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - Returns a set of ITestCaseDataItems for use as arguments - to a parameterized test method. - - The method for which data is needed. - - - - - TestFixtureAttribute is used to mark a class that represents a TestFixture. - - - - - Default constructor - - - - - Construct with a object[] representing a set of arguments. - In .NET 2.0, the arguments may later be separated into - type arguments and constructor arguments. - - - - - - Gets or sets the name of the test. - - The name of the test. - - - - Gets or sets the RunState of this test fixture. - - - - - The arguments originally provided to the attribute - - - - - Properties pertaining to this fixture - - - - - Get or set the type arguments. If not set - explicitly, any leading arguments that are - Types are taken as type arguments. - - - - - Descriptive text for this fixture - - - - - The author of this fixture - - - - - The type that this fixture is testing - - - - - Gets or sets the ignore reason. May set RunState as a side effect. - - The ignore reason. - - - - Gets or sets the reason for not running the fixture. - - The reason. - - - - Gets or sets the ignore reason. When set to a non-null - non-empty value, the test is marked as ignored. - - The ignore reason. - - - - Gets or sets a value indicating whether this is explicit. - - - true if explicit; otherwise, false. - - - - - Gets and sets the category for this fixture. - May be a comma-separated list of categories. - - - - - Build a fixture from type provided. Normally called for a Type - on which the attribute has been placed. - - The type info of the fixture to be used. - A an IEnumerable holding one TestFixture object. - - - - Attribute used to identify a method that is - called before any tests in a fixture are run. - - - - - TestCaseSourceAttribute indicates the source to be used to - provide test fixture instances for a test class. - - - - - Error message string is public so the tests can use it - - - - - Construct with the name of the method, property or field that will provide data - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - Construct with a Type - - The type that will provide data - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets or sets the category associated with every fixture created from - this attribute. May be a single category or a comma-separated list. - - - - - Construct one or more TestFixtures from a given Type, - using available parameter data. - - The TypeInfo for which fixures are to be constructed. - One or more TestFixtures as TestSuite - - - - Returns a set of ITestFixtureData items for use as arguments - to a parameterized test fixture. - - The type for which data is needed. - - - - - Attribute used to identify a method that is called after - all the tests in a fixture have run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Indicates which class the test or test fixture is testing - - - - - Initializes a new instance of the class. - - The type that is being tested. - - - - Initializes a new instance of the class. - - The type that is being tested. - - - - Adding this attribute to a method within a - class makes the method callable from the NUnit test runner. There is a property - called Description which is optional which you can provide a more detailed test - description. This class cannot be inherited. - - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - public void TestDescriptionMethod() - {} - } - - - - - - Construct the attribute, specifying a combining strategy and source of parameter data. - - - - - Used on a method, marks the test with a timeout value in milliseconds. - The test will be run in a separate thread and is cancelled if the timeout - is exceeded. Used on a class or assembly, sets the default timeout - for all contained test methods. - - - - - Construct a TimeoutAttribute given a time in milliseconds - - The timeout value in milliseconds - - - - ValuesAttribute is used to provide literal arguments for - an individual parameter of a test. - - - - - The collection of data to be returned. Must - be set by any derived attribute classes. - We use an object[] so that the individual - elements may have their type changed in GetData - if necessary - - - - - Constructs for use with an Enum parameter. Will pass every enum - value in to the test. - - - - - Construct with one argument - - - - - - Construct with two arguments - - - - - - - Construct with three arguments - - - - - - - - Construct with an array of arguments - - - - - - Get the collection of _values to be used as arguments - - - - - ValueSourceAttribute indicates the source to be used to - provide data for one parameter of a test method. - - - - - Construct with the name of the factory - for use with languages - that don't support params arrays. - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - for use with languages - that don't support params arrays. - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets an enumeration of data items for use as arguments - for a test method parameter. - - The parameter for which data is needed - - An enumeration containing individual data items - - - - - A set of Assert methods operating on one or more collections - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Asserts that all items contained in collection are of the type specified by expectedType. - - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - - - - Asserts that all items contained in collection are of the type specified by expectedType. - - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that all items contained in collection are not equal to null. - - IEnumerable containing objects to be considered - - - - Asserts that all items contained in collection are not equal to null. - - IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Ensures that every object contained in collection exists within the collection - once and only once. - - IEnumerable of objects to be considered - - - - Ensures that every object contained in collection exists within the collection - once and only once. - - IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not exactly equal. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - - - - Asserts that expected and actual are not exactly equal. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not equivalent. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are not equivalent. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that collection contains actual as an item. - - IEnumerable of objects to be considered - Object to be found within collection - - - - Asserts that collection contains actual as an item. - - IEnumerable of objects to be considered - Object to be found within collection - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that collection does not contain actual as an item. - - IEnumerable of objects to be considered - Object that cannot exist within collection - - - - Asserts that collection does not contain actual as an item. - - IEnumerable of objects to be considered - Object that cannot exist within collection - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the superset does not contain the subset - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - - - - Asserts that the superset does not contain the subset - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the superset contains the subset. - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - - - - Asserts that the superset contains the subset. - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the subset does not contain the superset - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - - - - Asserts that the subset does not contain the superset - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the subset contains the superset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - - - - Asserts that the subset contains the superset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array,list or other collection is empty - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array,list or other collection is empty - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - - - - Provides a platform-independent methods for getting attributes - for use by AttributeConstraint and AttributeExistsConstraint. - - - - - Gets the custom attributes from the given object. - - Portable libraries do not have an ICustomAttributeProvider, so we need to cast to each of - it's direct subtypes and try to get attributes off those instead. - The actual. - Type of the attribute. - if set to true [inherit]. - A list of the given attribute on the given object. - - - - A MarshalByRefObject that lives forever - - - - - Obtains a lifetime service object to control the lifetime policy for this instance. - - - - - This class is a System.Diagnostics.Stopwatch on operating systems that support it. On those that don't, - it replicates the functionality at the resolution supported. - - - - - AllItemsConstraint applies another constraint to each - item in a collection, succeeding if they all succeed. - - - - - Construct an AllItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - failing if any item fails. - - - - - - - AndConstraint succeeds only if both members succeed. - - - - - Create an AndConstraint from two other constraints - - The first constraint - The second constraint - - - - Gets text describing a constraint - - - - - Apply both member constraints to an actual value, succeeding - succeeding only if both of them succeed. - - The actual value - True if the constraints both succeeded - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - AssignableFromConstraint is used to test that an object - can be assigned from a given Type. - - - - - Construct an AssignableFromConstraint for the type provided - - - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - AssignableToConstraint is used to test that an object - can be assigned to a given Type. - - - - - Construct an AssignableToConstraint for the type provided - - - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - AttributeConstraint tests that a specified attribute is present - on a Type or other provider and that the value of the attribute - satisfies some other constraint. - - - - - Constructs an AttributeConstraint for a specified attribute - Type and base constraint. - - - - - - - Determines whether the Type or other provider has the - expected attribute and if its value matches the - additional constraint specified. - - - - - Returns a string representation of the constraint. - - - - - AttributeExistsConstraint tests for the presence of a - specified attribute on a Type. - - - - - Constructs an AttributeExistsConstraint for a specific attribute Type - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Tests whether the object provides the expected attribute. - - A Type, MethodInfo, or other ICustomAttributeProvider - True if the expected attribute is present, otherwise false - - - - BinaryConstraint is the abstract base of all constraints - that combine two other constraints in some fashion. - - - - - The first constraint being combined - - - - - The second constraint being combined - - - - - Construct a BinaryConstraint from two other constraints - - The first constraint - The second constraint - - - - BinarySerializableConstraint tests whether - an object is serializable in binary format. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Returns the string representation - - - - - CollectionConstraint is the abstract base class for - constraints that operate on collections. - - - - - Construct an empty CollectionConstraint - - - - - Construct a CollectionConstraint - - - - - - Determines whether the specified enumerable is empty. - - The enumerable. - - true if the specified enumerable is empty; otherwise, false. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Protected method to be implemented by derived classes - - - - - - - CollectionContainsConstraint is used to test whether a collection - contains an expected object as a member. - - - - - Construct a CollectionContainsConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Gets the expected object - - - - - Test whether the expected item is contained in the collection - - - - - - - CollectionEquivalentConstraint is used to determine whether two - collections are equivalent. - - - - - Construct a CollectionEquivalentConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether two collections are equivalent - - - - - - - CollectionItemsEqualConstraint is the abstract base class for all - collection constraints that apply some notion of item equality - as a part of their operation. - - - - - Construct an empty CollectionConstraint - - - - - Construct a CollectionConstraint - - - - - - Flag the constraint to ignore case and return self. - - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied Comparison object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Compares two collection members for equality - - - - - Return a new CollectionTally for use in making tests - - The collection to be included in the tally - - - - CollectionOrderedConstraint is used to test whether a collection is ordered. - - - - - Construct a CollectionOrderedConstraint - - - - - If used performs a reverse comparison - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use a and returns self. - - - - - Modifies the constraint to test ordering by the value of - a specified property and returns self. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the collection is ordered - - - - - - - Returns the string representation of the constraint. - - - - - - CollectionSubsetConstraint is used to determine whether - one collection is a subset of another - - - - - Construct a CollectionSubsetConstraint - - The collection that the actual value is expected to be a subset of - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the actual collection is a subset of - the expected collection provided. - - - - - - - CollectionSupersetConstraint is used to determine whether - one collection is a superset of another - - - - - Construct a CollectionSupersetConstraint - - The collection that the actual value is expected to be a superset of - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the actual collection is a superset of - the expected collection provided. - - - - - - - CollectionTally counts (tallies) the number of - occurrences of each object in one or more enumerations. - - - - - Construct a CollectionTally object from a comparer and a collection - - - - - The number of objects remaining in the tally - - - - - Try to remove an object from the tally - - The object to remove - True if successful, false if the object was not found - - - - Try to remove a set of objects from the tally - - The objects to remove - True if successful, false if any object was not found - - - - ComparisonAdapter class centralizes all comparisons of - _values in NUnit, adapting to the use of any provided - , - or . - - - - - Gets the default ComparisonAdapter, which wraps an - NUnitComparer object. - - - - - Returns a ComparisonAdapter that wraps an - - - - - Returns a ComparisonAdapter that wraps an - - - - - Returns a ComparisonAdapter that wraps a - - - - - Compares two objects - - - - - Construct a default ComparisonAdapter - - - - - Construct a ComparisonAdapter for an - - - - - Compares two objects - - - - - - - - ComparerAdapter extends and - allows use of an or - to actually perform the comparison. - - - - - Construct a ComparisonAdapter for an - - - - - Compare a Type T to an object - - - - - Construct a ComparisonAdapter for a - - - - - Compare a Type T to an object - - - - - Abstract base class for constraints that compare _values to - determine if one is greater than, equal to or less than - the other. - - - - - The value against which a comparison is to be made - - - - - If true, less than returns success - - - - - if true, equal returns success - - - - - if true, greater than returns success - - - - - ComparisonAdapter to be used in making the comparison - - - - - Initializes a new instance of the class. - - The value against which to make a comparison. - if set to true less succeeds. - if set to true equal succeeds. - if set to true greater succeeds. - String used in describing the constraint. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Modifies the constraint to use an and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Modifies the constraint to use an and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Modifies the constraint to use a and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Delegate used to delay evaluation of the actual value - to be used in evaluating a constraint - - - - - The Constraint class is the base of all built-in constraints - within NUnit. It provides the operator overloads used to combine - constraints. - - - - - Construct a constraint with optional arguments - - Arguments to be saved - - - - The display name of this Constraint for use by ToString(). - The default value is the name of the constraint with - trailing "Constraint" removed. Derived classes may set - this to another name in their constructors. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Arguments provided to this Constraint, for use in - formatting the description. - - - - - The ConstraintBuilder holding this constraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - Test whether the constraint is satisfied by a given reference. - The default implementation simply dereferences the value but - derived classes may override it to provide for delayed processing. - - A reference to the value to be tested - A ConstraintResult - - - - Default override of ToString returns the constraint DisplayName - followed by any arguments within angle brackets. - - - - - - Returns the string representation of this constraint - - - - - This operator creates a constraint that is satisfied only if both - argument constraints are satisfied. - - - - - This operator creates a constraint that is satisfied if either - of the argument constraints is satisfied. - - - - - This operator creates a constraint that is satisfied if the - argument constraint is not satisfied. - - - - - Returns a ConstraintExpression by appending And - to the current constraint. - - - - - Returns a ConstraintExpression by appending And - to the current constraint. - - - - - Returns a ConstraintExpression by appending Or - to the current constraint. - - - - - Returns a DelayedConstraint with the specified delay time. - - The delay in milliseconds. - - - - - Returns a DelayedConstraint with the specified delay time - and polling interval. - - The delay in milliseconds. - The interval at which to test the constraint. - - - - - Resolves any pending operators and returns the resolved constraint. - - - - - ConstraintBuilder maintains the stacks that are used in - processing a ConstraintExpression. An OperatorStack - is used to hold operators that are waiting for their - operands to be reorganized. a ConstraintStack holds - input constraints as well as the results of each - operator applied. - - - - - OperatorStack is a type-safe stack for holding ConstraintOperators - - - - - Initializes a new instance of the class. - - The ConstraintBuilder using this stack. - - - - Gets a value indicating whether this is empty. - - true if empty; otherwise, false. - - - - Gets the topmost operator without modifying the stack. - - - - - Pushes the specified operator onto the stack. - - The operator to put onto the stack. - - - - Pops the topmost operator from the stack. - - The topmost operator on the stack - - - - ConstraintStack is a type-safe stack for holding Constraints - - - - - Initializes a new instance of the class. - - The ConstraintBuilder using this stack. - - - - Gets a value indicating whether this is empty. - - true if empty; otherwise, false. - - - - Pushes the specified constraint. As a side effect, - the constraint's Builder field is set to the - ConstraintBuilder owning this stack. - - The constraint to put onto the stack - - - - Pops this topmost constraint from the stack. - As a side effect, the constraint's Builder - field is set to null. - - The topmost contraint on the stack - - - - Initializes a new instance of the class. - - - - - Appends the specified operator to the expression by first - reducing the operator stack and then pushing the new - operator on the stack. - - The operator to push. - - - - Appends the specified constraint to the expression by pushing - it on the constraint stack. - - The constraint to push. - - - - Sets the top operator right context. - - The right context. - - - - Reduces the operator stack until the topmost item - precedence is greater than or equal to the target precedence. - - The target precedence. - - - - Resolves this instance, returning a Constraint. If the Builder - is not currently in a resolvable state, an exception is thrown. - - The resolved constraint - - - - Gets a value indicating whether this instance is resolvable. - - - true if this instance is resolvable; otherwise, false. - - - - - ConstraintExpression represents a compound constraint in the - process of being constructed from a series of syntactic elements. - - Individual elements are appended to the expression as they are - reorganized. When a constraint is appended, it is returned as the - value of the operation so that modifiers may be applied. However, - any partially built expression is attached to the constraint for - later resolution. When an operator is appended, the partial - expression is returned. If it's a self-resolving operator, then - a ResolvableConstraintExpression is returned. - - - - - The ConstraintBuilder holding the elements recognized so far - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the - class passing in a ConstraintBuilder, which may be pre-populated. - - The builder. - - - - Returns a string representation of the expression as it - currently stands. This should only be used for testing, - since it has the side-effect of resolving the expression. - - - - - - Appends an operator to the expression and returns the - resulting expression itself. - - - - - Appends a self-resolving operator to the expression and - returns a new ResolvableConstraintExpression. - - - - - Appends a constraint to the expression and returns that - constraint, which is associated with the current state - of the expression being built. Note that the constraint - is not reduced at this time. For example, if there - is a NotOperator on the stack we don't reduce and - return a NotConstraint. The original constraint must - be returned because it may support modifiers that - are yet to be applied. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - With is currently a NOP - reserved for future use. - - - - - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. - - - - - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests whether an object graph is serializable in binary format. - - - - - Returns a constraint that tests whether an object graph is serializable in xml format. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the a subpath of the expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the actual value falls - within a specified range. - - - - - Returns a constraint that succeeds if the value - is a file or directory and it exists. - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests whether an object graph is serializable in binary format. - - - - - Returns a constraint that tests whether an object graph is serializable in xml format. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that fails if the actual - value matches the pattern supplied as an argument. - - - - - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is a subpath of the expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the actual value falls - within a specified range. - - - - - ConstraintStatus represents the status of a ConstraintResult - returned by a Constraint being applied to an actual value. - - - - - The status has not yet been set - - - - - The constraint succeeded - - - - - The constraint failed - - - - - An error occured in applying the constraint (reserved for future use) - - - - - Contain the result of matching a against an actual value. - - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - The status of the new ConstraintResult. - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - If true, applies a status of Success to the result, otherwise Failure. - - - - The actual value that was passed to the method. - - - - - Gets and sets the ResultStatus for this result. - - - - - True if actual value meets the Constraint criteria otherwise false. - - - - - Display friendly name of the constraint. - - - - - Description of the constraint may be affected by the state the constraint had - when was performed against the actual value. - - - - - Write the failure message to the MessageWriter provided - as an argument. The default implementation simply passes - the result and the actual value to the writer, which - then displays the constraint description and the value. - - Constraints that need to provide additional details, - such as where the error occured can override this. - - The MessageWriter on which to display the message - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - ContainsConstraint tests a whether a string contains a substring - or a collection contains an object. It postpones the decision of - which test to use until the type of the actual argument is known. - This allows testing whether a string is contained in a collection - or as a substring of another string using the same syntax. - - - - - Initializes a new instance of the class. - - The _expected. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Flag the constraint to ignore case and return self. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Applies a delay to the match so that a match can be evaluated in the future. - - - - - Creates a new DelayedConstraint - - The inner constraint to decorate - The time interval after which the match is performed - If the value of is less than 0 - - - - Creates a new DelayedConstraint - - The inner constraint to decorate - The time interval after which the match is performed, in milliseconds - The time interval used for polling, in milliseconds - If the value of is less than 0 - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for if the base constraint fails, false if it succeeds - - - - Test whether the constraint is satisfied by a delegate - - The delegate whose value is to be tested - A ConstraintResult - - - - Test whether the constraint is satisfied by a given reference. - Overridden to wait for the specified delay period before - calling the base constraint with the dereferenced value. - - A reference to the value to be tested - True for success, false for failure - - - - Returns the string representation of the constraint. - - - - - Adjusts a Timestamp by a given TimeSpan - - - - - - - - Returns the difference between two Timestamps as a TimeSpan - - - - - - - - DictionaryContainsKeyConstraint is used to test whether a dictionary - contains an expected object as a key. - - - - - Construct a DictionaryContainsKeyConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the expected key is contained in the dictionary - - - - - DictionaryContainsValueConstraint is used to test whether a dictionary - contains an expected object as a value. - - - - - Construct a DictionaryContainsValueConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the expected value is contained in the dictionary - - - - - EmptyCollectionConstraint tests whether a collection is empty. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Check that the collection is empty - - - - - - - EmptyConstraint tests a whether a string or collection is empty, - postponing the decision about which test is applied until the - type of the actual argument is known. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - EmptyDirectoryConstraint is used to test that a directory is empty - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - EmptyStringConstraint tests whether a string is empty. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - EndsWithConstraint can test whether a string ends - with an expected substring. - - - - - Initializes a new instance of the class. - - The expected string - - - - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. - - - - - - - EqualConstraint is able to compare an actual value with the - expected value provided in its constructor. Two objects are - considered equal if both are null, or if both have the same - value. NUnit has special semantics for some object types. - - - - - NUnitEqualityComparer used to test equality. - - - - - Initializes a new instance of the class. - - The expected value. - - - - Gets the tolerance for this comparison. - - - The tolerance. - - - - - Gets a value indicating whether to compare case insensitive. - - - true if comparing case insensitive; otherwise, false. - - - - - Gets a value indicating whether or not to clip strings. - - - true if set to clip strings otherwise, false. - - - - - Gets the failure points. - - - The failure points. - - - - - Flag the constraint to ignore case and return self. - - - - - Flag the constraint to suppress string clipping - and return self. - - - - - Flag the constraint to compare arrays as collections - and return self. - - - - - Flag the constraint to use a tolerance when determining equality. - - Tolerance value to be used - Self. - - - - Flags the constraint to include - property in comparison of two values. - - - Using this modifier does not allow to use the - constraint modifier. - - - - - Switches the .Within() modifier to interpret its tolerance as - a distance in representable _values (see remarks). - - Self. - - Ulp stands for "unit in the last place" and describes the minimum - amount a given value can change. For any integers, an ulp is 1 whole - digit. For floating point _values, the accuracy of which is better - for smaller numbers and worse for larger numbers, an ulp depends - on the size of the number. Using ulps for comparison of floating - point results instead of fixed tolerances is safer because it will - automatically compensate for the added inaccuracy of larger numbers. - - - - - Switches the .Within() modifier to interpret its tolerance as - a percentage that the actual _values is allowed to deviate from - the expected value. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in days. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in hours. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in minutes. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in seconds. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in milliseconds. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in clock ticks. - - Self - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied Comparison object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - EqualityAdapter class handles all equality comparisons - that use an , - or a . - - - - - Compares two objects, returning true if they are equal - - - - - Returns true if the two objects can be compared by this adapter. - The base adapter cannot handle IEnumerables except for strings. - - - - - Returns an that wraps an . - - - - - that wraps an . - - - - - Returns an that wraps an . - - - - - Returns true if the two objects can be compared by this adapter. - Generic adapter requires objects of the specified type. - - - - - Returns an that wraps an . - - - - - Returns an that wraps an . - - - - - that wraps an . - - - - - Returns an that wraps a . - - - - - ExactTypeConstraint is used to test that an object - is of the exact type provided in the constructor - - - - - Construct an ExactTypeConstraint for a given Type - - The expected Type. - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - FalseConstraint tests that the actual value is false - - - - - Initializes a new instance of the class. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - FileExistsConstraint is used to determine if a file exists - - - - - Initializes a new instance of the class. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - FileOrDirectoryExistsConstraint is used to determine if a file or directory exists - - - - - If true, the constraint will only check if files exist, not directories - - - - - If true, the constraint will only check if directories exist, not files - - - - - Initializes a new instance of the class that - will check files and directories. - - - - - Initializes a new instance of the class that - will only check files if ignoreDirectories is true. - - if set to true [ignore directories]. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - Helper routines for working with floating point numbers - - - The floating point comparison code is based on this excellent article: - http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm - - - "ULP" means Unit in the Last Place and in the context of this library refers to - the distance between two adjacent floating point numbers. IEEE floating point - numbers can only represent a finite subset of natural numbers, with greater - accuracy for smaller numbers and lower accuracy for very large numbers. - - - If a comparison is allowed "2 ulps" of deviation, that means the _values are - allowed to deviate by up to 2 adjacent floating point _values, which might be - as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. - - - - - Union of a floating point variable and an integer - - - The union's value as a floating point variable - - - The union's value as an integer - - - The union's value as an unsigned integer - - - Union of a double precision floating point variable and a long - - - The union's value as a double precision floating point variable - - - The union's value as a long - - - The union's value as an unsigned long - - - Compares two floating point _values for equality - First floating point value to be compared - Second floating point value t be compared - - Maximum number of representable floating point _values that are allowed to - be between the left and the right floating point _values - - True if both numbers are equal or close to being equal - - - Floating point _values can only represent a finite subset of natural numbers. - For example, the _values 2.00000000 and 2.00000024 can be stored in a float, - but nothing inbetween them. - - - This comparison will count how many possible floating point _values are between - the left and the right number. If the number of possible _values between both - numbers is less than or equal to maxUlps, then the numbers are considered as - being equal. - - - Implementation partially follows the code outlined here: - http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ - - - - - Compares two double precision floating point _values for equality - First double precision floating point value to be compared - Second double precision floating point value t be compared - - Maximum number of representable double precision floating point _values that are - allowed to be between the left and the right double precision floating point _values - - True if both numbers are equal or close to being equal - - - Double precision floating point _values can only represent a limited series of - natural numbers. For example, the _values 2.0000000000000000 and 2.0000000000000004 - can be stored in a double, but nothing inbetween them. - - - This comparison will count how many possible double precision floating point - _values are between the left and the right number. If the number of possible - _values between both numbers is less than or equal to maxUlps, then the numbers - are considered as being equal. - - - Implementation partially follows the code outlined here: - http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ - - - - - - Reinterprets the memory contents of a floating point value as an integer value - - - Floating point value whose memory contents to reinterpret - - - The memory contents of the floating point value interpreted as an integer - - - - - Reinterprets the memory contents of a double precision floating point - value as an integer value - - - Double precision floating point value whose memory contents to reinterpret - - - The memory contents of the double precision floating point value - interpreted as an integer - - - - - Reinterprets the memory contents of an integer as a floating point value - - Integer value whose memory contents to reinterpret - - The memory contents of the integer value interpreted as a floating point value - - - - - Reinterprets the memory contents of an integer value as a double precision - floating point value - - Integer whose memory contents to reinterpret - - The memory contents of the integer interpreted as a double precision - floating point value - - - - - Tests whether a value is greater than the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Tests whether a value is greater than or equal to the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Interface for all constraints - - - - - The display name of this Constraint for use by ToString(). - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Arguments provided to this Constraint, for use in - formatting the description. - - - - - The ConstraintBuilder holding this constraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - Test whether the constraint is satisfied by a given reference. - The default implementation simply dereferences the value but - derived classes may override it to provide for delayed processing. - - A reference to the value to be tested - A ConstraintResult - - - - InstanceOfTypeConstraint is used to test that an object - is of the same type provided or derived from it. - - - - - Construct an InstanceOfTypeConstraint for the type provided - - The expected Type - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - The IResolveConstraint interface is implemented by all - complete and resolvable constraints and expressions. - - - - - Return the top-level constraint for this expression - - - - - - Tests whether a value is less than the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Tests whether a value is less than or equal to the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - MessageWriter is the abstract base for classes that write - constraint descriptions and messages in some form. The - class has separate methods for writing various components - of a message, allowing implementations to tailor the - presentation as needed. - - - - - Construct a MessageWriter given a culture - - - - - Abstract method to get the max line length - - - - - Method to write single line message with optional args, usually - written to precede the general failure message. - - The message to be written - Any arguments used in formatting the message - - - - Method to write single line message with optional args, usually - written to precede the general failure message, at a givel - indentation level. - - The indentation level of the message - The message to be written - Any arguments used in formatting the message - - - - Display Expected and Actual lines for a constraint. This - is called by MessageWriter's default implementation of - WriteMessageTo and provides the generic two-line display. - - The failing constraint result - - - - Display Expected and Actual lines for given _values. This - method may be called by constraints that need more control over - the display of actual and expected _values than is provided - by the default implementation. - - The expected value - The actual value causing the failure - - - - Display Expected and Actual lines for given _values, including - a tolerance value on the Expected line. - - The expected value - The actual value causing the failure - The tolerance within which the test was made - - - - Display the expected and actual string _values on separate lines. - If the mismatch parameter is >=0, an additional line is displayed - line containing a caret that points to the mismatch point. - - The expected string value - The actual string value - The point at which the strings don't match or -1 - If true, case is ignored in locating the point where the strings differ - If true, the strings should be clipped to fit the line - - - - Writes the text for an actual value. - - The actual value. - - - - Writes the text for a generalized value. - - The value. - - - - Writes the text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Static methods used in creating messages - - - - - Static string used when strings are clipped - - - - - Formatting strings used for expected and actual _values - - - - - Formats text to represent a generalized value. - - The value - The formatted text - - - - Formats text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Returns the representation of a type as used in NUnitLite. - This is the same as Type.ToString() except for arrays, - which are displayed with their declared sizes. - - - - - - - Converts any control characters in a string - to their escaped representation. - - The string to be converted - The converted string - - - - Return the a string representation for a set of indices into an array - - Array of indices for which a string is needed - - - - Get an array of indices representing the point in a collection or - array corresponding to a single int index into the collection. - - The collection to which the indices apply - Index in the collection - Array of indices - - - - Clip a string to a given length, starting at a particular offset, returning the clipped - string with ellipses representing the removed parts - - The string to be clipped - The maximum permitted length of the result string - The point at which to start clipping - The clipped string - - - - Clip the expected and actual strings in a coordinated fashion, - so that they may be displayed together. - - - - - - - - - Shows the position two strings start to differ. Comparison - starts at the start index. - - The expected string - The actual string - The index in the strings at which comparison should start - Boolean indicating whether case should be ignored - -1 if no mismatch found, or the index where mismatch found - - - - NaNConstraint tests that the actual value is a double or float NaN - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test that the actual value is an NaN - - - - - - - NoItemConstraint applies another constraint to each - item in a collection, failing if any of them succeeds. - - - - - Construct a SomeItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - failing if any item fails. - - - - - - - NotConstraint negates the effect of some other constraint - - - - - Initializes a new instance of the class. - - The base constraint to be negated. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for if the base constraint fails, false if it succeeds - - - - NullConstraint tests that the actual value is null - - - - - Initializes a new instance of the class. - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - The Numerics class contains common operations on numeric _values. - - - - - Checks the type of the object, returning true if - the object is a numeric type. - - The object to check - true if the object is a numeric type - - - - Checks the type of the object, returning true if - the object is a floating point numeric type. - - The object to check - true if the object is a floating point numeric type - - - - Checks the type of the object, returning true if - the object is a fixed point numeric type. - - The object to check - true if the object is a fixed point numeric type - - - - Test two numeric _values for equality, performing the usual numeric - conversions and using a provided or default tolerance. If the tolerance - provided is Empty, this method may set it to a default tolerance. - - The expected value - The actual value - A reference to the tolerance in effect - True if the _values are equal - - - - Compare two numeric _values, performing the usual numeric conversions. - - The expected value - The actual value - The relationship of the _values to each other - - - - NUnitComparer encapsulates NUnit's default behavior - in comparing two objects. - - - - - Returns the default NUnitComparer. - - - - - Compares two objects - - - - - - - - NUnitEqualityComparer encapsulates NUnit's handling of - equality tests between objects. - - - - - If true, all string comparisons will ignore case - - - - - If true, arrays will be treated as collections, allowing - those of different dimensions to be compared - - - - - Comparison objects used in comparisons for some constraints. - - - - - List of points at which a failure occurred. - - - - - Returns the default NUnitEqualityComparer - - - - - Gets and sets a flag indicating whether case should - be ignored in determining equality. - - - - - Gets and sets a flag indicating that arrays should be - compared as collections, without regard to their shape. - - - - - Gets the list of external comparers to be used to - test for equality. They are applied to members of - collections, in place of NUnit's own logic. - - - - - Gets the list of failure points for the last Match performed. - The list consists of objects to be interpreted by the caller. - This generally means that the caller may only make use of - objects it has placed on the list at a particular depthy. - - - - - Flags the comparer to include - property in comparison of two values. - - - Using this modifier does not allow to use the - modifier. - - - - - Compares two objects for equality within a tolerance. - - - - - Helper method to compare two arrays - - - - - Method to compare two DirectoryInfo objects - - first directory to compare - second directory to compare - true if equivalent, false if not - - - - FailurePoint class represents one point of failure - in an equality test. - - - - - The location of the failure - - - - - The expected value - - - - - The actual value - - - - - Indicates whether the expected value is valid - - - - - Indicates whether the actual value is valid - - - - - Represents a constraint that succeeds if all the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - they all succeed. - - - - - Operator that requires both it's arguments to succeed - - - - - Construct an AndOperator - - - - - Apply the operator to produce an AndConstraint - - - - - Operator that tests for the presence of a particular attribute - on a type and optionally applies further tests to the attribute. - - - - - Construct an AttributeOperator for a particular Type - - The Type of attribute tested - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - Abstract base class for all binary operators - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Gets the left precedence of the operator - - - - - Gets the right precedence of the operator - - - - - Abstract method that produces a constraint by applying - the operator to its left and right constraint arguments. - - - - - Abstract base for operators that indicate how to - apply a constraint to items in a collection. - - - - - Constructs a CollectionOperator - - - - - The ConstraintOperator class is used internally by a - ConstraintBuilder to represent an operator that - modifies or combines constraints. - - Constraint operators use left and right precedence - _values to determine whether the top operator on the - stack should be reduced before pushing a new operator. - - - - - The precedence value used when the operator - is about to be pushed to the stack. - - - - - The precedence value used when the operator - is on the top of the stack. - - - - - The syntax element preceding this operator - - - - - The syntax element following this operator - - - - - The precedence value used when the operator - is about to be pushed to the stack. - - - - - The precedence value used when the operator - is on the top of the stack. - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Represents a constraint that succeeds if none of the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. - - - - - Negates the test of the constraint it wraps. - - - - - Constructs a new NotOperator - - - - - Returns a NotConstraint applied to its argument. - - - - - Operator that requires at least one of it's arguments to succeed - - - - - Construct an OrOperator - - - - - Apply the operator to produce an OrConstraint - - - - - PrefixOperator takes a single constraint and modifies - it's action in some way. - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Returns the constraint created by applying this - prefix to another constraint. - - - - - - - Operator used to test for the presence of a named Property - on an object and optionally apply further tests to the - value of that property. - - - - - Gets the name of the property to which the operator applies - - - - - Constructs a PropOperator for a particular named property - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Abstract base class for operators that are able to reduce to a - constraint whether or not another syntactic element follows. - - - - - Represents a constraint that succeeds if any of the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - any of them succeed. - - - - - Operator that tests that an exception is thrown and - optionally applies further tests to the exception. - - - - - Construct a ThrowsOperator - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - Represents a constraint that simply wraps the - constraint provided as an argument, without any - further functionality, but which modifies the - order of evaluation because of its precedence. - - - - - Constructor for the WithOperator - - - - - Returns a constraint that wraps its argument - - - - - OrConstraint succeeds if either member succeeds - - - - - Create an OrConstraint from two other constraints - - The first constraint - The second constraint - - - - Gets text describing a constraint - - - - - Apply the member constraints to an actual value, succeeding - succeeding as soon as one of them succeeds. - - The actual value - True if either constraint succeeded - - - - PathConstraint serves as the abstract base of constraints - that operate on paths and provides several helper methods. - - - - - Construct a PathConstraint for a give expected path - - The expected path - - - - Modifies the current instance to be case-sensitive - and returns it. - - - - - Returns the string representation of this constraint - - - - - Canonicalize the provided path - - - The path in standardized form - - - - Test whether one path in canonical form is a subpath of another path - - The first path - supposed to be the parent path - The second path - supposed to be the child path - - - - - Predicate constraint wraps a Predicate in a constraint, - returning success if the predicate is true. - - - - - Construct a PredicateConstraint from a predicate - - - - - Gets text describing a constraint - - - - - Determines whether the predicate succeeds when applied - to the actual value. - - - - - Abstract base class used for prefixes - - - - - The base constraint - - - - - Prefix used in forming the constraint description - - - - - Construct given a base constraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - PropertyConstraint extracts a named property and uses - its value as the actual value for a chained constraint. - - - - - Initializes a new instance of the class. - - The name. - The constraint to apply to the property. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Returns the string representation of the constraint. - - - - - - PropertyExistsConstraint tests that a named property - exists on the object provided through Match. - - Originally, PropertyConstraint provided this feature - in addition to making optional tests on the value - of the property. The two constraints are now separate. - - - - - Initializes a new instance of the class. - - The name of the property. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the property exists for a given object - - The object to be tested - True for success, false for failure - - - - Returns the string representation of the constraint. - - - - - - RangeConstraint tests whether two _values are within a - specified range. - - - - - Initializes a new instance of the class. - - from must be less than or equal to true - Inclusive beginning of the range. Must be less than or equal to to. - Inclusive end of the range. Must be greater than or equal to from. - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use a and returns self. - - - - - RegexConstraint can test whether a string matches - the pattern provided. - - - - - Initializes a new instance of the class. - - The pattern. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - ResolvableConstraintExpression is used to represent a compound - constraint being constructed at a point where the last operator - may either terminate the expression or may have additional - qualifying constraints added to it. - - It is used, for example, for a Property element or for - an Exception element, either of which may be optionally - followed by constraints that apply to the property or - exception. - - - - - Create a new instance of ResolvableConstraintExpression - - - - - Create a new instance of ResolvableConstraintExpression, - passing in a pre-populated ConstraintBuilder. - - - - - Appends an And Operator to the expression - - - - - Appends an Or operator to the expression. - - - - - Resolve the current expression to a Constraint - - - - - ReusableConstraint wraps a constraint expression after - resolving it so that it can be reused consistently. - - - - - Construct a ReusableConstraint from a constraint expression - - The expression to be resolved and reused - - - - Converts a constraint to a ReusableConstraint - - The constraint to be converted - A ReusableConstraint - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Return the top-level constraint for this expression - - - - - - SameAsConstraint tests whether an object is identical to - the object passed to its constructor - - - - - Initializes a new instance of the class. - - The expected object. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Summary description for SamePathConstraint. - - - - - Initializes a new instance of the class. - - The expected path - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - SamePathOrUnderConstraint tests that one path is under another - - - - - Initializes a new instance of the class. - - The expected path - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - SomeItemsConstraint applies another constraint to each - item in a collection, succeeding if any of them succeeds. - - - - - Construct a SomeItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - succeeding if any item succeeds. - - - - - - - The EqualConstraintResult class is tailored for formatting - and displaying the result of an EqualConstraint. - - - - - Construct an EqualConstraintResult - - - - - Write a failure message. Overridden to provide custom - failure messages for EqualConstraint. - - The MessageWriter to write to - - - - Display the failure information for two collections that did not match. - - The MessageWriter on which to display - The expected collection. - The actual collection - The depth of this failure in a set of nested collections - - - - Displays a single line showing the types and sizes of the expected - and actual collections or arrays. If both are identical, the value is - only shown once. - - The MessageWriter on which to display - The expected collection or array - The actual collection or array - The indentation level for the message line - - - - Displays a single line showing the point in the expected and actual - arrays at which the comparison failed. If the arrays have different - structures or dimensions, both _values are shown. - - The MessageWriter on which to display - The expected array - The actual array - Index of the failure point in the underlying collections - The indentation level for the message line - - - - Display the failure information for two IEnumerables that did not match. - - The MessageWriter on which to display - The expected enumeration. - The actual enumeration - The depth of this failure in a set of nested collections - - - - StartsWithConstraint can test whether a string starts - with an expected substring. - - - - - Initializes a new instance of the class. - - The expected string - - - - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. - - - - - - - StringConstraint is the abstract base for constraints - that operate on strings. It supports the IgnoreCase - modifier for string operations. - - - - - The expected value - - - - - Indicates whether tests should be case-insensitive - - - - - Description of this constraint - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Constructs a StringConstraint without an expected value - - - - - Constructs a StringConstraint given an expected value - - The expected value - - - - Modify the constraint to ignore case in matching. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Test whether the constraint is satisfied by a given string - - The string to be tested - True for success, false for failure - - - - SubPathConstraint tests that the actual path is under the expected path - - - - - Initializes a new instance of the class. - - The expected path - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - SubstringConstraint can test whether a string contains - the expected substring. - - - - - Initializes a new instance of the class. - - The expected. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - ThrowsConstraint is used to test the exception thrown by - a delegate by applying a constraint to it. - - - - - Initializes a new instance of the class, - using a constraint to be applied to the exception. - - A constraint to apply to the caught exception. - - - - Get the actual exception thrown - used by Assert.Throws. - - - - - Gets text describing a constraint - - - - - Executes the code of the delegate and captures any exception. - If a non-null base constraint was provided, it applies that - constraint to the exception. - - A delegate representing the code to be tested - True if an exception is thrown and the constraint succeeds, otherwise false - - - - Converts an ActualValueDelegate to a TestDelegate - before calling the primary overload. - - - - - - - Write the actual value for a failing constraint test to a - MessageWriter. This override only handles the special message - used when an exception is expected but none is thrown. - - The writer on which the actual value is displayed - - - - ThrowsExceptionConstraint tests that an exception has - been thrown, without any further tests. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Executes the code and returns success if an exception is thrown. - - A delegate representing the code to be tested - True if an exception is thrown, otherwise false - - - - ThrowsNothingConstraint tests that a delegate does not - throw an exception. - - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True if no exception is thrown, otherwise false - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - The Tolerance class generalizes the notion of a tolerance - within which an equality test succeeds. Normally, it is - used with numeric types, but it can be used with any - type that supports taking a difference between two - objects and comparing that difference to a value. - - - - - Returns a default Tolerance object, equivalent to - specifying an exact match unless - is set, in which case, the - will be used. - - - - - Returns an empty Tolerance object, equivalent to - specifying an exact match even if - is set. - - - - - Constructs a linear tolerance of a specified amount - - - - - Constructs a tolerance given an amount and - - - - - Gets the for the current Tolerance - - - - - Tests that the current Tolerance is linear with a - numeric value, throwing an exception if it is not. - - - - - Gets the value of the current Tolerance instance. - - - - - Returns a new tolerance, using the current amount as a percentage. - - - - - Returns a new tolerance, using the current amount in Ulps - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of days. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of hours. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of minutes. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of seconds. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of milliseconds. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of clock ticks. - - - - - Returns true if the current tolerance has not been set or is using the . - - - - - Modes in which the tolerance value for a comparison can be interpreted. - - - - - The tolerance was created with a value, without specifying - how the value would be used. This is used to prevent setting - the mode more than once and is generally changed to Linear - upon execution of the test. - - - - - The tolerance is used as a numeric range within which - two compared _values are considered to be equal. - - - - - Interprets the tolerance as the percentage by which - the two compared _values my deviate from each other. - - - - - Compares two _values based in their distance in - representable numbers. - - - - - TrueConstraint tests that the actual value is true - - - - - Initializes a new instance of the class. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - TypeConstraint is the abstract base for constraints - that take a Type as their expected value. - - - - - The expected Type used by the constraint - - - - - The type of the actual argument to which the constraint was applied - - - - - Construct a TypeConstraint for a given Type - - The expected type for the constraint - Prefix used in forming the constraint description - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - UniqueItemsConstraint tests whether all the items in a - collection are unique. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Check that all items are unique. - - - - - - - XmlSerializableConstraint tests whether - an object is serializable in xml format. - - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Returns the string representation of this constraint - - - - - ExactCountConstraint applies another constraint to each - item in a collection, succeeding only if a specified - number of items succeed. - - - - - Construct an ExactCountConstraint on top of an existing constraint - - - - - - - Apply the item constraint to each item in the collection, - succeeding only if the expected number of items pass. - - - - - - - Represents a constraint that succeeds if the specified - count of members of a collection match a base constraint. - - - - - Construct an ExactCountOperator for a specified count - - The expected count - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. - - - - - ExceptionTypeConstraint is a special version of ExactTypeConstraint - used to provided detailed info about the exception thrown in - an error message. - - - - - Constructs an ExceptionTypeConstraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new DictionaryContainsKeyConstraint checking for the - presence of a particular key in the dictionary. - - - - - Returns a new DictionaryContainsValueConstraint checking for the - presence of a particular value in the dictionary. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Asserts on Directories - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both point to the same directory. - If they are not equal an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - The message to display if the directories are not equal - Arguments to be used in formatting the message - - - - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both point to the same directory. - If they are not equal an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - - - - Asserts that two directories are not equal. If they are equal - an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that two directories are not equal. If they are equal - an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - - - - Asserts that the directory exists. If it does not exist - an is thrown. - - A directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory exists. If it does not exist - an is thrown. - - A directory containing the actual value - - - - Asserts that the directory exists. If it does not exist - an is thrown. - - The path to a directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory exists. If it does not exist - an is thrown. - - The path to a directory containing the actual value - - - - Asserts that the directory does not exist. If it does exist - an is thrown. - - A directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory does not exist. If it does exist - an is thrown. - - A directory containing the actual value - - - - Asserts that the directory does not exist. If it does exist - an is thrown. - - The path to a directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory does not exist. If it does exist - an is thrown. - - The path to a directory containing the actual value - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a constraint that succeeds if the value - is a file or directory and it exists. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Thrown when an assertion failed. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - Thrown when an assertion failed. - - - - - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - Thrown when a test executes inconclusively. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - Abstract base for Exceptions that terminate a test and provide a ResultState. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - Thrown when an assertion failed. - - - - - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Gets the ResultState provided by this exception - - - - - Asserts on Files - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Verifies that two Streams are equal. Two Streams are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The expected Stream - The actual Stream - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Verifies that two Streams are equal. Two Streams are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The expected Stream - The actual Stream - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A file containing the value that is expected - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A file containing the value that is expected - A file containing the actual value - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - - - - Asserts that two Streams are not equal. If they are equal - an is thrown. - - The expected Stream - The actual Stream - The message to be displayed when the two Stream are the same. - Arguments to be used in formatting the message - - - - Asserts that two Streams are not equal. If they are equal - an is thrown. - - The expected Stream - The actual Stream - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - A file containing the value that is expected - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - A file containing the value that is expected - A file containing the actual value - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - - - - Asserts that the file exists. If it does not exist - an is thrown. - - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that the file exists. If it does not exist - an is thrown. - - A file containing the actual value - - - - Asserts that the file exists. If it does not exist - an is thrown. - - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that the file exists. If it does not exist - an is thrown. - - The path to a file containing the actual value - - - - Asserts that the file does not exist. If it does exist - an is thrown. - - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that the file does not exist. If it does exist - an is thrown. - - A file containing the actual value - - - - Asserts that the file does not exist. If it does exist - an is thrown. - - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that the file does not exist. If it does exist - an is thrown. - - The path to a file containing the actual value - - - - GlobalSettings is a place for setting default _values used - by the framework in performing asserts. - - - - - Default tolerance for floating point equality - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - The IApplyToContext interface is implemented by attributes - that want to make changes to the execution context before - a test is run. - - - - - Apply changes to the execution context - - The execution context - - - - The IApplyToTest interface is implemented by self-applying - attributes that modify the state of a test in some way. - - - - - Modifies a test as defined for the specific attribute. - - The test to modify - - - - ICommandWrapper is implemented by attributes and other - objects able to wrap a TestCommand with another command. - - - Attributes or other objects should implement one of the - derived interfaces, rather than this one, since they - indicate in which part of the command chain the wrapper - should be applied. - - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - Objects implementing this interface are used to wrap - the TestMethodCommand itself. They apply after SetUp - has been run and before TearDown. - - - - - Objects implementing this interface are used to wrap - the entire test, including SetUp and TearDown. - - - - - Any ITest that implements this interface is at a level that the implementing - class should be disposed at the end of the test run - - - - - The IFixtureBuilder interface is exposed by a class that knows how to - build a TestFixture from one or more Types. In general, it is exposed - by an attribute, but may be implemented in a helper class used by the - attribute in some cases. - - - - - Build one or more TestFixtures from type provided. At least one - non-null TestSuite must always be returned, since the method is - generally called because the user has marked the target class as - a fixture. If something prevents the fixture from being used, it - will be returned nonetheless, labelled as non-runnable. - - The type info of the fixture to be used. - A TestSuite object or one derived from TestSuite. - - - - IImplyFixture is an empty marker interface used by attributes like - TestAttribute that cause the class where they are used to be treated - as a TestFixture even without a TestFixtureAttribute. - - Marker interfaces are not usually considered a good practice, but - we use it here to avoid cluttering the attribute hierarchy with - classes that don't contain any extra implementation. - - - - - The IMethodInfo class is used to encapsulate information - about a method in a platform-independent manner. - - - - - Gets the Type from which this method was reflected. - - - - - Gets the MethodInfo for this method. - - - - - Gets the name of the method. - - - - - Gets a value indicating whether the method is abstract. - - - - - Gets a value indicating whether the method is public. - - - - - Gets a value indicating whether the method contains unassigned generic type parameters. - - - - - Gets a value indicating whether the method is a generic method. - - - - - Gets a value indicating whether the MethodInfo represents the definition of a generic method. - - - - - Gets the return Type of the method. - - - - - Gets the parameters of the method. - - - - - - Returns the Type arguments of a generic method or the Type parameters of a generic method definition. - - - - - Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. - - The type arguments to be used - A new IMethodInfo with the type arguments replaced - - - - Invokes the method, converting any TargetInvocationException to an NUnitException. - - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - The IDataPointProvider interface is used by extensions - that provide data for a single test parameter. - - - - - Determine whether any data is available for a parameter. - - An IParameterInfo representing one - argument to a parameterized test - True if any data is available, otherwise false. - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - An IEnumerable providing the required data - - - - The IParameterDataSource interface is implemented by types - that can provide data for a test method parameter. - - - - - Gets an enumeration of data items for use as arguments - for a test method parameter. - - The parameter for which data is needed - An enumeration containing individual data items - - - - The IParameterInfo interface is an abstraction of a .NET parameter. - - - - - Gets a value indicating whether the parameter is optional - - - - - Gets an IMethodInfo representing the method for which this is a parameter - - - - - Gets the underlying .NET ParameterInfo - - - - - Gets the Type of the parameter - - - - - A PropertyBag represents a collection of name/value pairs - that allows duplicate entries with the same key. Methods - are provided for adding a new pair as well as for setting - a key to a single value. All keys are strings but _values - may be of any type. Null _values are not permitted, since - a null entry represents the absence of the key. - - The entries in a PropertyBag are of two kinds: those that - take a single value and those that take multiple _values. - However, the PropertyBag has no knowledge of which entries - fall into each category and the distinction is entirely - up to the code using the PropertyBag. - - When working with multi-valued properties, client code - should use the Add method to add name/value pairs and - indexing to retrieve a list of all _values for a given - key. For example: - - bag.Add("Tag", "one"); - bag.Add("Tag", "two"); - Assert.That(bag["Tag"], - Is.EqualTo(new string[] { "one", "two" })); - - When working with single-valued propeties, client code - should use the Set method to set the value and Get to - retrieve the value. The GetSetting methods may also be - used to retrieve the value in a type-safe manner while - also providing default. For example: - - bag.Set("Priority", "low"); - bag.Set("Priority", "high"); // replaces value - Assert.That(bag.Get("Priority"), - Is.EqualTo("high")); - Assert.That(bag.GetSetting("Priority", "low"), - Is.EqualTo("high")); - - - - - Adds a key/value pair to the property bag - - The key - The value - - - - Sets the value for a key, removing any other - _values that are already in the property set. - - - - - - - Gets a single value for a key, using the first - one if multiple _values are present and returning - null if the value is not found. - - - - - Gets a flag indicating whether the specified key has - any entries in the property set. - - The key to be checked - True if their are _values present, otherwise false - - - - Gets or sets the list of _values for a particular key - - The key for which the _values are to be retrieved or set - - - - Gets a collection containing all the keys in the property set - - - - - The IReflectionInfo interface is implemented by NUnit wrapper objects that perform reflection. - - - - - Returns an array of custom attributes of the specified type applied to this object - - - - - Returns a value indicating whether an attribute of the specified type is defined on this object. - - - - - The ISimpleTestBuilder interface is exposed by a class that knows how to - build a single TestMethod from a suitable MethodInfo Types. In general, - it is exposed by an attribute, but may be implemented in a helper class - used by the attribute in some cases. - - - - - Build a TestMethod from the provided MethodInfo. - - The method to be used as a test - The TestSuite to which the method will be added - A TestMethod object - - - - The ISuiteBuilder interface is exposed by a class that knows how to - build a suite from one or more Types. - - - - - Examine the type and determine if it is suitable for - this builder to use in building a TestSuite. - - Note that returning false will cause the type to be ignored - in loading the tests. If it is desired to load the suite - but label it as non-runnable, ignored, etc., then this - method must return true. - - The type of the fixture to be used - True if the type can be used to build a TestSuite - - - - Build a TestSuite from type provided. - - The type of the fixture to be used - A TestSuite - - - - Common interface supported by all representations - of a test. Only includes informational fields. - The Run method is specifically excluded to allow - for data-only representations of a test. - - - - - Gets the id of the test - - - - - Gets the name of the test - - - - - Gets the fully qualified name of the test - - - - - Gets the name of the class containing this test. Returns - null if the test is not associated with a class. - - - - - Gets the name of the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the Type of the test fixture, if applicable, or - null if no fixture type is associated with this test. - - - - - Gets an IMethod for the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the RunState of the test, indicating whether it can be run. - - - - - Count of the test cases ( 1 if this is a test case ) - - - - - Gets the properties of the test - - - - - Gets the parent test, if any. - - The parent test or null if none exists. - - - - Returns true if this is a test suite - - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets this test's child tests - - A list of child tests - - - - Gets a fixture object for running this test. - - - - - The ITestCaseBuilder interface is exposed by a class that knows how to - build a test case from certain methods. - - - This interface is not the same as the ITestCaseBuilder interface in NUnit 2.x. - We have reused the name because the two products don't interoperate at all. - - - - - Examine the method and determine if it is suitable for - this builder to use in building a TestCase to be - included in the suite being populated. - - Note that returning false will cause the method to be ignored - in loading the tests. If it is desired to load the method - but label it as non-runnable, ignored, etc., then this - method must return true. - - The test method to examine - The suite being populated - True is the builder can use this method - - - - Build a TestCase from the provided MethodInfo for - inclusion in the suite being constructed. - - The method to be used as a test case - The test suite being populated, or null - A TestCase or null - - - - The ITestCaseData interface is implemented by a class - that is able to return complete testcases for use by - a parameterized test method. - - - - - Gets the expected result of the test case - - - - - Returns true if an expected result has been set - - - - - The ITestData interface is implemented by a class that - represents a single instance of a parameterized test. - - - - - Gets the name to be used for the test - - - - - Gets the RunState for this test case. - - - - - Gets the argument list to be provided to the test - - - - - Gets the property dictionary for the test case - - - - - Interface to be implemented by filters applied to tests. - The filter applies when running the test, after it has been - loaded, since this is the only time an ITest exists. - - - - - Determine if a particular test passes the filter criteria. Pass - may examine the parents and/or descendants of a test, depending - on the semantics of the particular filter - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - The ITestCaseData interface is implemented by a class - that is able to return the data required to create an - instance of a parameterized test fixture. - - - - - Get the TypeArgs if separately set - - - - - The ITestListener interface is used internally to receive - notifications of significant events while a test is being - run. The events are propagated to clients by means of an - AsyncCallback. NUnit extensions may also monitor these events. - - - - - Called when a test has just started - - The test that is starting - - - - Called when a test has finished - - The result of the test - - - - The ITestBuilder interface is exposed by a class that knows how to - build one or more TestMethods from a MethodInfo. In general, it is exposed - by an attribute, which has additional information available to provide - the necessary test parameters to distinguish the test cases built. - - - - - Build one or more TestMethods from the provided MethodInfo. - - The method to be used as a test - The TestSuite to which the method will be added - A TestMethod object - - - - The ITestResult interface represents the result of a test. - - - - - Gets the ResultState of the test result, which - indicates the success or failure of the test. - - - - - Gets the name of the test result - - - - - Gets the full name of the test result - - - - - Gets the elapsed time for running the test in seconds - - - - - Gets or sets the time the test started running. - - - - - Gets or sets the time the test finished running. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. Not available in - the Compact Framework 1.0. - - - - - Gets the number of asserts executed - when running the test and all its children. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Indicates whether this result has any child results. - Accessing HasChildren should not force creation of the - Children collection in classes implementing this interface. - - - - - Gets the the collection of child results. - - - - - Gets the Test to which this result applies. - - - - - Gets any text output written to this result. - - - - - The ITypeInfo interface is an abstraction of a .NET Type - - - - - Gets the underlying Type on which this ITypeInfo is based - - - - - Gets the base type of this type as an ITypeInfo - - - - - Returns true if the Type wrapped is equal to the argument - - - - - Gets the Name of the Type - - - - - Gets the FullName of the Type - - - - - Gets the assembly in which the type is declared - - - - - Gets the Namespace of the Type - - - - - Gets a value indicating whether the type is abstract. - - - - - Gets a value indicating whether the Type is a generic Type - - - - - Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. - - - - - Gets a value indicating whether the Type is a generic Type definition - - - - - Gets a value indicating whether the type is sealed. - - - - - Gets a value indicating whether this type is a static class. - - - - - Get the display name for this typeInfo. - - - - - Get the display name for an oject of this type, constructed with specific arguments - - - - - Returns a Type representing a generic type definition from which this Type can be constructed. - - - - - Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments - - - - - Returns a value indicating whether this type has a method with a specified public attribute - - - - - Returns an array of IMethodInfos for methods of this Type - that match the specified flags. - - - - - Returns a value indicating whether this Type has a public constructor taking the specified argument Types. - - - - - Construct an object of this Type, using the specified arguments. - - - - - An object implementing IXmlNodeBuilder is able to build - an XML representation of itself and any children. - - - - - Returns a TNode representing the current object. - - If true, children are included where applicable - A TNode representing the result - - - - Returns a TNode representing the current object after - adding it as a child of the supplied parent node. - - The parent node. - If true, children are included, where applicable - - - - - The ResultState class represents the outcome of running a test. - It contains two pieces of information. The Status of the test - is an enum indicating whether the test passed, failed, was - skipped or was inconclusive. The Label provides a more - detailed breakdown for use by client runners. - - - - - Initializes a new instance of the class. - - The TestStatus. - - - - Initializes a new instance of the class. - - The TestStatus. - The label. - - - - Initializes a new instance of the class. - - The TestStatus. - The stage at which the result was produced - - - - Initializes a new instance of the class. - - The TestStatus. - The label. - The stage at which the result was produced - - - - The result is inconclusive - - - - - The test has been skipped. - - - - - The test has been ignored. - - - - - The test was skipped because it is explicit - - - - - The test succeeded - - - - - The test failed - - - - - The test encountered an unexpected exception - - - - - The test was cancelled by the user - - - - - The test was not runnable. - - - - - A suite failed because one or more child tests failed or had errors - - - - - A suite failed in its OneTimeSetUp - - - - - A suite had an unexpected exception in its OneTimeSetUp - - - - - A suite had an unexpected exception in its OneTimeDown - - - - - Gets the TestStatus for the test. - - The status. - - - - Gets the label under which this test result is - categorized, if any. - - - - - Gets the stage of test execution in which - the failure or other result took place. - - - - - Get a new ResultState, which is the same as the current - one but with the FailureSite set to the specified value. - - The FailureSite to use - A new ResultState - - - - Determines whether the specified , is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - The FailureSite enum indicates the stage of a test - in which an error or failure occurred. - - - - - Failure in the test itself - - - - - Failure in the SetUp method - - - - - Failure in the TearDown method - - - - - Failure of a parent test - - - - - Failure of a child test - - - - - The RunState enum indicates whether a test can be executed. - - - - - The test is not runnable. - - - - - The test is runnable. - - - - - The test can only be run explicitly - - - - - The test has been skipped. This value may - appear on a Test when certain attributes - are used to skip the test. - - - - - The test has been ignored. May appear on - a Test, when the IgnoreAttribute is used. - - - - - The TestStatus enum indicates the result of running a test - - - - - The test was inconclusive - - - - - The test has skipped - - - - - The test succeeded - - - - - The test failed - - - - - TNode represents a single node in the XML representation - of a Test or TestResult. It replaces System.Xml.XmlNode and - System.Xml.Linq.XElement, providing a minimal set of methods - for operating on the XML in a platform-independent manner. - - - - - Constructs a new instance of TNode - - The name of the node - - - - Constructs a new instance of TNode with a value - - The name of the node - The text content of the node - - - - Constructs a new instance of TNode with a value - - The name of the node - The text content of the node - Flag indicating whether to use CDATA when writing the text - - - - Gets the name of the node - - - - - Gets the value of the node - - - - - Gets a flag indicating whether the value should be output using CDATA. - - - - - Gets the dictionary of attributes - - - - - Gets a list of child nodes - - - - - Gets the first ChildNode - - - - - Gets the XML representation of this node. - - - - - Create a TNode from it's XML text representation - - The XML text to be parsed - A TNode - - - - Adds a new element as a child of the current node and returns it. - - The element name. - The newly created child element - - - - Adds a new element with a value as a child of the current node and returns it. - - The element name - The text content of the new element - The newly created child element - - - - Adds a new element with a value as a child of the current node and returns it. - The value will be output using a CDATA section. - - The element name - The text content of the new element - The newly created child element - - - - Adds an attribute with a specified name and value to the XmlNode. - - The name of the attribute. - The value of the attribute. - - - - Finds a single descendant of this node matching an xpath - specification. The format of the specification is - limited to what is needed by NUnit and its tests. - - - - - - - Finds all descendants of this node matching an xpath - specification. The format of the specification is - limited to what is needed by NUnit and its tests. - - - - - Writes the XML representation of the node to an XmlWriter - - - - - - Class used to represent a list of XmlResults - - - - - Class used to represent the attributes of a node - - - - - Gets or sets the value associated with the specified key. - Overridden to return null if attribute is not found. - - The key. - Value of the attribute or null - - - - CombiningStrategy is the abstract base for classes that - know how to combine values provided for individual test - parameters to create a set of test cases. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests whether an object graph is serializable in binary format. - - - - - Returns a constraint that tests whether an object graph is serializable in xml format. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable to the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable to the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is a subpath of the expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the actual value falls - inclusively within a specified range. - - from must be less than or equal to true - Inclusive beginning of the range. Must be less than or equal to to. - Inclusive end of the range. Must be greater than or equal to from. - - - - - When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. - - - - - Executed before each test is run - - The test that is going to be run. - - - - Executed after each test is run - - The test that has just been run. - - - - Provides the target for the action attribute - - The target for the action attribute - - - - The Iz class is a synonym for Is intended for use in VB, - which regards Is as a keyword. - - - - - The List class is a helper class with properties and methods - that supply a number of constraints used with lists and collections. - - - - - List.Map returns a ListMapper, which can be used to map - the original collection to another collection. - - - - - - - ListMapper is used to transform a collection used as an actual argument - producing another collection to be used in the assertion. - - - - - Construct a ListMapper based on a collection - - The collection to be transformed - - - - Produces a collection containing all the _values of a property - - The collection of property _values - - - - - The SpecialValue enum is used to represent TestCase arguments - that cannot be used as arguments to an Attribute. - - - - - Null represents a null value, which cannot be used as an - argument to an attriute under .NET 1.x - - - - - Basic Asserts on strings. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - - - - Asserts that a string is not found within another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - - - - Asserts that a string starts with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string starts with another string. - - The expected string - The string to be examined - - - - Asserts that a string does not start with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not start with another string. - - The expected string - The string to be examined - - - - Asserts that a string ends with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string ends with another string. - - The expected string - The string to be examined - - - - Asserts that a string does not end with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not end with another string. - - The expected string - The string to be examined - - - - Asserts that two strings are equal, without regard to case. - - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that two strings are equal, without regard to case. - - The expected string - The actual string - - - - Asserts that two strings are not equal, without regard to case. - - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that two strings are not equal, without regard to case. - - The expected string - The actual string - - - - Asserts that a string matches an expected regular expression pattern. - - The regex pattern to be matched - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string matches an expected regular expression pattern. - - The regex pattern to be matched - The actual string - - - - Asserts that a string does not match an expected regular expression pattern. - - The regex pattern to be used - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not match an expected regular expression pattern. - - The regex pattern to be used - The actual string - - - - The TestCaseData class represents a set of arguments - and other parameter info to be used for a parameterized - test case. It is derived from TestCaseParameters and adds a - fluent syntax for use in initializing the test case. - - - - - Initializes a new instance of the class. - - The arguments. - - - - Initializes a new instance of the class. - - The argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - The third argument. - - - - Sets the expected result for the test - - The expected result - A modified TestCaseData - - - - Sets the name of the test case - - The modified TestCaseData instance - - - - Sets the description for the test case - being constructed. - - The description. - The modified TestCaseData instance. - - - - Applies a category to the test - - - - - - - Applies a named property to the test - - - - - - - - Applies a named property to the test - - - - - - - - Applies a named property to the test - - - - - - - - Marks the test case as explicit. - - - - - Marks the test case as explicit, specifying the reason. - - - - - Ignores this TestCase, specifying the reason. - - The reason. - - - - - Provide the context information of the current test. - This is an adapter for the internal ExecutionContext - class, hiding the internals from the user test. - - - - - Construct a TestContext for an ExecutionContext - - The ExecutionContext to adapt - - - - Get the current test context. This is created - as needed. The user may save the context for - use within a test, but it should not be used - outside the test for which it is created. - - - - - Gets a TextWriter that will send output to the current test result. - - - - - Get a representation of the current test. - - - - - Gets a Representation of the TestResult for the current test. - - - - - Gets the directory containing the current test assembly. - - - - - Gets the directory to be used for outputting files created - by this test run. - - - - - Gets the random generator. - - - The random generator. - - - - Write the string representation of a boolean value to the current result - - - Write a char to the current result - - - Write a char array to the current result - - - Write the string representation of a double to the current result - - - Write the string representation of an Int32 value to the current result - - - Write the string representation of an Int64 value to the current result - - - Write the string representation of a decimal value to the current result - - - Write the string representation of an object to the current result - - - Write the string representation of a Single value to the current result - - - Write a string to the current result - - - Write the string representation of a UInt32 value to the current result - - - Write the string representation of a UInt64 value to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a line terminator to the current result - - - Write the string representation of a boolean value to the current result followed by a line terminator - - - Write a char to the current result followed by a line terminator - - - Write a char array to the current result followed by a line terminator - - - Write the string representation of a double to the current result followed by a line terminator - - - Write the string representation of an Int32 value to the current result followed by a line terminator - - - Write the string representation of an Int64 value to the current result followed by a line terminator - - - Write the string representation of a decimal value to the current result followed by a line terminator - - - Write the string representation of an object to the current result followed by a line terminator - - - Write the string representation of a Single value to the current result followed by a line terminator - - - Write a string to the current result followed by a line terminator - - - Write the string representation of a UInt32 value to the current result followed by a line terminator - - - Write the string representation of a UInt64 value to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - - TestAdapter adapts a Test for consumption by - the user test code. - - - - - Construct a TestAdapter for a Test - - The Test to be adapted - - - - Gets the unique Id of a test - - - - - The name of the test, which may or may not be - the same as the method name. - - - - - The name of the method representing the test. - - - - - The FullName of the test - - - - - The ClassName of the test - - - - - The properties of the test. - - - - - ResultAdapter adapts a TestResult for consumption by - the user test code. - - - - - Construct a ResultAdapter for a TestResult - - The TestResult to be adapted - - - - Gets a ResultState representing the outcome of the test. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - The TestFixtureData class represents a set of arguments - and other parameter info to be used for a parameterized - fixture. It is derived from TestFixtureParameters and adds a - fluent syntax for use in initializing the fixture. - - - - - Initializes a new instance of the class. - - The arguments. - - - - Initializes a new instance of the class. - - The argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - The third argument. - - - - Marks the test fixture as explicit. - - - - - Marks the test fixture as explicit, specifying the reason. - - - - - Ignores this TestFixture, specifying the reason. - - The reason. - - - - - Helper class with properties and methods that supply - constraints that operate on exceptions. - - - - - Creates a constraint specifying an expected exception - - - - - Creates a constraint specifying an exception with a given InnerException - - - - - Creates a constraint specifying an expected TargetInvocationException - - - - - Creates a constraint specifying an expected ArgumentException - - - - - Creates a constraint specifying an expected ArgumentNUllException - - - - - Creates a constraint specifying an expected InvalidOperationException - - - - - Creates a constraint specifying that no exception is thrown - - - - - Creates a constraint specifying the exact type of exception expected - - - - - Creates a constraint specifying the exact type of exception expected - - - - - Creates a constraint specifying the type of exception expected - - - - - Creates a constraint specifying the type of exception expected - - - - - Env is a static class that provides some of the features of - System.Environment that are not available under all runtimes - - - - - The newline sequence in the current environment. - - - - - Path to the 'My Documents' folder - - - - - Directory used for file output if not specified on commandline. - - - - - PackageSettings is a static class containing constant values that - are used as keys in setting up a TestPackage. These values are used in - the engine and framework. Setting values may be a string, int or bool. - - - - - Flag (bool) indicating whether tests are being debugged. - - - - - Flag (bool) indicating whether to pause execution of tests to allow - the user to attache a debugger. - - - - - The InternalTraceLevel for this run. Values are: "Default", - "Off", "Error", "Warning", "Info", "Debug", "Verbose". - Default is "Off". "Debug" and "Verbose" are synonyms. - - - - - Full path of the directory to be used for work and result files. - This path is provided to tests by the frameowrk TestContext. - - - - - The name of the config to use in loading a project. - If not specified, the first config found is used. - - - - - Bool indicating whether the engine should determine the private - bin path by examining the paths to all the tests. Defaults to - true unless PrivateBinPath is specified. - - - - - The ApplicationBase to use in loading the tests. If not - specified, and each assembly has its own process, then the - location of the assembly is used. For multiple assemblies - in a single process, the closest common root directory is used. - - - - - Path to the config file to use in running the tests. - - - - - Bool flag indicating whether a debugger should be launched at agent - startup. Used only for debugging NUnit itself. - - - - - Indicates how to load tests across AppDomains. Values are: - "Default", "None", "Single", "Multiple". Default is "Multiple" - if more than one assembly is loaded in a process. Otherwise, - it is "Single". - - - - - The private binpath used to locate assemblies. Directory paths - is separated by a semicolon. It's an error to specify this and - also set AutoBinPath to true. - - - - - The maximum number of test agents permitted to run simultneously. - Ignored if the ProcessModel is not set or defaulted to Multiple. - - - - - Indicates how to allocate assemblies to processes. Values are: - "Default", "Single", "Separate", "Multiple". Default is "Multiple" - for more than one assembly, "Separate" for a single assembly. - - - - - Indicates the desired runtime to use for the tests. Values - are strings like "net-4.5", "mono-4.0", etc. Default is to - use the target framework for which an assembly was built. - - - - - Bool flag indicating that the test should be run in a 32-bit process - on a 64-bit system. By default, NUNit runs in a 64-bit process on - a 64-bit system. Ignored if set on a 32-bit system. - - - - - Indicates that test runners should be disposed after the tests are executed - - - - - Bool flag indicating that the test assemblies should be shadow copied. - Defaults to false. - - - - - Integer value in milliseconds for the default timeout value - for test cases. If not specified, there is no timeout except - as specified by attributes on the tests themselves. - - - - - A TextWriter to which the internal trace will be sent. - - - - - A list of tests to be loaded. - - - - - The number of test threads to run for the assembly. If set to - 1, a single queue is used. If set to 0, tests are executed - directly, without queuing. - - - - - The random seed to be used for this assembly. If specified - as the value reported from a prior run, the framework should - generate identical random values for tests as were used for - that run, provided that no change has been made to the test - assembly. Default is a random value itself. - - - - - If true, execution stops after the first error or failure. - - - - - If true, use of the event queue is suppressed and test events are synchronous. - - - - diff --git a/packages/NUnit.3.0.1/lib/portable-net45+win8+wp8+wpa81+Xamarin.Mac+MonoAndroid10+MonoTouch10+Xamarin.iOS10/nunit.framework.xml b/packages/NUnit.3.0.1/lib/portable-net45+win8+wp8+wpa81+Xamarin.Mac+MonoAndroid10+MonoTouch10+Xamarin.iOS10/nunit.framework.xml deleted file mode 100644 index 8e32542..0000000 --- a/packages/NUnit.3.0.1/lib/portable-net45+win8+wp8+wpa81+Xamarin.Mac+MonoAndroid10+MonoTouch10+Xamarin.iOS10/nunit.framework.xml +++ /dev/null @@ -1,15264 +0,0 @@ - - - - nunit.framework - - - - - AssemblyHelper provides static methods for working - with assemblies. - - - - - Gets the AssemblyName of an assembly. - - The assembly - An AssemblyName - - - - Loads an assembly given a string, which is the AssemblyName - - - - - - - Interface for logging within the engine - - - - - Logs the specified message at the error level. - - The message. - - - - Logs the specified message at the error level. - - The message. - The arguments. - - - - Logs the specified message at the warning level. - - The message. - - - - Logs the specified message at the warning level. - - The message. - The arguments. - - - - Logs the specified message at the info level. - - The message. - - - - Logs the specified message at the info level. - - The message. - The arguments. - - - - Logs the specified message at the debug level. - - The message. - - - - Logs the specified message at the debug level. - - The message. - The arguments. - - - - InternalTrace provides facilities for tracing the execution - of the NUnit framework. Tests and classes under test may make use - of Console writes, System.Diagnostics.Trace or various loggers and - NUnit itself traps and processes each of them. For that reason, a - separate internal trace is needed. - - Note: - InternalTrace uses a global lock to allow multiple threads to write - trace messages. This can easily make it a bottleneck so it must be - used sparingly. Keep the trace Level as low as possible and only - insert InternalTrace writes where they are needed. - TODO: add some buffering and a separate writer thread as an option. - TODO: figure out a way to turn on trace in specific classes only. - - - - - Gets a flag indicating whether the InternalTrace is initialized - - - - - Initialize the internal trace using a provided TextWriter and level - - A TextWriter - The InternalTraceLevel - - - - Get a named Logger - - - - - - Get a logger named for a particular Type. - - - - - InternalTraceLevel is an enumeration controlling the - level of detailed presented in the internal log. - - - - - Use the default settings as specified by the user. - - - - - Do not display any trace messages - - - - - Display Error messages only - - - - - Display Warning level and higher messages - - - - - Display informational and higher messages - - - - - Display debug messages and higher - i.e. all messages - - - - - Display debug messages and higher - i.e. all messages - - - - - A trace listener that writes to a separate file per domain - and process using it. - - - - - Construct an InternalTraceWriter that writes to a - TextWriter provided by the caller. - - - - - - Returns the character encoding in which the output is written. - - The character encoding in which the output is written. - - - - Writes a character to the text string or stream. - - The character to write to the text stream. - - - - Writes a string to the text string or stream. - - The string to write. - - - - Writes a string followed by a line terminator to the text string or stream. - - The string to write. If is null, only the line terminator is written. - - - - Releases the unmanaged resources used by the and optionally releases the managed resources. - - true to release both managed and unmanaged resources; false to release only unmanaged resources. - - - - Clears all buffers for the current writer and causes any buffered data to be written to the underlying device. - - - - - Provides internal logging to the NUnit framework - - - - - Initializes a new instance of the class. - - The name. - The log level. - The writer where logs are sent. - - - - Logs the message at error level. - - The message. - - - - Logs the message at error level. - - The message. - The message arguments. - - - - Logs the message at warm level. - - The message. - - - - Logs the message at warning level. - - The message. - The message arguments. - - - - Logs the message at info level. - - The message. - - - - Logs the message at info level. - - The message. - The message arguments. - - - - Logs the message at debug level. - - The message. - - - - Logs the message at debug level. - - The message. - The message arguments. - - - - Waits for pending asynchronous operations to complete, if appropriate, - and returns a proper result of the invocation by unwrapping task results - - The raw result of the method invocation - The unwrapped result, if necessary - - - - CombinatorialStrategy creates test cases by using all possible - combinations of the parameter data. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - Provides data from fields marked with the DatapointAttribute or the - DatapointsAttribute. - - - - - Determine whether any data is available for a parameter. - - A ParameterInfo representing one - argument to a parameterized test - - True if any data is available, otherwise false. - - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - A ParameterInfo representing one - argument to a parameterized test - - An IEnumerable providing the required data - - - - - Built-in SuiteBuilder for all types of test classes. - - - - - Checks to see if the provided Type is a fixture. - To be considered a fixture, it must be a non-abstract - class with one or more attributes implementing the - IFixtureBuilder interface or one or more methods - marked as tests. - - The fixture type to check - True if the fixture can be built, false if not - - - - Build a TestSuite from TypeInfo provided. - - The fixture type to build - A TestSuite built from that type - - - - We look for attributes implementing IFixtureBuilder at one level - of inheritance at a time. Attributes on base classes are not used - unless there are no fixture builder attributes at all on the derived - class. This is by design. - - The type being examined for attributes - A list of the attributes found. - - - - Class to build ether a parameterized or a normal NUnitTestMethod. - There are four cases that the builder must deal with: - 1. The method needs no params and none are provided - 2. The method needs params and they are provided - 3. The method needs no params but they are provided in error - 4. The method needs params but they are not provided - This could have been done using two different builders, but it - turned out to be simpler to have just one. The BuildFrom method - takes a different branch depending on whether any parameters are - provided, but all four cases are dealt with in lower-level methods - - - - - Determines if the method can be used to build an NUnit test - test method of some kind. The method must normally be marked - with an identifying attribute for this to be true. - - Note that this method does not check that the signature - of the method for validity. If we did that here, any - test methods with invalid signatures would be passed - over in silence in the test run. Since we want such - methods to be reported, the check for validity is made - in BuildFrom rather than here. - - An IMethodInfo for the method being used as a test method - True if the builder can create a test case from this method - - - - Build a Test from the provided MethodInfo. Depending on - whether the method takes arguments and on the availability - of test case data, this method may return a single test - or a group of tests contained in a ParameterizedMethodSuite. - - The method for which a test is to be built - A Test representing one or more method invocations - - - - Determines if the method can be used to build an NUnit test - test method of some kind. The method must normally be marked - with an identifying attribute for this to be true. - - Note that this method does not check that the signature - of the method for validity. If we did that here, any - test methods with invalid signatures would be passed - over in silence in the test run. Since we want such - methods to be reported, the check for validity is made - in BuildFrom rather than here. - - An IMethodInfo for the method being used as a test method - The test suite being built, to which the new test would be added - True if the builder can create a test case from this method - - - - Build a Test from the provided MethodInfo. Depending on - whether the method takes arguments and on the availability - of test case data, this method may return a single test - or a group of tests contained in a ParameterizedMethodSuite. - - The method for which a test is to be built - The test fixture being populated, or null - A Test representing one or more method invocations - - - - Builds a ParameterizedMethodSuite containing individual test cases. - - The method for which a test is to be built. - The list of test cases to include. - A ParameterizedMethodSuite populated with test cases - - - - Build a simple, non-parameterized TestMethod for this method. - - The MethodInfo for which a test is to be built - The test suite for which the method is being built - A TestMethod. - - - - Class that can build a tree of automatic namespace - suites from a group of fixtures. - - - - - NamespaceDictionary of all test suites we have created to represent - namespaces. Used to locate namespace parent suites for fixtures. - - - - - The root of the test suite being created by this builder. - - - - - Initializes a new instance of the class. - - The root suite. - - - - Gets the root entry in the tree created by the NamespaceTreeBuilder. - - The root suite. - - - - Adds the specified fixtures to the tree. - - The fixtures to be added. - - - - Adds the specified fixture to the tree. - - The fixture to be added. - - - - NUnitTestCaseBuilder is a utility class used by attributes - that build test cases. - - - - - Constructs an - - - - - Builds a single NUnitTestMethod, either as a child of the fixture - or as one of a set of test cases under a ParameterizedTestMethodSuite. - - The MethodInfo from which to construct the TestMethod - The suite or fixture to which the new test will be added - The ParameterSet to be used, or null - - - - - Helper method that checks the signature of a TestMethod and - any supplied parameters to determine if the test is valid. - - Currently, NUnitTestMethods are required to be public, - non-abstract methods, either static or instance, - returning void. They may take arguments but the _values must - be provided or the TestMethod is not considered runnable. - - Methods not meeting these criteria will be marked as - non-runnable and the method will return false in that case. - - The TestMethod to be checked. If it - is found to be non-runnable, it will be modified. - Parameters to be used for this test, or null - True if the method signature is valid, false if not - - The return value is no longer used internally, but is retained - for testing purposes. - - - - - NUnitTestFixtureBuilder is able to build a fixture given - a class marked with a TestFixtureAttribute or an unmarked - class containing test methods. In the first case, it is - called by the attribute and in the second directly by - NUnitSuiteBuilder. - - - - - Build a TestFixture from type provided. A non-null TestSuite - must always be returned, since the method is generally called - because the user has marked the target class as a fixture. - If something prevents the fixture from being used, it should - be returned nonetheless, labelled as non-runnable. - - An ITypeInfo for the fixture to be used. - A TestSuite object or one derived from TestSuite. - - - - Overload of BuildFrom called by tests that have arguments. - Builds a fixture using the provided type and information - in the ITestFixtureData object. - - The TypeInfo for which to construct a fixture. - An object implementing ITestFixtureData or null. - - - - - Method to add test cases to the newly constructed fixture. - - The fixture to which cases should be added - - - - Method to create a test case from a MethodInfo and add - it to the fixture being built. It first checks to see if - any global TestCaseBuilder addin wants to build the - test case. If not, it uses the internal builder - collection maintained by this fixture builder. - - The default implementation has no test case builders. - Derived classes should add builders to the collection - in their constructor. - - The method for which a test is to be created - The test suite being built. - A newly constructed Test - - - - PairwiseStrategy creates test cases by combining the parameter - data so that all possible pairs of data items are used. - - - - The number of test cases that cover all possible pairs of test function - parameters values is significantly less than the number of test cases - that cover all possible combination of test function parameters values. - And because different studies show that most of software failures are - caused by combination of no more than two parameters, pairwise testing - can be an effective ways to test the system when it's impossible to test - all combinations of parameters. - - - The PairwiseStrategy code is based on "jenny" tool by Bob Jenkins: - http://burtleburtle.net/bob/math/jenny.html - - - - - - FleaRand is a pseudo-random number generator developed by Bob Jenkins: - http://burtleburtle.net/bob/rand/talksmall.html#flea - - - - - Initializes a new instance of the FleaRand class. - - The seed. - - - - FeatureInfo represents coverage of a single value of test function - parameter, represented as a pair of indices, Dimension and Feature. In - terms of unit testing, Dimension is the index of the test parameter and - Feature is the index of the supplied value in that parameter's list of - sources. - - - - - Initializes a new instance of FeatureInfo class. - - Index of a dimension. - Index of a feature. - - - - A FeatureTuple represents a combination of features, one per test - parameter, which should be covered by a test case. In the - PairwiseStrategy, we are only trying to cover pairs of features, so the - tuples actually may contain only single feature or pair of features, but - the algorithm itself works with triplets, quadruples and so on. - - - - - Initializes a new instance of FeatureTuple class for a single feature. - - Single feature. - - - - Initializes a new instance of FeatureTuple class for a pair of features. - - First feature. - Second feature. - - - - TestCase represents a single test case covering a list of features. - - - - - Initializes a new instance of TestCaseInfo class. - - A number of features in the test case. - - - - PairwiseTestCaseGenerator class implements an algorithm which generates - a set of test cases which covers all pairs of possible values of test - function. - - - - The algorithm starts with creating a set of all feature tuples which we - will try to cover (see method). This set - includes every single feature and all possible pairs of features. We - store feature tuples in the 3-D collection (where axes are "dimension", - "feature", and "all combinations which includes this feature"), and for - every two feature (e.g. "A" and "B") we generate both ("A", "B") and - ("B", "A") pairs. This data structure extremely reduces the amount of - time needed to calculate coverage for a single test case (this - calculation is the most time-consuming part of the algorithm). - - - Then the algorithm picks one tuple from the uncovered tuple, creates a - test case that covers this tuple, and then removes this tuple and all - other tuples covered by this test case from the collection of uncovered - tuples. - - - Picking a tuple to cover - - - There are no any special rules defined for picking tuples to cover. We - just pick them one by one, in the order they were generated. - - - Test generation - - - Test generation starts from creating a completely random test case which - covers, nevertheless, previously selected tuple. Then the algorithm - tries to maximize number of tuples which this test covers. - - - Test generation and maximization process repeats seven times for every - selected tuple and then the algorithm picks the best test case ("seven" - is a magic number which provides good results in acceptable time). - - Maximizing test coverage - - To maximize tests coverage, the algorithm walks thru the list of mutable - dimensions (mutable dimension is a dimension that are not included in - the previously selected tuple). Then for every dimension, the algorithm - walks thru the list of features and checks if this feature provides - better coverage than randomly selected feature, and if yes keeps this - feature. - - - This process repeats while it shows progress. If the last iteration - doesn't improve coverage, the process ends. - - - In addition, for better results, before start every iteration, the - algorithm "scrambles" dimensions - so for every iteration dimension - probes in a different order. - - - - - - Creates a set of test cases for specified dimensions. - - - An array which contains information about dimensions. Each element of - this array represents a number of features in the specific dimension. - - - A set of test cases. - - - - - Gets the test cases generated by this strategy instance. - - A set of test cases. - - - - The ParameterDataProvider class implements IParameterDataProvider - and hosts one or more individual providers. - - - - - Construct with a collection of individual providers - - - - - Determine whether any data is available for a parameter. - - An IParameterInfo representing one - argument to a parameterized test - True if any data is available, otherwise false. - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - An IEnumerable providing the required data - - - - ParameterDataSourceProvider supplies individual argument _values for - single parameters using attributes implementing IParameterDataSource. - - - - - Determine whether any data is available for a parameter. - - A ParameterInfo representing one - argument to a parameterized test - - True if any data is available, otherwise false. - - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - - An IEnumerable providing the required data - - - - - SequentialStrategy creates test cases by using all of the - parameter data sources in parallel, substituting null - when any of them run out of data. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - ContextSettingsCommand applies specified changes to the - TestExecutionContext prior to running a test. No special - action is needed after the test runs, since the prior - context will be restored automatically. - - - - - The CommandStage enumeration represents the defined stages - of execution for a series of TestCommands. The int _values - of the enum are used to apply decorators in the proper - order. Lower _values are applied first and are therefore - "closer" to the actual test execution. - - - No CommandStage is defined for actual invocation of the test or - for creation of the context. Execution may be imagined as - proceeding from the bottom of the list upwards, with cleanup - after the test running in the opposite order. - - - - - Use an application-defined default value. - - - - - Make adjustments needed before and after running - the raw test - that is, after any SetUp has run - and before TearDown. - - - - - Run SetUp and TearDown for the test. This stage is used - internally by NUnit and should not normally appear - in user-defined decorators. - - - - - Make adjustments needed before and after running - the entire test - including SetUp and TearDown. - - - - - TODO: Documentation needed for class - - - - TODO: Documentation needed for field - - - - TODO: Documentation needed for constructor - - - - - - TODO: Documentation needed for class - - - - - Initializes a new instance of the class. - - The inner command. - The max time allowed in milliseconds - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext - - The context in which the test should run. - A TestResult - - - - OneTimeSetUpCommand runs any one-time setup methods for a suite, - constructing the user test object if necessary. - - - - - Constructs a OneTimeSetUpCommand for a suite - - The suite to which the command applies - A SetUpTearDownList for use by the command - A List of TestActionItems to be run after Setup - - - - Overridden to run the one-time setup for a suite. - - The TestExecutionContext to be used. - A TestResult - - - - OneTimeTearDownCommand performs any teardown actions - specified for a suite and calls Dispose on the user - test object, if any. - - - - - Construct a OneTimeTearDownCommand - - The test suite to which the command applies - A SetUpTearDownList for use by the command - A List of TestActionItems to be run before teardown. - - - - Overridden to run the teardown methods specified on the test. - - The TestExecutionContext to be used. - A TestResult - - - - SetUpTearDownCommand runs any SetUp methods for a suite, - runs the test and then runs any TearDown methods. - - - - - Initializes a new instance of the class. - - The inner command. - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - SetUpTearDownItem holds the setup and teardown methods - for a single level of the inheritance hierarchy. - - - - - Construct a SetUpTearDownNode - - A list of setup methods for this level - A list teardown methods for this level - - - - Returns true if this level has any methods at all. - This flag is used to discard levels that do nothing. - - - - - Run SetUp on this level. - - The execution context to use for running. - - - - Run TearDown for this level. - - - - - - TODO: Documentation needed for class - - - - - Initializes a new instance of the class. - - The test being skipped. - - - - Overridden to simply set the CurrentResult to the - appropriate Skipped state. - - The execution context for the test - A TestResult - - - - TestActionCommand runs the BeforeTest actions for a test, - then runs the test and finally runs the AfterTestActions. - - - - - Initializes a new instance of the class. - - The inner command. - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - TestActionItem represents a single execution of an - ITestAction. It is used to track whether the BeforeTest - method has been called and suppress calling the - AfterTest method if it has not. - - - - - Construct a TestActionItem - - The ITestAction to be included - - - - Run the BeforeTest method of the action and remember that it has been run. - - The test to which the action applies - - - - Run the AfterTest action, but only if the BeforeTest - action was actually run. - - The test to which the action applies - - - - TestCommand is the abstract base class for all test commands - in the framework. A TestCommand represents a single stage in - the execution of a test, e.g.: SetUp/TearDown, checking for - Timeout, verifying the returned result from a method, etc. - - TestCommands may decorate other test commands so that the - execution of a lower-level command is nested within that - of a higher level command. All nested commands are executed - synchronously, as a single unit. Scheduling test execution - on separate threads is handled at a higher level, using the - task dispatcher. - - - - - Construct a TestCommand for a test. - - The test to be executed - - - - Gets the test associated with this command. - - - - - Runs the test in a specified context, returning a TestResult. - - The TestExecutionContext to be used for running the test. - A TestResult - - - - TestMethodCommand is the lowest level concrete command - used to run actual test cases. - - - - - Initializes a new instance of the class. - - The test. - - - - Runs the test, saving a TestResult in the execution context, as - well as returning it. If the test has an expected result, it - is asserts on that value. Since failed tests and errors throw - an exception, this command must be wrapped in an outer command, - will handle that exception and records the failure. This role - is usually played by the SetUpTearDown command. - - The execution context - - - - TheoryResultCommand adjusts the result of a Theory so that - it fails if all the results were inconclusive. - - - - - Constructs a TheoryResultCommand - - The command to be wrapped by this one - - - - Overridden to call the inner command and adjust the result - in case all chlid results were inconclusive. - - - - - - - CultureDetector is a helper class used by NUnit to determine - whether a test should be run based on the current culture. - - - - - Default constructor uses the current culture. - - - - - Construct a CultureDetector for a particular culture for testing. - - The culture to be used - - - - Test to determine if one of a collection of cultures - is being used currently. - - - - - - - Tests to determine if the current culture is supported - based on a culture attribute. - - The attribute to examine - - - - - Test to determine if the a particular culture or comma- - delimited set of cultures is in use. - - Name of the culture or comma-separated list of culture ids - True if the culture is in use on the system - - - - Return the last failure reason. Results are not - defined if called before IsSupported( Attribute ) - is called. - - - - - ExceptionHelper provides static methods for working with exceptions - - - - - Builds up a message, using the Message field of the specified exception - as well as any InnerExceptions. - - The exception. - A combined message string. - - - - Builds up a message, using the Message field of the specified exception - as well as any InnerExceptions. - - The exception. - A combined stack trace. - - - - Gets the stack trace of the exception. - - The exception. - A string representation of the stack trace. - - - - A utility class to create TestCommands - - - - - Gets the command to be executed before any of - the child tests are run. - - A TestCommand - - - - Gets the command to be executed after all of the - child tests are run. - - A TestCommand - - - - Creates a test command for use in running this test. - - - - - - Creates a command for skipping a test. The result returned will - depend on the test RunState. - - - - - Builds the set up tear down list. - - Type of the fixture. - Type of the set up attribute. - Type of the tear down attribute. - A list of SetUpTearDownItems - - - - A CompositeWorkItem represents a test suite and - encapsulates the execution of the suite as well - as all its child tests. - - - - - Construct a CompositeWorkItem for executing a test suite - using a filter to select child tests. - - The TestSuite to be executed - A filter used to select child tests - - - - Method that actually performs the work. Overridden - in CompositeWorkItem to do setup, run all child - items and then do teardown. - - - - - A simplified implementation of .NET 4 CountdownEvent - for use in earlier versions of .NET. Only the methods - used by NUnit are implemented. - - - - - Construct a CountdownEvent - - The initial count - - - - Gets the initial count established for the CountdownEvent - - - - - Gets the current count remaining for the CountdownEvent - - - - - Decrement the count by one - - - - - Block the thread until the count reaches zero - - - - - An IWorkItemDispatcher handles execution of work items. - - - - - Dispatch a single work item for execution. The first - work item dispatched is saved as the top-level - work item and used when stopping the run. - - The item to dispatch - - - - Cancel the ongoing run completely. - If no run is in process, the call has no effect. - - - - - A SimpleWorkItem represents a single test case and is - marked as completed immediately upon execution. This - class is also used for skipped or ignored test suites. - - - - - Construct a simple work item for a test. - - The test to be executed - The filter used to select this test - - - - Method that performs actually performs the work. - - - - - SimpleWorkItemDispatcher handles execution of WorkItems by - directly executing them. It is provided so that a dispatcher - is always available in the context, thereby simplifying the - code needed to run child tests. - - - - - Dispatch a single work item for execution. The first - work item dispatched is saved as the top-level - work item and a thread is created on which to - run it. Subsequent calls come from the top level - item or its descendants on the proper thread. - - The item to dispatch - - - - Cancel the ongoing run completely. - If no run is in process, the call has no effect. - - - - - A WorkItem may be an individual test case, a fixture or - a higher level grouping of tests. All WorkItems inherit - from the abstract WorkItem class, which uses the template - pattern to allow derived classes to perform work in - whatever way is needed. - - A WorkItem is created with a particular TestExecutionContext - and is responsible for re-establishing that context in the - current thread before it begins or resumes execution. - - - - - Creates a work item. - - The test for which this WorkItem is being created. - The filter to be used in selecting any child Tests. - - - - - Construct a WorkItem for a particular test. - - The test that the WorkItem will run - - - - Initialize the TestExecutionContext. This must be done - before executing the WorkItem. - - - Originally, the context was provided in the constructor - but delaying initialization of the context until the item - is about to be dispatched allows changes in the parent - context during OneTimeSetUp to be reflected in the child. - - The TestExecutionContext to use - - - - Event triggered when the item is complete - - - - - Gets the current state of the WorkItem - - - - - The test being executed by the work item - - - - - The execution context - - - - - The test actions to be performed before and after this test - - - - - The test result - - - - - Execute the current work item, including any - child work items. - - - - - Method that performs actually performs the work. It should - set the State to WorkItemState.Complete when done. - - - - - Method called by the derived class when all work is complete - - - - - The current state of a work item - - - - - Ready to run or continue - - - - - Work Item is executing - - - - - Complete - - - - - TextMessageWriter writes constraint descriptions and messages - in displayable form as a text stream. It tailors the display - of individual message components to form the standard message - format of NUnit assertion failure messages. - - - - - Prefix used for the expected value line of a message - - - - - Prefix used for the actual value line of a message - - - - - Length of a message prefix - - - - - Construct a TextMessageWriter - - - - - Construct a TextMessageWriter, specifying a user message - and optional formatting arguments. - - - - - - - Gets or sets the maximum line length for this writer - - - - - Method to write single line message with optional args, usually - written to precede the general failure message, at a given - indentation level. - - The indentation level of the message - The message to be written - Any arguments used in formatting the message - - - - Display Expected and Actual lines for a constraint. This - is called by MessageWriter's default implementation of - WriteMessageTo and provides the generic two-line display. - - The result of the constraint that failed - - - - Display Expected and Actual lines for given _values. This - method may be called by constraints that need more control over - the display of actual and expected _values than is provided - by the default implementation. - - The expected value - The actual value causing the failure - - - - Display Expected and Actual lines for given _values, including - a tolerance value on the expected line. - - The expected value - The actual value causing the failure - The tolerance within which the test was made - - - - Display the expected and actual string _values on separate lines. - If the mismatch parameter is >=0, an additional line is displayed - line containing a caret that points to the mismatch point. - - The expected string value - The actual string value - The point at which the strings don't match or -1 - If true, case is ignored in string comparisons - If true, clip the strings to fit the max line length - - - - Writes the text for an actual value. - - The actual value. - - - - Writes the text for a generalized value. - - The value. - - - - Writes the text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Write the generic 'Expected' line for a constraint - - The constraint that failed - - - - Write the generic 'Expected' line for a given value - - The expected value - - - - Write the generic 'Expected' line for a given value - and tolerance. - - The expected value - The tolerance within which the test was made - - - - Write the generic 'Actual' line for a constraint - - The ConstraintResult for which the actual value is to be written - - - - Write the generic 'Actual' line for a given value - - The actual value causing a failure - - - - Combines multiple filters so that a test must pass all - of them in order to pass this filter. - - - - - Constructs an empty AndFilter - - - - - Constructs an AndFilter from an array of filters - - - - - - Checks whether the AndFilter is matched by a test - - The test to be matched - True if all the component filters pass, otherwise false - - - - Checks whether the AndFilter is matched by a test - - The test to be matched - True if all the component filters match, otherwise false - - - - Gets the element name - - Element name - - - - CategoryFilter is able to select or exclude tests - based on their categories. - - - - - - Construct a CategoryFilter using a single category name - - A category name - - - - Check whether the filter matches a test - - The test to be matched - - - - - Gets the element name - - Element name - - - - ClassName filter selects tests based on the class FullName - - - - - Construct a FullNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - A base class for multi-part filters - - - - - Constructs an empty CompositeFilter - - - - - Constructs a CompositeFilter from an array of filters - - - - - - Adds a filter to the list of filters - - The filter to be added - - - - Return a list of the composing filters. - - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - FullName filter selects tests based on their FullName - - - - - Construct a FullNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - IdFilter selects tests based on their id - - - - - Construct an IdFilter for a single value - - The id the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - FullName filter selects tests based on their FullName - - - - - Construct a MethodNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - NotFilter negates the operation of another filter - - - - - Construct a not filter on another filter - - The filter to be negated - - - - Gets the base filter - - - - - Determine if a particular test passes the filter criteria. The default - implementation checks the test itself, its parents and any descendants. - - Derived classes may override this method or any of the Match methods - to change the behavior of the filter. - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Check whether the filter matches a test - - The test to be matched - True if it matches, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Combines multiple filters so that a test must pass one - of them in order to pass this filter. - - - - - Constructs an empty OrFilter - - - - - Constructs an AndFilter from an array of filters - - - - - - Checks whether the OrFilter is matched by a test - - The test to be matched - True if any of the component filters pass, otherwise false - - - - Checks whether the OrFilter is matched by a test - - The test to be matched - True if any of the component filters match, otherwise false - - - - Gets the element name - - Element name - - - - PropertyFilter is able to select or exclude tests - based on their properties. - - - - - - Construct a PropertyFilter using a property name and expected value - - A property name - The expected value of the property - - - - Check whether the filter matches a test - - The test to be matched - - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - TestName filter selects tests based on their Name - - - - - Construct a TestNameFilter for a single name - - The name the filter will recognize. - - - - Match a test against a single value. - - - - - Gets the element name - - Element name - - - - ValueMatchFilter selects tests based on some value, which - is expected to be contained in the test. - - - - - Returns the value matched by the filter - used for testing - - - - - Indicates whether the value is a regular expression - - - - - Construct a ValueMatchFilter for a single value. - - The value to be included. - - - - Match the input provided by the derived class - - The value to be matchedT - True for a match, false otherwise. - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - Gets the element name - - Element name - - - - GenericMethodHelper is able to deduce the Type arguments for - a generic method from the actual arguments provided. - - - - - Construct a GenericMethodHelper for a method - - MethodInfo for the method to examine - - - - Return the type argments for the method, deducing them - from the arguments actually provided. - - The arguments to the method - An array of type arguments. - - - - InvalidTestFixtureException is thrown when an appropriate test - fixture constructor using the provided arguments cannot be found. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The message. - - - - Initializes a new instance of the class. - - The message. - The inner. - - - - InvalidTestFixtureException is thrown when an appropriate test - fixture constructor using the provided arguments cannot be found. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The message. - - - - Initializes a new instance of the class. - - The message. - The inner. - - - - The MethodWrapper class wraps a MethodInfo so that it may - be used in a platform-independent manner. - - - - - Construct a MethodWrapper for a Type and a MethodInfo. - - - - - Construct a MethodInfo for a given Type and method name. - - - - - Gets the Type from which this method was reflected. - - - - - Gets the MethodInfo for this method. - - - - - Gets the name of the method. - - - - - Gets a value indicating whether the method is abstract. - - - - - Gets a value indicating whether the method is public. - - - - - Gets a value indicating whether the method contains unassigned generic type parameters. - - - - - Gets a value indicating whether the method is a generic method. - - - - - Gets a value indicating whether the MethodInfo represents the definition of a generic method. - - - - - Gets the return Type of the method. - - - - - Gets the parameters of the method. - - - - - - Returns the Type arguments of a generic method or the Type parameters of a generic method definition. - - - - - Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. - - The type arguments to be used - A new IMethodInfo with the type arguments replaced - - - - Returns an array of custom attributes of the specified type applied to this method - - - - - Gets a value indicating whether one or more attributes of the spcified type are defined on the method. - - - - - Invokes the method, converting any TargetInvocationException to an NUnitException. - - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - Override ToString() so that error messages in NUnit's own tests make sense - - - - - Thrown when an assertion failed. Here to preserve the inner - exception and hence its stack trace. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The error message that explains - the reason for the exception - - - - Initializes a new instance of the class. - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - The ParameterWrapper class wraps a ParameterInfo so that it may - be used in a platform-independent manner. - - - - - Construct a ParameterWrapper for a given method and parameter - - - - - - - Gets a value indicating whether the parameter is optional - - - - - Gets an IMethodInfo representing the method for which this is a parameter. - - - - - Gets the underlying ParameterInfo - - - - - Gets the Type of the parameter - - - - - Returns an array of custom attributes of the specified type applied to this method - - - - - Gets a value indicating whether one or more attributes of the specified type are defined on the parameter. - - - - - A PropertyBag represents a collection of name value pairs - that allows duplicate entries with the same key. Methods - are provided for adding a new pair as well as for setting - a key to a single value. All keys are strings but _values - may be of any type. Null _values are not permitted, since - a null entry represents the absence of the key. - - - - - Adds a key/value pair to the property set - - The key - The value - - - - Sets the value for a key, removing any other - _values that are already in the property set. - - - - - - - Gets a single value for a key, using the first - one if multiple _values are present and returning - null if the value is not found. - - - - - - - Gets a flag indicating whether the specified key has - any entries in the property set. - - The key to be checked - - True if their are _values present, otherwise false - - - - - Gets a collection containing all the keys in the property set - - - - - - Gets or sets the list of _values for a particular key - - - - - Returns an XmlNode representating the current PropertyBag. - - Not used - An XmlNode representing the PropertyBag - - - - Returns an XmlNode representing the PropertyBag after - adding it as a child of the supplied parent node. - - The parent node. - Not used - - - - - The PropertyNames class provides static constants for the - standard property ids that NUnit uses on tests. - - - - - The FriendlyName of the AppDomain in which the assembly is running - - - - - The selected strategy for joining parameter data into test cases - - - - - The process ID of the executing assembly - - - - - The stack trace from any data provider that threw - an exception. - - - - - The reason a test was not run - - - - - The author of the tests - - - - - The ApartmentState required for running the test - - - - - The categories applying to a test - - - - - The Description of a test - - - - - The number of threads to be used in running tests - - - - - The maximum time in ms, above which the test is considered to have failed - - - - - The ParallelScope associated with a test - - - - - The number of times the test should be repeated - - - - - Indicates that the test should be run on a separate thread - - - - - The culture to be set for a test - - - - - The UI culture to be set for a test - - - - - The type that is under test - - - - - The timeout value for the test - - - - - The test will be ignored until the given date - - - - - Randomizer returns a set of random _values in a repeatable - way, to allow re-running of tests if necessary. It extends - the .NET Random class, providing random values for a much - wider range of types. - - The class is used internally by the framework to generate - test case data and is also exposed for use by users through - the TestContext.Random property. - - - For consistency with the underlying Random Type, methods - returning a single value use the prefix "Next..." Those - without an argument return a non-negative value up to - the full positive range of the Type. Overloads are provided - for specifying a maximum or a range. Methods that return - arrays or strings use the prefix "Get..." to avoid - confusion with the single-value methods. - - - - - Initial seed used to create randomizers for this run - - - - - Get a Randomizer for a particular member, returning - one that has already been created if it exists. - This ensures that the same _values are generated - each time the tests are reloaded. - - - - - Get a randomizer for a particular parameter, returning - one that has already been created if it exists. - This ensures that the same values are generated - each time the tests are reloaded. - - - - - Create a new Randomizer using the next seed - available to ensure that each randomizer gives - a unique sequence of values. - - - - - - Default constructor - - - - - Construct based on seed value - - - - - - Returns a random unsigned int. - - - - - Returns a random unsigned int less than the specified maximum. - - - - - Returns a random unsigned int within a specified range. - - - - - Returns a non-negative random short. - - - - - Returns a non-negative random short less than the specified maximum. - - - - - Returns a non-negative random short within a specified range. - - - - - Returns a random unsigned short. - - - - - Returns a random unsigned short less than the specified maximum. - - - - - Returns a random unsigned short within a specified range. - - - - - Returns a random long. - - - - - Returns a random long less than the specified maximum. - - - - - Returns a non-negative random long within a specified range. - - - - - Returns a random ulong. - - - - - Returns a random ulong less than the specified maximum. - - - - - Returns a non-negative random long within a specified range. - - - - - Returns a random Byte - - - - - Returns a random Byte less than the specified maximum. - - - - - Returns a random Byte within a specified range - - - - - Returns a random SByte - - - - - Returns a random sbyte less than the specified maximum. - - - - - Returns a random sbyte within a specified range - - - - - Returns a random bool - - - - - Returns a random bool based on the probablility a true result - - - - - Returns a random double between 0.0 and the specified maximum. - - - - - Returns a random double within a specified range. - - - - - Returns a random float. - - - - - Returns a random float between 0.0 and the specified maximum. - - - - - Returns a random float within a specified range. - - - - - Returns a random enum value of the specified Type as an object. - - - - - Returns a random enum value of the specified Type. - - - - - Default characters for random functions. - - Default characters are the English alphabet (uppercase & lowercase), arabic numerals, and underscore - - - - Generate a random string based on the characters from the input string. - - desired length of output string. - string representing the set of characters from which to construct the resulting string - A random string of arbitrary length - - - - Generate a random string based on the characters from the input string. - - desired length of output string. - A random string of arbitrary length - Uses DefaultStringChars as the input character set - - - - Generate a random string based on the characters from the input string. - - A random string of the default length - Uses DefaultStringChars as the input character set - - - - Returns a random decimal. - - - - - Returns a random decimal between positive zero and the specified maximum. - - - - - Returns a random decimal within a specified range, which is not - permitted to exceed decimal.MaxVal in the current implementation. - - - A limitation of this implementation is that the range from min - to max must not exceed decimal.MaxVal. - - - - - Helper methods for inspecting a type by reflection. - - Many of these methods take ICustomAttributeProvider as an - argument to avoid duplication, even though certain attributes can - only appear on specific types of members, like MethodInfo or Type. - - In the case where a type is being examined for the presence of - an attribute, interface or named member, the Reflect methods - operate with the full name of the member being sought. This - removes the necessity of the caller having a reference to the - assembly that defines the item being sought and allows the - NUnit core to inspect assemblies that reference an older - version of the NUnit framework. - - - - - Examine a fixture type and return an array of methods having a - particular attribute. The array is order with base methods first. - - The type to examine - The attribute Type to look for - Specifies whether to search the fixture type inheritance chain - The array of methods found - - - - Examine a fixture type and return true if it has a method with - a particular attribute. - - The type to examine - The attribute Type to look for - True if found, otherwise false - - - - Invoke the default constructor on a Type - - The Type to be constructed - An instance of the Type - - - - Invoke a constructor on a Type with arguments - - The Type to be constructed - Arguments to the constructor - An instance of the Type - - - - Returns an array of types from an array of objects. - Used because the compact framework doesn't support - Type.GetTypeArray() - - An array of objects - An array of Types - - - - Invoke a parameterless method returning void on an object. - - A MethodInfo for the method to be invoked - The object on which to invoke the method - - - - Invoke a method, converting any TargetInvocationException to an NUnitException. - - A MethodInfo for the method to be invoked - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - Represents the result of running a single test case. - - - - - Construct a TestCaseResult based on a TestMethod - - A TestMethod to which the result applies. - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - The TestResult class represents the result of a test. - - - - - Error message for when child tests have errors - - - - - Error message for when child tests are ignored - - - - - The minimum duration for tests - - - - - List of child results - - - - - Construct a test result given a Test - - The test to be used - - - - Gets the test with which this result is associated. - - - - - Gets the ResultState of the test result, which - indicates the success or failure of the test. - - - - - Gets the name of the test result - - - - - Gets the full name of the test result - - - - - Gets or sets the elapsed time for running the test in seconds - - - - - Gets or sets the time the test started running. - - - - - Gets or sets the time the test finished running. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. - - - - - Gets or sets the count of asserts executed - when running the test. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Indicates whether this result has any child results. - Test HasChildren before accessing Children to avoid - the creation of an empty collection. - - - - - Gets the collection of child results. - - - - - Gets a TextWriter, which will write output to be included in the result. - - - - - Gets any text output written to this result. - - - - - Returns the Xml representation of the result. - - If true, descendant results are included - An XmlNode representing the result - - - - Adds the XML representation of the result as a child of the - supplied parent node.. - - The parent node. - If true, descendant results are included - - - - - Adds a child result to this result, setting this result's - ResultState to Failure if the child result failed. - - The result to be added - - - - Set the result of the test - - The ResultState to use in the result - - - - Set the result of the test - - The ResultState to use in the result - A message associated with the result state - - - - Set the result of the test - - The ResultState to use in the result - A message associated with the result state - Stack trace giving the location of the command - - - - Set the test result based on the type of exception thrown - - The exception that was thrown - - - - Set the test result based on the type of exception thrown - - The exception that was thrown - THe FailureSite to use in the result - - - - RecordTearDownException appends the message and stacktrace - from an exception arising during teardown of the test - to any previously recorded information, so that any - earlier failure information is not lost. Note that - calling Assert.Ignore, Assert.Inconclusive, etc. during - teardown is treated as an error. If the current result - represents a suite, it may show a teardown error even - though all contained tests passed. - - The Exception to be recorded - - - - Adds a reason element to a node and returns it. - - The target node. - The new reason element. - - - - Adds a failure element to a node and returns it. - - The target node. - The new failure element. - - - - Represents the result of running a test suite - - - - - Construct a TestSuiteResult base on a TestSuite - - The TestSuite to which the result applies - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Add a child result - - The child result to be added - - - - StackFilter class is used to remove internal NUnit - entries from a stack trace so that the resulting - trace provides better information about the test. - - - - - Filters a raw stack trace and returns the result. - - The original stack trace - A filtered stack trace - - - - Provides methods to support legacy string comparison methods. - - - - - Compares two strings for equality, ignoring case if requested. - - The first string. - The second string.. - if set to true, the case of the letters in the strings is ignored. - Zero if the strings are equivalent, a negative number if strA is sorted first, a positive number if - strB is sorted first - - - - Compares two strings for equality, ignoring case if requested. - - The first string. - The second string.. - if set to true, the case of the letters in the strings is ignored. - True if the strings are equivalent, false if not. - - - - The TestCaseParameters class encapsulates method arguments and - other selected parameters needed for constructing - a parameterized test case. - - - - - The expected result to be returned - - - - - Default Constructor creates an empty parameter set - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a ParameterSet from an object implementing ITestCaseData - - - - - - The expected result of the test, which - must match the method return type. - - - - - Gets a value indicating whether an expected result was specified. - - - - - Helper class used to save and restore certain static or - singleton settings in the environment that affect tests - or which might be changed by the user tests. - - An internal class is used to hold settings and a stack - of these objects is pushed and popped as Save and Restore - are called. - - - - - Link to a prior saved context - - - - - Indicates that a stop has been requested - - - - - The event listener currently receiving notifications - - - - - The number of assertions for the current test - - - - - The current culture - - - - - The current UI culture - - - - - The current test result - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - An existing instance of TestExecutionContext. - - - - The current context, head of the list of saved contexts. - - - - - Gets the current context. - - The current context. - - - - Clear the current context. This is provided to - prevent "leakage" of the CallContext containing - the current context back to any runners. - - - - - Gets or sets the current test - - - - - The time the current test started execution - - - - - The time the current test started in Ticks - - - - - Gets or sets the current test result - - - - - Gets a TextWriter that will send output to the current test result. - - - - - The current test object - that is the user fixture - object on which tests are being executed. - - - - - Get or set the working directory - - - - - Get or set indicator that run should stop on the first error - - - - - Gets an enum indicating whether a stop has been requested. - - - - - The current test event listener - - - - - The current WorkItemDispatcher - - - - - The ParallelScope to be used by tests running in this context. - For builds with out the parallel feature, it has no effect. - - - - - Gets the RandomGenerator specific to this Test - - - - - Gets the assert count. - - The assert count. - - - - Gets or sets the test case timeout value - - - - - Gets a list of ITestActions set by upstream tests - - - - - Saves or restores the CurrentCulture - - - - - Saves or restores the CurrentUICulture - - - - - Record any changes in the environment made by - the test code in the execution context so it - will be passed on to lower level tests. - - - - - Set up the execution environment to match a context. - Note that we may be running on the same thread where the - context was initially created or on a different thread. - - - - - Increments the assert count by one. - - - - - Increments the assert count by a specified amount. - - - - - Enumeration indicating whether the tests are - running normally or being cancelled. - - - - - Running normally with no stop requested - - - - - A graceful stop has been requested - - - - - A forced stop has been requested - - - - - Interface to be implemented by filters applied to tests. - The filter applies when running the test, after it has been - loaded, since this is the only time an ITest exists. - - - - - Unique Empty filter. - - - - - Indicates whether this is the EmptyFilter - - - - - Indicates whether this is a top-level filter, - not contained in any other filter. - - - - - Determine if a particular test passes the filter criteria. The default - implementation checks the test itself, its parents and any descendants. - - Derived classes may override this method or any of the Match methods - to change the behavior of the filter. - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - Determine whether the test itself matches the filter criteria, without - examining either parents or descendants. This is overridden by each - different type of filter to perform the necessary tests. - - The test to which the filter is applied - True if the filter matches the any parent of the test - - - - Determine whether any ancestor of the test matches the filter criteria - - The test to which the filter is applied - True if the filter matches the an ancestor of the test - - - - Determine whether any descendant of the test matches the filter criteria. - - The test to be matched - True if at least one descendant matches the filter criteria - - - - Create a TestFilter instance from an xml representation. - - - - - Create a TestFilter from it's TNode representation - - - - - Nested class provides an empty filter - one that always - returns true when called. It never matches explicitly. - - - - - Adds an XML node - - True if recursive - The added XML node - - - - Adds an XML node - - Parent node - True if recursive - The added XML node - - - - The TestCaseParameters class encapsulates method arguments and - other selected parameters needed for constructing - a parameterized test case. - - - - - Default Constructor creates an empty parameter set - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a ParameterSet from an object implementing ITestCaseData - - - - - - Type arguments used to create a generic fixture instance - - - - - TestListener provides an implementation of ITestListener that - does nothing. It is used only through its NULL property. - - - - - Called when a test has just started - - The test that is starting - - - - Called when a test case has finished - - The result of the test - - - - Construct a new TestListener - private so it may not be used. - - - - - Get a listener that does nothing - - - - - TestNameGenerator is able to create test names according to - a coded pattern. - - - - - Construct a TestNameGenerator - - The pattern used by this generator. - - - - Get the display name for a TestMethod and it's arguments - - A TestMethod - The display name - - - - Get the display name for a TestMethod and it's arguments - - A TestMethod - Arguments to be used - The display name - - - - Get the display name for a MethodInfo - - A MethodInfo - The display name - - - - Get the display name for a method with args - - A MethodInfo - Argument list for the method - The display name - - - - TestParameters is the abstract base class for all classes - that know how to provide data for constructing a test. - - - - - Default Constructor creates an empty parameter set - - - - - Construct a parameter set with a list of arguments - - - - - - Construct a non-runnable ParameterSet, specifying - the provider exception that made it invalid. - - - - - Construct a ParameterSet from an object implementing ITestData - - - - - - The RunState for this set of parameters. - - - - - The arguments to be used in running the test, - which must match the method signature. - - - - - A name to be used for this test case in lieu - of the standard generated name containing - the argument list. - - - - - Gets the property dictionary for this test - - - - - Applies ParameterSet _values to the test itself. - - A test. - - - - The original arguments provided by the user, - used for display purposes. - - - - - TestProgressReporter translates ITestListener events into - the async callbacks that are used to inform the client - software about the progress of a test run. - - - - - Initializes a new instance of the class. - - The callback handler to be used for reporting progress. - - - - Called when a test has just started - - The test that is starting - - - - Called when a test has finished. Sends a result summary to the callback. - to - - The result of the test - - - - Returns the parent test item for the targer test item if it exists - - - parent test item - - - - Makes a string safe for use as an attribute, replacing - characters characters that can't be used with their - corresponding xml representations. - - The string to be used - A new string with the _values replaced - - - - ParameterizedFixtureSuite serves as a container for the set of test - fixtures created from a given Type using various parameters. - - - - - Initializes a new instance of the class. - - The ITypeInfo for the type that represents the suite. - - - - Gets a string representing the type of test - - - - - - ParameterizedMethodSuite holds a collection of individual - TestMethods with their arguments applied. - - - - - Construct from a MethodInfo - - - - - - Gets a string representing the type of test - - - - - - SetUpFixture extends TestSuite and supports - Setup and TearDown methods. - - - - - Initializes a new instance of the class. - - The type. - - - - The Test abstract class represents a test within the framework. - - - - - Static value to seed ids. It's started at 1000 so any - uninitialized ids will stand out. - - - - - The SetUp methods. - - - - - The teardown methods - - - - - Constructs a test given its name - - The name of the test - - - - Constructs a test given the path through the - test hierarchy to its parent and a name. - - The parent tests full name - The name of the test - - - - TODO: Documentation needed for constructor - - - - - - Construct a test from a MethodInfo - - - - - - Gets or sets the id of the test - - - - - - Gets or sets the name of the test - - - - - Gets or sets the fully qualified name of the test - - - - - - Gets the name of the class containing this test. Returns - null if the test is not associated with a class. - - - - - Gets the name of the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the TypeInfo of the fixture used in running this test - or null if no fixture type is associated with it. - - - - - Gets a MethodInfo for the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Whether or not the test should be run - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Gets a string representing the type of test. Used as an attribute - value in the XML representation of a test and has no other - function in the framework. - - - - - Gets a count of test cases represented by - or contained under this test. - - - - - Gets the properties for this test - - - - - Returns true if this is a TestSuite - - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets the parent as a Test object. - Used by the core to set the parent. - - - - - Gets this test's child tests - - A list of child tests - - - - Gets or sets a fixture object for running this test. - - - - - Static prefix used for ids in this AppDomain. - Set by FrameworkController. - - - - - Gets or Sets the Int value representing the seed for the RandomGenerator - - - - - - Creates a TestResult for this test. - - A TestResult suitable for this type of test. - - - - Modify a newly constructed test by applying any of NUnit's common - attributes, based on a supplied ICustomAttributeProvider, which is - usually the reflection element from which the test was constructed, - but may not be in some instances. The attributes retrieved are - saved for use in subsequent operations. - - An object deriving from MemberInfo - - - - Modify a newly constructed test by applying any of NUnit's common - attributes, based on a supplied ICustomAttributeProvider, which is - usually the reflection element from which the test was constructed, - but may not be in some instances. The attributes retrieved are - saved for use in subsequent operations. - - An object deriving from MemberInfo - - - - Add standard attributes and members to a test node. - - - - - - - Returns the Xml representation of the test - - If true, include child tests recursively - - - - - Returns an XmlNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Compares this test to another test for sorting purposes - - The other test - Value of -1, 0 or +1 depending on whether the current test is less than, equal to or greater than the other test - - - - TestAssembly is a TestSuite that represents the execution - of tests in a managed assembly. - - - - - Initializes a new instance of the class - specifying the Assembly and the path from which it was loaded. - - The assembly this test represents. - The path used to load the assembly. - - - - Initializes a new instance of the class - for a path which could not be loaded. - - The path used to load the assembly. - - - - Gets the Assembly represented by this instance. - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - TestFixture is a surrogate for a user test fixture class, - containing one or more tests. - - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - The TestMethod class represents a Test implemented as a method. - - - - - The ParameterSet used to create this test method - - - - - Initializes a new instance of the class. - - The method to be used as a test. - - - - Initializes a new instance of the class. - - The method to be used as a test. - The suite or fixture to which the new test will be added - - - - Overridden to return a TestCaseResult. - - A TestResult for this test. - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Returns a TNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Gets this test's child tests - - A list of child tests - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Returns the name of the method - - - - - TestSuite represents a composite test, which contains other tests. - - - - - Our collection of child tests - - - - - Initializes a new instance of the class. - - The name of the suite. - - - - Initializes a new instance of the class. - - Name of the parent suite. - The name of the suite. - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - Initializes a new instance of the class. - - Type of the fixture. - - - - Sorts tests under this suite. - - - - - Adds a test to the suite. - - The test. - - - - Gets this test's child tests - - The list of child tests - - - - Gets a count of test cases represented by - or contained under this test. - - - - - - The arguments to use in creating the fixture - - - - - Set to true to suppress sorting this suite's contents - - - - - Overridden to return a TestSuiteResult. - - A TestResult for this test. - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets the name used for the top-level element in the - XML representation of this test - - - - - Returns an XmlNode representing the current result after - adding it as a child of the supplied parent node. - - The parent node. - If true, descendant results are included - - - - - Check that setup and teardown methods marked by certain attributes - meet NUnit's requirements and mark the tests not runnable otherwise. - - The attribute type to check for - - - - TypeHelper provides static methods that operate on Types. - - - - - A special value, which is used to indicate that BestCommonType() method - was unable to find a common type for the specified arguments. - - - - - Gets the display name for a Type as used by NUnit. - - The Type for which a display name is needed. - The display name for the Type - - - - Gets the display name for a Type as used by NUnit. - - The Type for which a display name is needed. - The arglist provided. - The display name for the Type - - - - Returns the best fit for a common type to be used in - matching actual arguments to a methods Type parameters. - - The first type. - The second type. - Either type1 or type2, depending on which is more general. - - - - Determines whether the specified type is numeric. - - The type to be examined. - - true if the specified type is numeric; otherwise, false. - - - - - Convert an argument list to the required parameter types. - Currently, only widening numeric conversions are performed. - - An array of args to be converted - A ParameterInfo[] whose types will be used as targets - - - - Determines whether this instance can deduce type args for a generic type from the supplied arguments. - - The type to be examined. - The arglist. - The type args to be used. - - true if this the provided args give sufficient information to determine the type args to be used; otherwise, false. - - - - - Gets the _values for an enumeration, using Enum.GetTypes - where available, otherwise through reflection. - - - - - - - Gets the ids of the _values for an enumeration, - using Enum.GetNames where available, otherwise - through reflection. - - - - - - - The TypeWrapper class wraps a Type so it may be used in - a platform-independent manner. - - - - - Construct a TypeWrapper for a specified Type. - - - - - Gets the underlying Type on which this TypeWrapper is based. - - - - - Gets the base type of this type as an ITypeInfo - - - - - Gets the Name of the Type - - - - - Gets the FullName of the Type - - - - - Gets the assembly in which the type is declared - - - - - Gets the namespace of the Type - - - - - Gets a value indicating whether the type is abstract. - - - - - Gets a value indicating whether the Type is a generic Type - - - - - Returns true if the Type wrapped is T - - - - - Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. - - - - - Gets a value indicating whether the Type is a generic Type definition - - - - - Gets a value indicating whether the type is sealed. - - - - - Gets a value indicating whether this type represents a static class. - - - - - Get the display name for this type - - - - - Get the display name for an object of this type, constructed with the specified args. - - - - - Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments - - - - - Returns a Type representing a generic type definition from which this Type can be constructed. - - - - - Returns an array of custom attributes of the specified type applied to this type - - - - - Returns a value indicating whether the type has an attribute of the specified type. - - - - - - - - Returns a flag indicating whether this type has a method with an attribute of the specified type. - - - - - - - Returns an array of IMethodInfos for methods of this Type - that match the specified flags. - - - - - Returns a value indicating whether this Type has a public constructor taking the specified argument Types. - - - - - Construct an object of this Type, using the specified arguments. - - - - - Override ToString() so that error messages in NUnit's own tests make sense - - - - - Class used to guard against unexpected argument values - or operations by throwing an appropriate exception. - - - - - Throws an exception if an argument is null - - The value to be tested - The name of the argument - - - - Throws an exception if a string argument is null or empty - - The value to be tested - The name of the argument - - - - Throws an ArgumentOutOfRangeException if the specified condition is not met. - - The condition that must be met - The exception message to be used - The name of the argument - - - - Throws an ArgumentException if the specified condition is not met. - - The condition that must be met - The exception message to be used - The name of the argument - - - - Throws an InvalidOperationException if the specified condition is not met. - - The condition that must be met - The exception message to be used - - - - The different targets a test action attribute can be applied to - - - - - Default target, which is determined by where the action attribute is attached - - - - - Target a individual test case - - - - - Target a suite of test cases - - - - - DefaultTestAssemblyBuilder loads a single assembly and builds a TestSuite - containing test fixtures present in the assembly. - - - - - The default suite builder used by the test assembly builder. - - - - - Initializes a new instance of the class. - - - - - Build a suite of tests from a provided assembly - - The assembly from which tests are to be built - A dictionary of options to use in building the suite - - A TestSuite containing the tests found in the assembly - - - - - Build a suite of tests given the filename of an assembly - - The filename of the assembly from which tests are to be built - A dictionary of options to use in building the suite - - A TestSuite containing the tests found in the assembly - - - - - FrameworkController provides a facade for use in loading, browsing - and running tests without requiring a reference to the NUnit - framework. All calls are encapsulated in constructors for - this class and its nested classes, which only require the - types of the Common Type System as arguments. - - The controller supports four actions: Load, Explore, Count and Run. - They are intended to be called by a driver, which should allow for - proper sequencing of calls. Load must be called before any of the - other actions. The driver may support other actions, such as - reload on run, by combining these calls. - - - - - Construct a FrameworkController using the default builder and runner. - - The AssemblyName or path to the test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - - - - Construct a FrameworkController using the default builder and runner. - - The test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - - - - Construct a FrameworkController, specifying the types to be used - for the runner and builder. This constructor is provided for - purposes of development. - - The full AssemblyName or the path to the test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - The Type of the test runner - The Type of the test builder - - - - Construct a FrameworkController, specifying the types to be used - for the runner and builder. This constructor is provided for - purposes of development. - - The test assembly - A prefix used for all test ids created under this controller. - A Dictionary of settings to use in loading and running the tests - The Type of the test runner - The Type of the test builder - - - - Gets the ITestAssemblyBuilder used by this controller instance. - - The builder. - - - - Gets the ITestAssemblyRunner used by this controller instance. - - The runner. - - - - Gets the AssemblyName or the path for which this FrameworkController was created - - - - - Gets the Assembly for which this - - - - - Gets a dictionary of settings for the FrameworkController - - - - - Inserts settings element - - Target node - Settings dictionary - The new node - - - - FrameworkControllerAction is the base class for all actions - performed against a FrameworkController. - - - - - LoadTestsAction loads a test into the FrameworkController - - - - - LoadTestsAction loads the tests in an assembly. - - The controller. - The callback handler. - - - - ExploreTestsAction returns info about the tests in an assembly - - - - - Initializes a new instance of the class. - - The controller for which this action is being performed. - Filter used to control which tests are included (NYI) - The callback handler. - - - - CountTestsAction counts the number of test cases in the loaded TestSuite - held by the FrameworkController. - - - - - Construct a CountsTestAction and perform the count of test cases. - - A FrameworkController holding the TestSuite whose cases are to be counted - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - RunTestsAction runs the loaded TestSuite held by the FrameworkController. - - - - - Construct a RunTestsAction and run all tests in the loaded TestSuite. - - A FrameworkController holding the TestSuite to run - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - RunAsyncAction initiates an asynchronous test run, returning immediately - - - - - Construct a RunAsyncAction and run all tests in the loaded TestSuite. - - A FrameworkController holding the TestSuite to run - A string containing the XML representation of the filter to use - A callback handler used to report results - - - - StopRunAction stops an ongoing run. - - - - - Construct a StopRunAction and stop any ongoing run. If no - run is in process, no error is raised. - - The FrameworkController for which a run is to be stopped. - True the stop should be forced, false for a cooperative stop. - >A callback handler used to report results - A forced stop will cause threads and processes to be killed as needed. - - - - The ITestAssemblyBuilder interface is implemented by a class - that is able to build a suite of tests given an assembly or - an assembly filename. - - - - - Build a suite of tests from a provided assembly - - The assembly from which tests are to be built - A dictionary of options to use in building the suite - A TestSuite containing the tests found in the assembly - - - - Build a suite of tests given the filename of an assembly - - The filename of the assembly from which tests are to be built - A dictionary of options to use in building the suite - A TestSuite containing the tests found in the assembly - - - - The ITestAssemblyRunner interface is implemented by classes - that are able to execute a suite of tests loaded - from an assembly. - - - - - Gets the tree of loaded tests, or null if - no tests have been loaded. - - - - - Gets the tree of test results, if the test - run is completed, otherwise null. - - - - - Indicates whether a test has been loaded - - - - - Indicates whether a test is currently running - - - - - Indicates whether a test run is complete - - - - - Loads the tests found in an Assembly, returning an - indication of whether or not the load succeeded. - - File name of the assembly to load - Dictionary of options to use in loading the test - An ITest representing the loaded tests - - - - Loads the tests found in an Assembly, returning an - indication of whether or not the load succeeded. - - The assembly to load - Dictionary of options to use in loading the test - An ITest representing the loaded tests - - - - Count Test Cases using a filter - - The filter to apply - The number of test cases found - - - - Run selected tests and return a test result. The test is run synchronously, - and the listener interface is notified as it progresses. - - Interface to receive ITestListener notifications. - A test filter used to select tests to be run - - - - Run selected tests asynchronously, notifying the listener interface as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - - - Wait for the ongoing run to complete. - - Time to wait in milliseconds - True if the run completed, otherwise false - - - - Signal any test run that is in process to stop. Return without error if no test is running. - - If true, kill any test-running threads - - - - Implementation of ITestAssemblyRunner - - - - - Initializes a new instance of the class. - - The builder. - - - - The tree of tests that was loaded by the builder - - - - - The test result, if a run has completed - - - - - Indicates whether a test is loaded - - - - - Indicates whether a test is running - - - - - Indicates whether a test run is complete - - - - - Our settings, specified when loading the assembly - - - - - The top level WorkItem created for the assembly as a whole - - - - - The TestExecutionContext for the top level WorkItem - - - - - Loads the tests found in an Assembly - - File name of the assembly to load - Dictionary of option settings for loading the assembly - True if the load was successful - - - - Loads the tests found in an Assembly - - The assembly to load - Dictionary of option settings for loading the assembly - True if the load was successful - - - - Count Test Cases using a filter - - The filter to apply - The number of test cases found - - - - Run selected tests and return a test result. The test is run synchronously, - and the listener interface is notified as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - - - - Run selected tests asynchronously, notifying the listener interface as it progresses. - - Interface to receive EventListener notifications. - A test filter used to select tests to be run - - RunAsync is a template method, calling various abstract and - virtual methods to be overridden by derived classes. - - - - - Wait for the ongoing run to complete. - - Time to wait in milliseconds - True if the run completed, otherwise false - - - - Initiate the test run. - - - - - Signal any test run that is in process to stop. Return without error if no test is running. - - If true, kill any test-running threads - - - - Create the initial TestExecutionContext used to run tests - - The ITestListener specified in the RunAsync call - - - - Handle the the Completed event for the top level work item - - - - - The Assert class contains a collection of static methods that - implement the most common assertions used in NUnit. - - - - - Verifies that the first int is greater than the second - int. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first int is greater than the second - int. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - - - - Assert that a string is empty - that is equal to string.Empty - - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that a string is empty - that is equal to string.Empty - - The string to be tested - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing ICollection - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing ICollection - - - - Assert that a string is not empty - that is not equal to string.Empty - - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that a string is not empty - that is not equal to string.Empty - - The string to be tested - - - - Assert that an array, list or other collection is not empty - - An array, list or other collection implementing ICollection - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that an array, list or other collection is not empty - - An array, list or other collection implementing ICollection - - - - We don't actually want any instances of this object, but some people - like to inherit from it to add other static methods. Hence, the - protected constructor disallows any instances of this object. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - The message to initialize the with. - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - - - - Throws an with the message and arguments - that are passed in. This is used by the other Assert functions. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This is used by the other Assert functions. - - The message to initialize the with. - - - - Throws an . - This is used by the other Assert functions. - - - - - Throws an with the message and arguments - that are passed in. This causes the test to be reported as ignored. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This causes the test to be reported as ignored. - - The message to initialize the with. - - - - Throws an . - This causes the test to be reported as ignored. - - - - - Throws an with the message and arguments - that are passed in. This causes the test to be reported as inconclusive. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This causes the test to be reported as inconclusive. - - The message to initialize the with. - - - - Throws an . - This causes the test to be reported as Inconclusive. - - - - - Asserts that an object is contained in a list. - - The expected object - The list to be examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is contained in a list. - - The expected object - The list to be examined - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - - - - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. - - The value that is expected - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. - - The value that is expected - The actual value - - - - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. - - The value that is expected - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. - - The value that is expected - The actual value - - - - Asserts that two objects refer to the same object. If they - are not the same an is thrown. - - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that two objects refer to the same object. If they - are not the same an is thrown. - - The expected object - The actual object - - - - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. - - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. - - The expected object - The actual object - - - - Helper for Assert.AreEqual(double expected, double actual, ...) - allowing code generation to work consistently. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - A constraint to be satisfied by the exception - A TestSnippet delegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - A constraint to be satisfied by the exception - A TestSnippet delegate - - - - Verifies that a delegate throws a particular exception when called. - - The exception Type expected - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - The exception Type expected - A TestDelegate - - - - Verifies that a delegate throws a particular exception when called. - - Type of the expected exception - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - Type of the expected exception - A TestDelegate - - - - Verifies that a delegate throws an exception when called - and returns it. - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception when called - and returns it. - - A TestDelegate - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - A TestDelegate - - - - Verifies that a delegate does not throw an exception - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate does not throw an exception. - - A TestDelegate - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - Used as a synonym for That in rare cases where a private setter - causes a Visual Basic compilation error. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - Used as a synonym for That in rare cases where a private setter - causes a Visual Basic compilation error. - - - This method is provided for use by VB developers needing to test - the value of properties with private setters. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - - - - Delegate used by tests that execute code and - capture any thrown exception. - - - - - AssertionHelper is an optional base class for user tests, - allowing the use of shorter ids for constraints and - asserts and avoiding conflict with the definition of - , from which it inherits much of its - behavior, in certain mock object frameworks. - - - - - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to - . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to . - - The evaluated condition - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Returns a ListMapper based on a collection. - - The original collection - - - - - Provides static methods to express the assumptions - that must be met for a test to give a meaningful - result. If an assumption is not met, the test - should produce an inconclusive result. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the - method throws an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - A lambda that returns a Boolean - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Provides the Author of a test or test fixture. - - - - - Initializes a new instance of the class. - - The name of the author. - - - - Initializes a new instance of the class. - - The name of the author. - The email address of the author. - - - - Attribute used to apply a category to a test - - - - - The name of the category - - - - - Construct attribute for a given category based on - a name. The name may not contain the characters ',', - '+', '-' or '!'. However, this is not checked in the - constructor since it would cause an error to arise at - as the test was loaded without giving a clear indication - of where the problem is located. The error is handled - in NUnitFramework.cs by marking the test as not - runnable. - - The name of the category - - - - Protected constructor uses the Type name as the name - of the category. - - - - - The name of the category - - - - - Modifies a test by adding a category to it. - - The test to modify - - - - Marks a test to use a combinatorial join of any argument - data provided. Since this is the default, the attribute is - optional. - - - - - Default constructor - - - - - Marks a test to use a particular CombiningStrategy to join - any parameter data provided. Since this is the default, the - attribute is optional. - - - - - Construct a CombiningStrategyAttribute incorporating an - ICombiningStrategy and an IParamterDataProvider. - - Combining strategy to be used in combining data - An IParameterDataProvider to supply data - - - - Construct a CombiningStrategyAttribute incorporating an object - that implements ICombiningStrategy and an IParameterDataProvider. - This constructor is provided for CLS compliance. - - Combining strategy to be used in combining data - An IParameterDataProvider to supply data - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The MethodInfo for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - Modify the test by adding the name of the combining strategy - to the properties. - - The test to modify - - - - CultureAttribute is used to mark a test fixture or an - individual method as applying to a particular Culture only. - - - - - Constructor with no cultures specified, for use - with named property syntax. - - - - - Constructor taking one or more cultures - - Comma-deliminted list of cultures - - - - Causes a test to be skipped if this CultureAttribute is not satisfied. - - The test to modify - - - - Tests to determine if the current culture is supported - based on the properties of this attribute. - - True, if the current culture is supported - - - - Test to determine if the a particular culture or comma- - delimited set of cultures is in use. - - Name of the culture or comma-separated list of culture ids - True if the culture is in use on the system - - - - Test to determine if one of a collection of cultures - is being used currently. - - - - - - - The abstract base class for all data-providing attributes - defined by NUnit. Used to select all data sources for a - method, class or parameter. - - - - - Default constructor - - - - - Used to mark a field for use as a datapoint when executing a theory - within the same fixture that requires an argument of the field's Type. - - - - - Used to mark a field, property or method providing a set of datapoints to - be used in executing any theories within the same fixture that require an - argument of the Type provided. The data source may provide an array of - the required Type or an . - Synonymous with DatapointSourceAttribute. - - - - - Used to mark a field, property or method providing a set of datapoints to - be used in executing any theories within the same fixture that require an - argument of the Type provided. The data source may provide an array of - the required Type or an . - Synonymous with DatapointsAttribute. - - - - - Attribute used to provide descriptive text about a - test case or fixture. - - - - - Construct a description Attribute - - The text of the description - - - - ExplicitAttribute marks a test or test fixture so that it will - only be run if explicitly executed from the gui or command line - or if it is included by use of a filter. The test will not be - run simply because an enclosing suite is run. - - - - - Default constructor - - - - - Constructor with a reason - - The reason test is marked explicit - - - - Modifies a test by marking it as explicit. - - The test to modify - - - - Attribute used to mark a test that is to be ignored. - Ignored tests result in a warning message when the - tests are run. - - - - - Constructs the attribute giving a reason for ignoring the test - - The reason for ignoring the test - - - - The date in the future to stop ignoring the test as a string in UTC time. - For example for a date and time, "2014-12-25 08:10:00Z" or for just a date, - "2014-12-25". If just a date is given, the Ignore will expire at midnight UTC. - - - Once the ignore until date has passed, the test will be marked - as runnable. Tests with an ignore until date will have an IgnoreUntilDate - property set which will appear in the test results. - - The string does not contain a valid string representation of a date and time. - - - - Modifies a test by marking it as Ignored. - - The test to modify - - - - Abstract base for Attributes that are used to include tests - in the test run based on environmental settings. - - - - - Constructor with no included items specified, for use - with named property syntax. - - - - - Constructor taking one or more included items - - Comma-delimited list of included items - - - - Name of the item that is needed in order for - a test to run. Multiple items may be given, - separated by a comma. - - - - - Name of the item to be excluded. Multiple items - may be given, separated by a comma. - - - - - The reason for including or excluding the test - - - - - LevelOfParallelismAttribute is used to set the number of worker threads - that may be allocated by the framework for running tests. - - - - - Construct a LevelOfParallelismAttribute. - - The number of worker threads to be created by the framework. - - - - Summary description for MaxTimeAttribute. - - - - - Construct a MaxTimeAttribute, given a time in milliseconds. - - The maximum elapsed time in milliseconds - - - - The abstract base class for all custom attributes defined by NUnit. - - - - - Default constructor - - - - - Attribute used to identify a method that is called once - to perform setup before any child tests are run. - - - - - Attribute used to identify a method that is called once - after all the child tests have run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Marks a test to use a pairwise join of any argument - data provided. Arguments will be combined in such a - way that all possible pairs of arguments are used. - - - - - Default constructor - - - - - ParallelizableAttribute is used to mark tests that may be run in parallel. - - - - - Construct a ParallelizableAttribute using default ParallelScope.Self. - - - - - Construct a ParallelizableAttribute with a specified scope. - - The ParallelScope associated with this attribute. - - - - Modify the context to be used for child tests - - The current TestExecutionContext - - - - The ParallelScope enumeration permits specifying the degree to - which a test and its descendants may be run in parallel. - - - - - No Parallelism is permitted - - - - - The test itself may be run in parallel with others at the same level - - - - - Descendants of the test may be run in parallel with one another - - - - - Descendants of the test down to the level of TestFixtures may be run in parallel - - - - - PropertyAttribute is used to attach information to a test as a name/value pair.. - - - - - Construct a PropertyAttribute with a name and string value - - The name of the property - The property value - - - - Construct a PropertyAttribute with a name and int value - - The name of the property - The property value - - - - Construct a PropertyAttribute with a name and double value - - The name of the property - The property value - - - - Constructor for derived classes that set the - property dictionary directly. - - - - - Constructor for use by derived classes that use the - name of the type as the property name. Derived classes - must ensure that the Type of the property value is - a standard type supported by the BCL. Any custom - types will cause a serialization Exception when - in the client. - - - - - Gets the property dictionary for this attribute - - - - - Modifies a test by adding properties to it. - - The test to modify - - - - RandomAttribute is used to supply a set of random _values - to a single parameter of a parameterized test. - - - - - Construct a random set of values appropriate for the Type of the - parameter on which the attribute appears, specifying only the count. - - - - - - Construct a set of ints within a specified range - - - - - Construct a set of unsigned ints within a specified range - - - - - Construct a set of longs within a specified range - - - - - Construct a set of unsigned longs within a specified range - - - - - Construct a set of shorts within a specified range - - - - - Construct a set of unsigned shorts within a specified range - - - - - Construct a set of doubles within a specified range - - - - - Construct a set of floats within a specified range - - - - - Construct a set of bytes within a specified range - - - - - Construct a set of sbytes within a specified range - - - - - Get the collection of _values to be used as arguments. - - - - - RangeAttribute is used to supply a range of _values to an - individual parameter of a parameterized test. - - - - - Construct a range of ints using default step of 1 - - - - - - - Construct a range of ints specifying the step size - - - - - - - - Construct a range of unsigned ints using default step of 1 - - - - - - - Construct a range of unsigned ints specifying the step size - - - - - - - - Construct a range of longs using a default step of 1 - - - - - - - Construct a range of longs - - - - - - - - Construct a range of unsigned longs using default step of 1 - - - - - - - Construct a range of unsigned longs specifying the step size - - - - - - - - Construct a range of doubles - - - - - - - - Construct a range of floats - - - - - - - - RepeatAttribute may be applied to test case in order - to run it multiple times. - - - - - Construct a RepeatAttribute - - The number of times to run the test - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - The test command for the RepeatAttribute - - - - - Initializes a new instance of the class. - - The inner command. - The number of repetitions - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - RepeatAttribute may be applied to test case in order - to run it multiple times. - - - - - Construct a RepeatAttribute - - The number of times to run the test - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - The test command for the RetryAttribute - - - - - Initializes a new instance of the class. - - The inner command. - The number of repetitions - - - - Runs the test, saving a TestResult in the supplied TestExecutionContext. - - The context in which the test should run. - A TestResult - - - - Marks a test to use a Sequential join of any argument - data provided. Arguments will be combined into test cases, - taking the next value of each argument until all are used. - - - - - Default constructor - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - SetUpFixtureAttribute is used to identify a SetUpFixture - - - - - Build a SetUpFixture from type provided. Normally called for a Type - on which the attribute has been placed. - - The type info of the fixture to be used. - A SetUpFixture object as a TestSuite. - - - - Attribute used to identify a method that is called - immediately after each test is run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Provide actions to execute before and after tests. - - - - - Executed before each test is run - - The test that is going to be run. - - - - Executed after each test is run - - The test that has just been run. - - - - Provides the target for the action attribute - - - - - Adding this attribute to a method within a - class makes the method callable from the NUnit test runner. There is a property - called Description which is optional which you can provide a more detailed test - description. This class cannot be inherited. - - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - public void TestDescriptionMethod() - {} - } - - - - - - Descriptive text for this test - - - - - The author of this test - - - - - The type that this test is testing - - - - - Modifies a test by adding a description, if not already set. - - The test to modify - - - - Gets or sets the expected result. - - The result. - - - - Returns true if an expected result has been set - - - - - Construct a TestMethod from a given method. - - The method for which a test is to be constructed. - The suite to which the test will be added. - A TestMethod - - - - TestCaseAttribute is used to mark parameterized test cases - and provide them with their arguments. - - - - - Construct a TestCaseAttribute with a list of arguments. - This constructor is not CLS-Compliant - - - - - - Construct a TestCaseAttribute with a single argument - - - - - - Construct a TestCaseAttribute with a two arguments - - - - - - - Construct a TestCaseAttribute with a three arguments - - - - - - - - Gets or sets the name of the test. - - The name of the test. - - - - Gets or sets the RunState of this test case. - - - - - Gets the list of arguments to a test case - - - - - Gets the properties of the test case - - - - - Gets or sets the expected result. - - The result. - - - - Returns true if the expected result has been set - - - - - Gets or sets the description. - - The description. - - - - The author of this test - - - - - The type that this test is testing - - - - - Gets or sets the reason for ignoring the test - - - - - Gets or sets a value indicating whether this is explicit. - - - true if explicit; otherwise, false. - - - - - Gets or sets the reason for not running the test. - - The reason. - - - - Gets or sets the ignore reason. When set to a non-null - non-empty value, the test is marked as ignored. - - The ignore reason. - - - - Gets and sets the category for this test case. - May be a comma-separated list of categories. - - - - - Performs several special conversions allowed by NUnit in order to - permit arguments with types that cannot be used in the constructor - of an Attribute such as TestCaseAttribute or to simplify their use. - - The arguments to be converted - The ParameterInfo array for the method - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The MethodInfo for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - TestCaseSourceAttribute indicates the source to be used to - provide test cases for a test method. - - - - - Construct with the name of the method, property or field that will provide data - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - Construct with a Type - - The type that will provide data - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets or sets the category associated with every fixture created from - this attribute. May be a single category or a comma-separated list. - - - - - Construct one or more TestMethods from a given MethodInfo, - using available parameter data. - - The IMethod for which tests are to be constructed. - The suite to which the tests will be added. - One or more TestMethods - - - - Returns a set of ITestCaseDataItems for use as arguments - to a parameterized test method. - - The method for which data is needed. - - - - - TestFixtureAttribute is used to mark a class that represents a TestFixture. - - - - - Default constructor - - - - - Construct with a object[] representing a set of arguments. - In .NET 2.0, the arguments may later be separated into - type arguments and constructor arguments. - - - - - - Gets or sets the name of the test. - - The name of the test. - - - - Gets or sets the RunState of this test fixture. - - - - - The arguments originally provided to the attribute - - - - - Properties pertaining to this fixture - - - - - Get or set the type arguments. If not set - explicitly, any leading arguments that are - Types are taken as type arguments. - - - - - Descriptive text for this fixture - - - - - The author of this fixture - - - - - The type that this fixture is testing - - - - - Gets or sets the ignore reason. May set RunState as a side effect. - - The ignore reason. - - - - Gets or sets the reason for not running the fixture. - - The reason. - - - - Gets or sets the ignore reason. When set to a non-null - non-empty value, the test is marked as ignored. - - The ignore reason. - - - - Gets or sets a value indicating whether this is explicit. - - - true if explicit; otherwise, false. - - - - - Gets and sets the category for this fixture. - May be a comma-separated list of categories. - - - - - Build a fixture from type provided. Normally called for a Type - on which the attribute has been placed. - - The type info of the fixture to be used. - A an IEnumerable holding one TestFixture object. - - - - Attribute used to identify a method that is - called before any tests in a fixture are run. - - - - - TestCaseSourceAttribute indicates the source to be used to - provide test fixture instances for a test class. - - - - - Error message string is public so the tests can use it - - - - - Construct with the name of the method, property or field that will provide data - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - Construct with a Type - - The type that will provide data - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets or sets the category associated with every fixture created from - this attribute. May be a single category or a comma-separated list. - - - - - Construct one or more TestFixtures from a given Type, - using available parameter data. - - The TypeInfo for which fixures are to be constructed. - One or more TestFixtures as TestSuite - - - - Returns a set of ITestFixtureData items for use as arguments - to a parameterized test fixture. - - The type for which data is needed. - - - - - Attribute used to identify a method that is called after - all the tests in a fixture have run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Indicates which class the test or test fixture is testing - - - - - Initializes a new instance of the class. - - The type that is being tested. - - - - Initializes a new instance of the class. - - The type that is being tested. - - - - Adding this attribute to a method within a - class makes the method callable from the NUnit test runner. There is a property - called Description which is optional which you can provide a more detailed test - description. This class cannot be inherited. - - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - public void TestDescriptionMethod() - {} - } - - - - - - Construct the attribute, specifying a combining strategy and source of parameter data. - - - - - ValuesAttribute is used to provide literal arguments for - an individual parameter of a test. - - - - - The collection of data to be returned. Must - be set by any derived attribute classes. - We use an object[] so that the individual - elements may have their type changed in GetData - if necessary - - - - - Constructs for use with an Enum parameter. Will pass every enum - value in to the test. - - - - - Construct with one argument - - - - - - Construct with two arguments - - - - - - - Construct with three arguments - - - - - - - - Construct with an array of arguments - - - - - - Get the collection of _values to be used as arguments - - - - - ValueSourceAttribute indicates the source to be used to - provide data for one parameter of a test method. - - - - - Construct with the name of the factory - for use with languages - that don't support params arrays. - - The name of a static method, property or field that will provide data. - - - - Construct with a Type and name - for use with languages - that don't support params arrays. - - The Type that will provide data - The name of a static method, property or field that will provide data. - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - Gets an enumeration of data items for use as arguments - for a test method parameter. - - The parameter for which data is needed - - An enumeration containing individual data items - - - - - A set of Assert methods operating on one or more collections - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Asserts that all items contained in collection are of the type specified by expectedType. - - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - - - - Asserts that all items contained in collection are of the type specified by expectedType. - - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that all items contained in collection are not equal to null. - - IEnumerable containing objects to be considered - - - - Asserts that all items contained in collection are not equal to null. - - IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Ensures that every object contained in collection exists within the collection - once and only once. - - IEnumerable of objects to be considered - - - - Ensures that every object contained in collection exists within the collection - once and only once. - - IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not exactly equal. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - - - - Asserts that expected and actual are not exactly equal. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not equivalent. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are not equivalent. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that collection contains actual as an item. - - IEnumerable of objects to be considered - Object to be found within collection - - - - Asserts that collection contains actual as an item. - - IEnumerable of objects to be considered - Object to be found within collection - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that collection does not contain actual as an item. - - IEnumerable of objects to be considered - Object that cannot exist within collection - - - - Asserts that collection does not contain actual as an item. - - IEnumerable of objects to be considered - Object that cannot exist within collection - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the superset does not contain the subset - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - - - - Asserts that the superset does not contain the subset - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the superset contains the subset. - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - - - - Asserts that the superset contains the subset. - - The IEnumerable subset to be considered - The IEnumerable superset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the subset does not contain the superset - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - - - - Asserts that the subset does not contain the superset - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that the subset contains the superset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - - - - Asserts that the subset contains the superset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array,list or other collection is empty - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array,list or other collection is empty - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - - - - Provides a platform-independent methods for getting attributes - for use by AttributeConstraint and AttributeExistsConstraint. - - - - - Gets the custom attributes from the given object. - - Portable libraries do not have an ICustomAttributeProvider, so we need to cast to each of - it's direct subtypes and try to get attributes off those instead. - The actual. - Type of the attribute. - if set to true [inherit]. - A list of the given attribute on the given object. - - - - Specifies flags that control binding and the way in which the search for members - and types is conducted by reflection. - - - - - Specifies no binding flag. - - - - - Specifies that only members declared at the level of the supplied type's hierarchy - should be considered. Inherited members are not considered. - - - - - Specifies that instance members are to be included in the search. - - - - - Specifies that static members are to be included in the search. - - - - - Specifies that public members are to be included in the search. - - - - - Specifies that non-public members are to be included in the search. - - - - - Specifies that public and protected static members up the hierarchy should be - returned. Private static members in inherited classes are not returned. Static - members include fields, methods, events, and properties. Nested types are not - returned. - - - - - A MarshalByRefObject that lives forever - - - - - Some path based methods that we need even in the Portable framework which - does not have the System.IO.Path class - - - - - Windows directory separator - - - - - Alternate directory separator - - - - - A volume separator character. - - - - - Get the file name and extension of the specified path string. - - The path string from which to obtain the file name and extension. - The filename as a . If the last character of is a directory or volume separator character, this method returns . If is null, this method returns null. - - - - Provides NUnit specific extensions to aid in Reflection - across multiple frameworks - - - This version of the class allows direct calls on Type on - those platforms that would normally require use of - GetTypeInfo(). - - - - - Returns an array of generic arguments for the give type - - - - - - - Gets the constructor with the given parameter types - - - - - - - - Gets the constructors for a type - - - - - - - - - - - - - - - - - - - - - - - Gets declared or inherited interfaces on this type - - - - - - - Gets the member on a given type by name. BindingFlags ARE IGNORED. - - - - - - - - - Gets all members on a given type. BindingFlags ARE IGNORED. - - - - - - - - Gets field of the given name on the type - - - - - - - - Gets property of the given name on the type - - - - - - - - Gets property of the given name on the type - - - - - - - - - Gets the method with the given name and parameter list - - - - - - - - Gets the method with the given name and parameter list - - - - - - - - - Gets the method with the given name and parameter list - - - - - - - - - Gets public methods on the given type - - - - - - - Gets methods on a type - - - - - - - - Determines if one type can be implicitly converted from another - - - - - - - - Extensions to the various MemberInfo derived classes - - - - - Returns the get method for the given property - - - - - - - - Returns an array of custom attributes of the specified type applied to this member - - Portable throws an argument exception if T does not - derive from Attribute. NUnit uses interfaces to find attributes, thus - this method - - - - Returns an array of custom attributes of the specified type applied to this parameter - - - - - Returns an array of custom attributes of the specified type applied to this assembly - - - - - Extensions for Assembly that are not available in portable - - - - - DNX does not have a version of GetCustomAttributes on Assembly that takes an inherit - parameter since it doesn't make sense on Assemblies. This version just ignores the - inherit parameter. - - The assembly - The type of attribute you are looking for - Ignored - - - - - Gets the types in a given assembly - - - - - - - This class is a System.Diagnostics.Stopwatch on operating systems that support it. On those that don't, - it replicates the functionality at the resolution supported. - - - - - Gets the total elapsed time measured by the current instance, in milliseconds. - - - - - Gets a value indicating whether the Stopwatch timer is running. - - - - - Gets the current number of ticks in the timer mechanism. - - - If the Stopwatch class uses a high-resolution performance counter, GetTimestamp returns the current - value of that counter. If the Stopwatch class uses the system timer, GetTimestamp returns the current - DateTime.Ticks property of the DateTime.Now instance. - - A long integer representing the tick counter value of the underlying timer mechanism. - - - - Stops time interval measurement and resets the elapsed time to zero. - - - - - Starts, or resumes, measuring elapsed time for an interval. - - - - - Initializes a new Stopwatch instance, sets the elapsed time property to zero, and starts measuring elapsed time. - - A Stopwatch that has just begun measuring elapsed time. - - - - Stops measuring elapsed time for an interval. - - - - - Returns a string that represents the current object. - - - A string that represents the current object. - - - - - Gets the frequency of the timer as the number of ticks per second. - - - - - Indicates whether the timer is based on a high-resolution performance counter. - - - - - AllItemsConstraint applies another constraint to each - item in a collection, succeeding if they all succeed. - - - - - Construct an AllItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - failing if any item fails. - - - - - - - AndConstraint succeeds only if both members succeed. - - - - - Create an AndConstraint from two other constraints - - The first constraint - The second constraint - - - - Gets text describing a constraint - - - - - Apply both member constraints to an actual value, succeeding - succeeding only if both of them succeed. - - The actual value - True if the constraints both succeeded - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - AssignableFromConstraint is used to test that an object - can be assigned from a given Type. - - - - - Construct an AssignableFromConstraint for the type provided - - - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - AssignableToConstraint is used to test that an object - can be assigned to a given Type. - - - - - Construct an AssignableToConstraint for the type provided - - - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - AttributeConstraint tests that a specified attribute is present - on a Type or other provider and that the value of the attribute - satisfies some other constraint. - - - - - Constructs an AttributeConstraint for a specified attribute - Type and base constraint. - - - - - - - Determines whether the Type or other provider has the - expected attribute and if its value matches the - additional constraint specified. - - - - - Returns a string representation of the constraint. - - - - - AttributeExistsConstraint tests for the presence of a - specified attribute on a Type. - - - - - Constructs an AttributeExistsConstraint for a specific attribute Type - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Tests whether the object provides the expected attribute. - - A Type, MethodInfo, or other ICustomAttributeProvider - True if the expected attribute is present, otherwise false - - - - BinaryConstraint is the abstract base of all constraints - that combine two other constraints in some fashion. - - - - - The first constraint being combined - - - - - The second constraint being combined - - - - - Construct a BinaryConstraint from two other constraints - - The first constraint - The second constraint - - - - CollectionConstraint is the abstract base class for - constraints that operate on collections. - - - - - Construct an empty CollectionConstraint - - - - - Construct a CollectionConstraint - - - - - - Determines whether the specified enumerable is empty. - - The enumerable. - - true if the specified enumerable is empty; otherwise, false. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Protected method to be implemented by derived classes - - - - - - - CollectionContainsConstraint is used to test whether a collection - contains an expected object as a member. - - - - - Construct a CollectionContainsConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Gets the expected object - - - - - Test whether the expected item is contained in the collection - - - - - - - CollectionEquivalentConstraint is used to determine whether two - collections are equivalent. - - - - - Construct a CollectionEquivalentConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether two collections are equivalent - - - - - - - CollectionItemsEqualConstraint is the abstract base class for all - collection constraints that apply some notion of item equality - as a part of their operation. - - - - - Construct an empty CollectionConstraint - - - - - Construct a CollectionConstraint - - - - - - Flag the constraint to ignore case and return self. - - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied Comparison object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Compares two collection members for equality - - - - - Return a new CollectionTally for use in making tests - - The collection to be included in the tally - - - - CollectionOrderedConstraint is used to test whether a collection is ordered. - - - - - Construct a CollectionOrderedConstraint - - - - - If used performs a reverse comparison - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use a and returns self. - - - - - Modifies the constraint to test ordering by the value of - a specified property and returns self. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the collection is ordered - - - - - - - Returns the string representation of the constraint. - - - - - - CollectionSubsetConstraint is used to determine whether - one collection is a subset of another - - - - - Construct a CollectionSubsetConstraint - - The collection that the actual value is expected to be a subset of - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the actual collection is a subset of - the expected collection provided. - - - - - - - CollectionSupersetConstraint is used to determine whether - one collection is a superset of another - - - - - Construct a CollectionSupersetConstraint - - The collection that the actual value is expected to be a superset of - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the actual collection is a superset of - the expected collection provided. - - - - - - - CollectionTally counts (tallies) the number of - occurrences of each object in one or more enumerations. - - - - - Construct a CollectionTally object from a comparer and a collection - - - - - The number of objects remaining in the tally - - - - - Try to remove an object from the tally - - The object to remove - True if successful, false if the object was not found - - - - Try to remove a set of objects from the tally - - The objects to remove - True if successful, false if any object was not found - - - - ComparisonAdapter class centralizes all comparisons of - _values in NUnit, adapting to the use of any provided - , - or . - - - - - Gets the default ComparisonAdapter, which wraps an - NUnitComparer object. - - - - - Returns a ComparisonAdapter that wraps an - - - - - Returns a ComparisonAdapter that wraps an - - - - - Returns a ComparisonAdapter that wraps a - - - - - Compares two objects - - - - - Construct a default ComparisonAdapter - - - - - Construct a ComparisonAdapter for an - - - - - Compares two objects - - - - - - - - ComparerAdapter extends and - allows use of an or - to actually perform the comparison. - - - - - Construct a ComparisonAdapter for an - - - - - Compare a Type T to an object - - - - - Construct a ComparisonAdapter for a - - - - - Compare a Type T to an object - - - - - Abstract base class for constraints that compare _values to - determine if one is greater than, equal to or less than - the other. - - - - - The value against which a comparison is to be made - - - - - If true, less than returns success - - - - - if true, equal returns success - - - - - if true, greater than returns success - - - - - ComparisonAdapter to be used in making the comparison - - - - - Initializes a new instance of the class. - - The value against which to make a comparison. - if set to true less succeeds. - if set to true equal succeeds. - if set to true greater succeeds. - String used in describing the constraint. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Modifies the constraint to use an and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Modifies the constraint to use an and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Modifies the constraint to use a and returns self - - The comparer used for comparison tests - A constraint modified to use the given comparer - - - - Delegate used to delay evaluation of the actual value - to be used in evaluating a constraint - - - - - The Constraint class is the base of all built-in constraints - within NUnit. It provides the operator overloads used to combine - constraints. - - - - - Construct a constraint with optional arguments - - Arguments to be saved - - - - The display name of this Constraint for use by ToString(). - The default value is the name of the constraint with - trailing "Constraint" removed. Derived classes may set - this to another name in their constructors. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Arguments provided to this Constraint, for use in - formatting the description. - - - - - The ConstraintBuilder holding this constraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - Test whether the constraint is satisfied by a given reference. - The default implementation simply dereferences the value but - derived classes may override it to provide for delayed processing. - - A reference to the value to be tested - A ConstraintResult - - - - Default override of ToString returns the constraint DisplayName - followed by any arguments within angle brackets. - - - - - - Returns the string representation of this constraint - - - - - This operator creates a constraint that is satisfied only if both - argument constraints are satisfied. - - - - - This operator creates a constraint that is satisfied if either - of the argument constraints is satisfied. - - - - - This operator creates a constraint that is satisfied if the - argument constraint is not satisfied. - - - - - Returns a ConstraintExpression by appending And - to the current constraint. - - - - - Returns a ConstraintExpression by appending And - to the current constraint. - - - - - Returns a ConstraintExpression by appending Or - to the current constraint. - - - - - Resolves any pending operators and returns the resolved constraint. - - - - - ConstraintBuilder maintains the stacks that are used in - processing a ConstraintExpression. An OperatorStack - is used to hold operators that are waiting for their - operands to be reorganized. a ConstraintStack holds - input constraints as well as the results of each - operator applied. - - - - - OperatorStack is a type-safe stack for holding ConstraintOperators - - - - - Initializes a new instance of the class. - - The ConstraintBuilder using this stack. - - - - Gets a value indicating whether this is empty. - - true if empty; otherwise, false. - - - - Gets the topmost operator without modifying the stack. - - - - - Pushes the specified operator onto the stack. - - The operator to put onto the stack. - - - - Pops the topmost operator from the stack. - - The topmost operator on the stack - - - - ConstraintStack is a type-safe stack for holding Constraints - - - - - Initializes a new instance of the class. - - The ConstraintBuilder using this stack. - - - - Gets a value indicating whether this is empty. - - true if empty; otherwise, false. - - - - Pushes the specified constraint. As a side effect, - the constraint's Builder field is set to the - ConstraintBuilder owning this stack. - - The constraint to put onto the stack - - - - Pops this topmost constraint from the stack. - As a side effect, the constraint's Builder - field is set to null. - - The topmost contraint on the stack - - - - Initializes a new instance of the class. - - - - - Appends the specified operator to the expression by first - reducing the operator stack and then pushing the new - operator on the stack. - - The operator to push. - - - - Appends the specified constraint to the expression by pushing - it on the constraint stack. - - The constraint to push. - - - - Sets the top operator right context. - - The right context. - - - - Reduces the operator stack until the topmost item - precedence is greater than or equal to the target precedence. - - The target precedence. - - - - Resolves this instance, returning a Constraint. If the Builder - is not currently in a resolvable state, an exception is thrown. - - The resolved constraint - - - - Gets a value indicating whether this instance is resolvable. - - - true if this instance is resolvable; otherwise, false. - - - - - ConstraintExpression represents a compound constraint in the - process of being constructed from a series of syntactic elements. - - Individual elements are appended to the expression as they are - reorganized. When a constraint is appended, it is returned as the - value of the operation so that modifiers may be applied. However, - any partially built expression is attached to the constraint for - later resolution. When an operator is appended, the partial - expression is returned. If it's a self-resolving operator, then - a ResolvableConstraintExpression is returned. - - - - - The ConstraintBuilder holding the elements recognized so far - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the - class passing in a ConstraintBuilder, which may be pre-populated. - - The builder. - - - - Returns a string representation of the expression as it - currently stands. This should only be used for testing, - since it has the side-effect of resolving the expression. - - - - - - Appends an operator to the expression and returns the - resulting expression itself. - - - - - Appends a self-resolving operator to the expression and - returns a new ResolvableConstraintExpression. - - - - - Appends a constraint to the expression and returns that - constraint, which is associated with the current state - of the expression being built. Note that the constraint - is not reduced at this time. For example, if there - is a NotOperator on the stack we don't reduce and - return a NotConstraint. The original constraint must - be returned because it may support modifiers that - are yet to be applied. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - With is currently a NOP - reserved for future use. - - - - - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. - - - - - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that tests whether the actual value falls - within a specified range. - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that fails if the actual - value matches the pattern supplied as an argument. - - - - - Returns a constraint that tests whether the actual value falls - within a specified range. - - - - - ConstraintStatus represents the status of a ConstraintResult - returned by a Constraint being applied to an actual value. - - - - - The status has not yet been set - - - - - The constraint succeeded - - - - - The constraint failed - - - - - An error occured in applying the constraint (reserved for future use) - - - - - Contain the result of matching a against an actual value. - - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - The status of the new ConstraintResult. - - - - Constructs a for a particular . - - The Constraint to which this result applies. - The actual value to which the Constraint was applied. - If true, applies a status of Success to the result, otherwise Failure. - - - - The actual value that was passed to the method. - - - - - Gets and sets the ResultStatus for this result. - - - - - True if actual value meets the Constraint criteria otherwise false. - - - - - Display friendly name of the constraint. - - - - - Description of the constraint may be affected by the state the constraint had - when was performed against the actual value. - - - - - Write the failure message to the MessageWriter provided - as an argument. The default implementation simply passes - the result and the actual value to the writer, which - then displays the constraint description and the value. - - Constraints that need to provide additional details, - such as where the error occured can override this. - - The MessageWriter on which to display the message - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - ContainsConstraint tests a whether a string contains a substring - or a collection contains an object. It postpones the decision of - which test to use until the type of the actual argument is known. - This allows testing whether a string is contained in a collection - or as a substring of another string using the same syntax. - - - - - Initializes a new instance of the class. - - The _expected. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Flag the constraint to ignore case and return self. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - DictionaryContainsKeyConstraint is used to test whether a dictionary - contains an expected object as a key. - - - - - Construct a DictionaryContainsKeyConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the expected key is contained in the dictionary - - - - - DictionaryContainsValueConstraint is used to test whether a dictionary - contains an expected object as a value. - - - - - Construct a DictionaryContainsValueConstraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the expected value is contained in the dictionary - - - - - EmptyCollectionConstraint tests whether a collection is empty. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Check that the collection is empty - - - - - - - EmptyConstraint tests a whether a string or collection is empty, - postponing the decision about which test is applied until the - type of the actual argument is known. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - EmptyStringConstraint tests whether a string is empty. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - EndsWithConstraint can test whether a string ends - with an expected substring. - - - - - Initializes a new instance of the class. - - The expected string - - - - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. - - - - - - - EqualConstraint is able to compare an actual value with the - expected value provided in its constructor. Two objects are - considered equal if both are null, or if both have the same - value. NUnit has special semantics for some object types. - - - - - NUnitEqualityComparer used to test equality. - - - - - Initializes a new instance of the class. - - The expected value. - - - - Gets the tolerance for this comparison. - - - The tolerance. - - - - - Gets a value indicating whether to compare case insensitive. - - - true if comparing case insensitive; otherwise, false. - - - - - Gets a value indicating whether or not to clip strings. - - - true if set to clip strings otherwise, false. - - - - - Gets the failure points. - - - The failure points. - - - - - Flag the constraint to ignore case and return self. - - - - - Flag the constraint to suppress string clipping - and return self. - - - - - Flag the constraint to compare arrays as collections - and return self. - - - - - Flag the constraint to use a tolerance when determining equality. - - Tolerance value to be used - Self. - - - - Flags the constraint to include - property in comparison of two values. - - - Using this modifier does not allow to use the - constraint modifier. - - - - - Switches the .Within() modifier to interpret its tolerance as - a distance in representable _values (see remarks). - - Self. - - Ulp stands for "unit in the last place" and describes the minimum - amount a given value can change. For any integers, an ulp is 1 whole - digit. For floating point _values, the accuracy of which is better - for smaller numbers and worse for larger numbers, an ulp depends - on the size of the number. Using ulps for comparison of floating - point results instead of fixed tolerances is safer because it will - automatically compensate for the added inaccuracy of larger numbers. - - - - - Switches the .Within() modifier to interpret its tolerance as - a percentage that the actual _values is allowed to deviate from - the expected value. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in days. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in hours. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in minutes. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in seconds. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in milliseconds. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in clock ticks. - - Self - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied Comparison object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - The EqualConstraintResult class is tailored for formatting - and displaying the result of an EqualConstraint. - - - - - Construct an EqualConstraintResult - - - - - Write a failure message. Overridden to provide custom - failure messages for EqualConstraint. - - The MessageWriter to write to - - - - Display the failure information for two collections that did not match. - - The MessageWriter on which to display - The expected collection. - The actual collection - The depth of this failure in a set of nested collections - - - - Displays a single line showing the types and sizes of the expected - and actual collections or arrays. If both are identical, the value is - only shown once. - - The MessageWriter on which to display - The expected collection or array - The actual collection or array - The indentation level for the message line - - - - Displays a single line showing the point in the expected and actual - arrays at which the comparison failed. If the arrays have different - structures or dimensions, both _values are shown. - - The MessageWriter on which to display - The expected array - The actual array - Index of the failure point in the underlying collections - The indentation level for the message line - - - - Display the failure information for two IEnumerables that did not match. - - The MessageWriter on which to display - The expected enumeration. - The actual enumeration - The depth of this failure in a set of nested collections - - - - EqualityAdapter class handles all equality comparisons - that use an , - or a . - - - - - Compares two objects, returning true if they are equal - - - - - Returns true if the two objects can be compared by this adapter. - The base adapter cannot handle IEnumerables except for strings. - - - - - Returns an that wraps an . - - - - - that wraps an . - - - - - Returns an that wraps an . - - - - - Returns true if the two objects can be compared by this adapter. - Generic adapter requires objects of the specified type. - - - - - Returns an that wraps an . - - - - - Returns an that wraps an . - - - - - that wraps an . - - - - - Returns an that wraps a . - - - - - ExactCountConstraint applies another constraint to each - item in a collection, succeeding only if a specified - number of items succeed. - - - - - Construct an ExactCountConstraint on top of an existing constraint - - - - - - - Apply the item constraint to each item in the collection, - succeeding only if the expected number of items pass. - - - - - - - ExactTypeConstraint is used to test that an object - is of the exact type provided in the constructor - - - - - Construct an ExactTypeConstraint for a given Type - - The expected Type. - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - ExceptionTypeConstraint is a special version of ExactTypeConstraint - used to provided detailed info about the exception thrown in - an error message. - - - - - Constructs an ExceptionTypeConstraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - FalseConstraint tests that the actual value is false - - - - - Initializes a new instance of the class. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - Helper routines for working with floating point numbers - - - The floating point comparison code is based on this excellent article: - http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm - - - "ULP" means Unit in the Last Place and in the context of this library refers to - the distance between two adjacent floating point numbers. IEEE floating point - numbers can only represent a finite subset of natural numbers, with greater - accuracy for smaller numbers and lower accuracy for very large numbers. - - - If a comparison is allowed "2 ulps" of deviation, that means the _values are - allowed to deviate by up to 2 adjacent floating point _values, which might be - as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. - - - - - Union of a floating point variable and an integer - - - The union's value as a floating point variable - - - The union's value as an integer - - - The union's value as an unsigned integer - - - Union of a double precision floating point variable and a long - - - The union's value as a double precision floating point variable - - - The union's value as a long - - - The union's value as an unsigned long - - - Compares two floating point _values for equality - First floating point value to be compared - Second floating point value t be compared - - Maximum number of representable floating point _values that are allowed to - be between the left and the right floating point _values - - True if both numbers are equal or close to being equal - - - Floating point _values can only represent a finite subset of natural numbers. - For example, the _values 2.00000000 and 2.00000024 can be stored in a float, - but nothing inbetween them. - - - This comparison will count how many possible floating point _values are between - the left and the right number. If the number of possible _values between both - numbers is less than or equal to maxUlps, then the numbers are considered as - being equal. - - - Implementation partially follows the code outlined here: - http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ - - - - - Compares two double precision floating point _values for equality - First double precision floating point value to be compared - Second double precision floating point value t be compared - - Maximum number of representable double precision floating point _values that are - allowed to be between the left and the right double precision floating point _values - - True if both numbers are equal or close to being equal - - - Double precision floating point _values can only represent a limited series of - natural numbers. For example, the _values 2.0000000000000000 and 2.0000000000000004 - can be stored in a double, but nothing inbetween them. - - - This comparison will count how many possible double precision floating point - _values are between the left and the right number. If the number of possible - _values between both numbers is less than or equal to maxUlps, then the numbers - are considered as being equal. - - - Implementation partially follows the code outlined here: - http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ - - - - - - Reinterprets the memory contents of a floating point value as an integer value - - - Floating point value whose memory contents to reinterpret - - - The memory contents of the floating point value interpreted as an integer - - - - - Reinterprets the memory contents of a double precision floating point - value as an integer value - - - Double precision floating point value whose memory contents to reinterpret - - - The memory contents of the double precision floating point value - interpreted as an integer - - - - - Reinterprets the memory contents of an integer as a floating point value - - Integer value whose memory contents to reinterpret - - The memory contents of the integer value interpreted as a floating point value - - - - - Reinterprets the memory contents of an integer value as a double precision - floating point value - - Integer whose memory contents to reinterpret - - The memory contents of the integer interpreted as a double precision - floating point value - - - - - Tests whether a value is greater than the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Tests whether a value is greater than or equal to the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Interface for all constraints - - - - - The display name of this Constraint for use by ToString(). - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Arguments provided to this Constraint, for use in - formatting the description. - - - - - The ConstraintBuilder holding this constraint - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - Test whether the constraint is satisfied by a given reference. - The default implementation simply dereferences the value but - derived classes may override it to provide for delayed processing. - - A reference to the value to be tested - A ConstraintResult - - - - InstanceOfTypeConstraint is used to test that an object - is of the same type provided or derived from it. - - - - - Construct an InstanceOfTypeConstraint for the type provided - - The expected Type - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - The IResolveConstraint interface is implemented by all - complete and resolvable constraints and expressions. - - - - - Return the top-level constraint for this expression - - - - - - Tests whether a value is less than the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Tests whether a value is less than or equal to the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - MessageWriter is the abstract base for classes that write - constraint descriptions and messages in some form. The - class has separate methods for writing various components - of a message, allowing implementations to tailor the - presentation as needed. - - - - - Construct a MessageWriter given a culture - - - - - Abstract method to get the max line length - - - - - Method to write single line message with optional args, usually - written to precede the general failure message. - - The message to be written - Any arguments used in formatting the message - - - - Method to write single line message with optional args, usually - written to precede the general failure message, at a givel - indentation level. - - The indentation level of the message - The message to be written - Any arguments used in formatting the message - - - - Display Expected and Actual lines for a constraint. This - is called by MessageWriter's default implementation of - WriteMessageTo and provides the generic two-line display. - - The failing constraint result - - - - Display Expected and Actual lines for given _values. This - method may be called by constraints that need more control over - the display of actual and expected _values than is provided - by the default implementation. - - The expected value - The actual value causing the failure - - - - Display Expected and Actual lines for given _values, including - a tolerance value on the Expected line. - - The expected value - The actual value causing the failure - The tolerance within which the test was made - - - - Display the expected and actual string _values on separate lines. - If the mismatch parameter is >=0, an additional line is displayed - line containing a caret that points to the mismatch point. - - The expected string value - The actual string value - The point at which the strings don't match or -1 - If true, case is ignored in locating the point where the strings differ - If true, the strings should be clipped to fit the line - - - - Writes the text for an actual value. - - The actual value. - - - - Writes the text for a generalized value. - - The value. - - - - Writes the text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Static methods used in creating messages - - - - - Static string used when strings are clipped - - - - - Formatting strings used for expected and actual _values - - - - - Formats text to represent a generalized value. - - The value - The formatted text - - - - Formats text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Returns the representation of a type as used in NUnitLite. - This is the same as Type.ToString() except for arrays, - which are displayed with their declared sizes. - - - - - - - Converts any control characters in a string - to their escaped representation. - - The string to be converted - The converted string - - - - Return the a string representation for a set of indices into an array - - Array of indices for which a string is needed - - - - Get an array of indices representing the point in a collection or - array corresponding to a single int index into the collection. - - The collection to which the indices apply - Index in the collection - Array of indices - - - - Clip a string to a given length, starting at a particular offset, returning the clipped - string with ellipses representing the removed parts - - The string to be clipped - The maximum permitted length of the result string - The point at which to start clipping - The clipped string - - - - Clip the expected and actual strings in a coordinated fashion, - so that they may be displayed together. - - - - - - - - - Shows the position two strings start to differ. Comparison - starts at the start index. - - The expected string - The actual string - The index in the strings at which comparison should start - Boolean indicating whether case should be ignored - -1 if no mismatch found, or the index where mismatch found - - - - NaNConstraint tests that the actual value is a double or float NaN - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test that the actual value is an NaN - - - - - - - NoItemConstraint applies another constraint to each - item in a collection, failing if any of them succeeds. - - - - - Construct a SomeItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - failing if any item fails. - - - - - - - NotConstraint negates the effect of some other constraint - - - - - Initializes a new instance of the class. - - The base constraint to be negated. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for if the base constraint fails, false if it succeeds - - - - NullConstraint tests that the actual value is null - - - - - Initializes a new instance of the class. - - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - The Numerics class contains common operations on numeric _values. - - - - - Checks the type of the object, returning true if - the object is a numeric type. - - The object to check - true if the object is a numeric type - - - - Checks the type of the object, returning true if - the object is a floating point numeric type. - - The object to check - true if the object is a floating point numeric type - - - - Checks the type of the object, returning true if - the object is a fixed point numeric type. - - The object to check - true if the object is a fixed point numeric type - - - - Test two numeric _values for equality, performing the usual numeric - conversions and using a provided or default tolerance. If the tolerance - provided is Empty, this method may set it to a default tolerance. - - The expected value - The actual value - A reference to the tolerance in effect - True if the _values are equal - - - - Compare two numeric _values, performing the usual numeric conversions. - - The expected value - The actual value - The relationship of the _values to each other - - - - NUnitComparer encapsulates NUnit's default behavior - in comparing two objects. - - - - - Returns the default NUnitComparer. - - - - - Compares two objects - - - - - - - - NUnitEqualityComparer encapsulates NUnit's handling of - equality tests between objects. - - - - - If true, all string comparisons will ignore case - - - - - If true, arrays will be treated as collections, allowing - those of different dimensions to be compared - - - - - Comparison objects used in comparisons for some constraints. - - - - - List of points at which a failure occurred. - - - - - Returns the default NUnitEqualityComparer - - - - - Gets and sets a flag indicating whether case should - be ignored in determining equality. - - - - - Gets and sets a flag indicating that arrays should be - compared as collections, without regard to their shape. - - - - - Gets the list of external comparers to be used to - test for equality. They are applied to members of - collections, in place of NUnit's own logic. - - - - - Gets the list of failure points for the last Match performed. - The list consists of objects to be interpreted by the caller. - This generally means that the caller may only make use of - objects it has placed on the list at a particular depthy. - - - - - Flags the comparer to include - property in comparison of two values. - - - Using this modifier does not allow to use the - modifier. - - - - - Compares two objects for equality within a tolerance. - - - - - Helper method to compare two arrays - - - - - FailurePoint class represents one point of failure - in an equality test. - - - - - The location of the failure - - - - - The expected value - - - - - The actual value - - - - - Indicates whether the expected value is valid - - - - - Indicates whether the actual value is valid - - - - - Represents a constraint that succeeds if all the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - they all succeed. - - - - - Operator that requires both it's arguments to succeed - - - - - Construct an AndOperator - - - - - Apply the operator to produce an AndConstraint - - - - - Operator that tests for the presence of a particular attribute - on a type and optionally applies further tests to the attribute. - - - - - Construct an AttributeOperator for a particular Type - - The Type of attribute tested - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - Abstract base class for all binary operators - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Gets the left precedence of the operator - - - - - Gets the right precedence of the operator - - - - - Abstract method that produces a constraint by applying - the operator to its left and right constraint arguments. - - - - - Abstract base for operators that indicate how to - apply a constraint to items in a collection. - - - - - Constructs a CollectionOperator - - - - - The ConstraintOperator class is used internally by a - ConstraintBuilder to represent an operator that - modifies or combines constraints. - - Constraint operators use left and right precedence - _values to determine whether the top operator on the - stack should be reduced before pushing a new operator. - - - - - The precedence value used when the operator - is about to be pushed to the stack. - - - - - The precedence value used when the operator - is on the top of the stack. - - - - - The syntax element preceding this operator - - - - - The syntax element following this operator - - - - - The precedence value used when the operator - is about to be pushed to the stack. - - - - - The precedence value used when the operator - is on the top of the stack. - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Represents a constraint that succeeds if the specified - count of members of a collection match a base constraint. - - - - - Construct an ExactCountOperator for a specified count - - The expected count - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. - - - - - Represents a constraint that succeeds if none of the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. - - - - - Negates the test of the constraint it wraps. - - - - - Constructs a new NotOperator - - - - - Returns a NotConstraint applied to its argument. - - - - - Operator that requires at least one of it's arguments to succeed - - - - - Construct an OrOperator - - - - - Apply the operator to produce an OrConstraint - - - - - PrefixOperator takes a single constraint and modifies - it's action in some way. - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Returns the constraint created by applying this - prefix to another constraint. - - - - - - - Operator used to test for the presence of a named Property - on an object and optionally apply further tests to the - value of that property. - - - - - Gets the name of the property to which the operator applies - - - - - Constructs a PropOperator for a particular named property - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Abstract base class for operators that are able to reduce to a - constraint whether or not another syntactic element follows. - - - - - Represents a constraint that succeeds if any of the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - any of them succeed. - - - - - Operator that tests that an exception is thrown and - optionally applies further tests to the exception. - - - - - Construct a ThrowsOperator - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - Represents a constraint that simply wraps the - constraint provided as an argument, without any - further functionality, but which modifies the - order of evaluation because of its precedence. - - - - - Constructor for the WithOperator - - - - - Returns a constraint that wraps its argument - - - - - OrConstraint succeeds if either member succeeds - - - - - Create an OrConstraint from two other constraints - - The first constraint - The second constraint - - - - Gets text describing a constraint - - - - - Apply the member constraints to an actual value, succeeding - succeeding as soon as one of them succeeds. - - The actual value - True if either constraint succeeded - - - - Predicate constraint wraps a Predicate in a constraint, - returning success if the predicate is true. - - - - - Construct a PredicateConstraint from a predicate - - - - - Gets text describing a constraint - - - - - Determines whether the predicate succeeds when applied - to the actual value. - - - - - Abstract base class used for prefixes - - - - - The base constraint - - - - - Prefix used in forming the constraint description - - - - - Construct given a base constraint - - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - PropertyConstraint extracts a named property and uses - its value as the actual value for a chained constraint. - - - - - Initializes a new instance of the class. - - The name. - The constraint to apply to the property. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Returns the string representation of the constraint. - - - - - - PropertyExistsConstraint tests that a named property - exists on the object provided through Match. - - Originally, PropertyConstraint provided this feature - in addition to making optional tests on the value - of the property. The two constraints are now separate. - - - - - Initializes a new instance of the class. - - The name of the property. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the property exists for a given object - - The object to be tested - True for success, false for failure - - - - Returns the string representation of the constraint. - - - - - - RangeConstraint tests whether two _values are within a - specified range. - - - - - Initializes a new instance of the class. - - from must be less than or equal to true - Inclusive beginning of the range. Must be less than or equal to to. - Inclusive end of the range. Must be greater than or equal to from. - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use an and returns self. - - - - - Modifies the constraint to use a and returns self. - - - - - RegexConstraint can test whether a string matches - the pattern provided. - - - - - Initializes a new instance of the class. - - The pattern. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - ResolvableConstraintExpression is used to represent a compound - constraint being constructed at a point where the last operator - may either terminate the expression or may have additional - qualifying constraints added to it. - - It is used, for example, for a Property element or for - an Exception element, either of which may be optionally - followed by constraints that apply to the property or - exception. - - - - - Create a new instance of ResolvableConstraintExpression - - - - - Create a new instance of ResolvableConstraintExpression, - passing in a pre-populated ConstraintBuilder. - - - - - Appends an And Operator to the expression - - - - - Appends an Or operator to the expression. - - - - - Resolve the current expression to a Constraint - - - - - ReusableConstraint wraps a constraint expression after - resolving it so that it can be reused consistently. - - - - - Construct a ReusableConstraint from a constraint expression - - The expression to be resolved and reused - - - - Converts a constraint to a ReusableConstraint - - The constraint to be converted - A ReusableConstraint - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - Return the top-level constraint for this expression - - - - - - SameAsConstraint tests whether an object is identical to - the object passed to its constructor - - - - - Initializes a new instance of the class. - - The expected object. - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - SomeItemsConstraint applies another constraint to each - item in a collection, succeeding if any of them succeeds. - - - - - Construct a SomeItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - succeeding if any item succeeds. - - - - - - - StartsWithConstraint can test whether a string starts - with an expected substring. - - - - - Initializes a new instance of the class. - - The expected string - - - - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. - - - - - - - StringConstraint is the abstract base for constraints - that operate on strings. It supports the IgnoreCase - modifier for string operations. - - - - - The expected value - - - - - Indicates whether tests should be case-insensitive - - - - - Description of this constraint - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Constructs a StringConstraint without an expected value - - - - - Constructs a StringConstraint given an expected value - - The expected value - - - - Modify the constraint to ignore case in matching. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Test whether the constraint is satisfied by a given string - - The string to be tested - True for success, false for failure - - - - SubstringConstraint can test whether a string contains - the expected substring. - - - - - Initializes a new instance of the class. - - The expected. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - ThrowsConstraint is used to test the exception thrown by - a delegate by applying a constraint to it. - - - - - Initializes a new instance of the class, - using a constraint to be applied to the exception. - - A constraint to apply to the caught exception. - - - - Get the actual exception thrown - used by Assert.Throws. - - - - - Gets text describing a constraint - - - - - Executes the code of the delegate and captures any exception. - If a non-null base constraint was provided, it applies that - constraint to the exception. - - A delegate representing the code to be tested - True if an exception is thrown and the constraint succeeds, otherwise false - - - - Converts an ActualValueDelegate to a TestDelegate - before calling the primary overload. - - - - - - - Write the actual value for a failing constraint test to a - MessageWriter. This override only handles the special message - used when an exception is expected but none is thrown. - - The writer on which the actual value is displayed - - - - ThrowsExceptionConstraint tests that an exception has - been thrown, without any further tests. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Executes the code and returns success if an exception is thrown. - - A delegate representing the code to be tested - True if an exception is thrown, otherwise false - - - - ThrowsNothingConstraint tests that a delegate does not - throw an exception. - - - - - Gets text describing a constraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True if no exception is thrown, otherwise false - - - - Applies the constraint to an ActualValueDelegate that returns - the value to be tested. The default implementation simply evaluates - the delegate but derived classes may override it to provide for - delayed processing. - - An ActualValueDelegate - A ConstraintResult - - - - The Tolerance class generalizes the notion of a tolerance - within which an equality test succeeds. Normally, it is - used with numeric types, but it can be used with any - type that supports taking a difference between two - objects and comparing that difference to a value. - - - - - Returns a default Tolerance object, equivalent to - specifying an exact match unless - is set, in which case, the - will be used. - - - - - Returns an empty Tolerance object, equivalent to - specifying an exact match even if - is set. - - - - - Constructs a linear tolerance of a specified amount - - - - - Constructs a tolerance given an amount and - - - - - Gets the for the current Tolerance - - - - - Tests that the current Tolerance is linear with a - numeric value, throwing an exception if it is not. - - - - - Gets the value of the current Tolerance instance. - - - - - Returns a new tolerance, using the current amount as a percentage. - - - - - Returns a new tolerance, using the current amount in Ulps - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of days. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of hours. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of minutes. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of seconds. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of milliseconds. - - - - - Returns a new tolerance with a as the amount, using - the current amount as a number of clock ticks. - - - - - Returns true if the current tolerance has not been set or is using the . - - - - - Modes in which the tolerance value for a comparison can be interpreted. - - - - - The tolerance was created with a value, without specifying - how the value would be used. This is used to prevent setting - the mode more than once and is generally changed to Linear - upon execution of the test. - - - - - The tolerance is used as a numeric range within which - two compared _values are considered to be equal. - - - - - Interprets the tolerance as the percentage by which - the two compared _values my deviate from each other. - - - - - Compares two _values based in their distance in - representable numbers. - - - - - TrueConstraint tests that the actual value is true - - - - - Initializes a new instance of the class. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - TypeConstraint is the abstract base for constraints - that take a Type as their expected value. - - - - - The expected Type used by the constraint - - - - - The type of the actual argument to which the constraint was applied - - - - - Construct a TypeConstraint for a given Type - - The expected type for the constraint - Prefix used in forming the constraint description - - - - Applies the constraint to an actual value, returning a ConstraintResult. - - The value to be tested - A ConstraintResult - - - - Apply the constraint to an actual value, returning true if it succeeds - - The actual argument - True if the constraint succeeds, otherwise false. - - - - UniqueItemsConstraint tests whether all the items in a - collection are unique. - - - - - The Description of what this constraint tests, for - use in messages and in the ConstraintResult. - - - - - Check that all items are unique. - - - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new DictionaryContainsKeyConstraint checking for the - presence of a particular key in the dictionary. - - - - - Returns a new DictionaryContainsValueConstraint checking for the - presence of a particular value in the dictionary. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Thrown when an assertion failed. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Gets the ResultState provided by this exception - - - - - Thrown when an assertion failed. - - - - - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Gets the ResultState provided by this exception - - - - - Thrown when a test executes inconclusively. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Gets the ResultState provided by this exception - - - - - Abstract base for Exceptions that terminate a test and provide a ResultState. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Gets the ResultState provided by this exception - - - - - Thrown when an assertion failed. - - - - - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Gets the ResultState provided by this exception - - - - - GlobalSettings is a place for setting default _values used - by the framework in performing asserts. - - - - - Default tolerance for floating point equality - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - The IApplyToContext interface is implemented by attributes - that want to make changes to the execution context before - a test is run. - - - - - Apply changes to the execution context - - The execution context - - - - The IApplyToTest interface is implemented by self-applying - attributes that modify the state of a test in some way. - - - - - Modifies a test as defined for the specific attribute. - - The test to modify - - - - CombiningStrategy is the abstract base for classes that - know how to combine values provided for individual test - parameters to create a set of test cases. - - - - - Gets the test cases generated by the CombiningStrategy. - - The test cases. - - - - ICommandWrapper is implemented by attributes and other - objects able to wrap a TestCommand with another command. - - - Attributes or other objects should implement one of the - derived interfaces, rather than this one, since they - indicate in which part of the command chain the wrapper - should be applied. - - - - - Wrap a command and return the result. - - The command to be wrapped - The wrapped command - - - - Objects implementing this interface are used to wrap - the TestMethodCommand itself. They apply after SetUp - has been run and before TearDown. - - - - - Objects implementing this interface are used to wrap - the entire test, including SetUp and TearDown. - - - - - Any ITest that implements this interface is at a level that the implementing - class should be disposed at the end of the test run - - - - - The IFixtureBuilder interface is exposed by a class that knows how to - build a TestFixture from one or more Types. In general, it is exposed - by an attribute, but may be implemented in a helper class used by the - attribute in some cases. - - - - - Build one or more TestFixtures from type provided. At least one - non-null TestSuite must always be returned, since the method is - generally called because the user has marked the target class as - a fixture. If something prevents the fixture from being used, it - will be returned nonetheless, labelled as non-runnable. - - The type info of the fixture to be used. - A TestSuite object or one derived from TestSuite. - - - - IImplyFixture is an empty marker interface used by attributes like - TestAttribute that cause the class where they are used to be treated - as a TestFixture even without a TestFixtureAttribute. - - Marker interfaces are not usually considered a good practice, but - we use it here to avoid cluttering the attribute hierarchy with - classes that don't contain any extra implementation. - - - - - The IMethodInfo class is used to encapsulate information - about a method in a platform-independent manner. - - - - - Gets the Type from which this method was reflected. - - - - - Gets the MethodInfo for this method. - - - - - Gets the name of the method. - - - - - Gets a value indicating whether the method is abstract. - - - - - Gets a value indicating whether the method is public. - - - - - Gets a value indicating whether the method contains unassigned generic type parameters. - - - - - Gets a value indicating whether the method is a generic method. - - - - - Gets a value indicating whether the MethodInfo represents the definition of a generic method. - - - - - Gets the return Type of the method. - - - - - Gets the parameters of the method. - - - - - - Returns the Type arguments of a generic method or the Type parameters of a generic method definition. - - - - - Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. - - The type arguments to be used - A new IMethodInfo with the type arguments replaced - - - - Invokes the method, converting any TargetInvocationException to an NUnitException. - - The object on which to invoke the method - The argument list for the method - The return value from the invoked method - - - - The IDataPointProvider interface is used by extensions - that provide data for a single test parameter. - - - - - Determine whether any data is available for a parameter. - - An IParameterInfo representing one - argument to a parameterized test - True if any data is available, otherwise false. - - - - Return an IEnumerable providing data for use with the - supplied parameter. - - An IParameterInfo representing one - argument to a parameterized test - An IEnumerable providing the required data - - - - The IParameterDataSource interface is implemented by types - that can provide data for a test method parameter. - - - - - Gets an enumeration of data items for use as arguments - for a test method parameter. - - The parameter for which data is needed - An enumeration containing individual data items - - - - The IParameterInfo interface is an abstraction of a .NET parameter. - - - - - Gets a value indicating whether the parameter is optional - - - - - Gets an IMethodInfo representing the method for which this is a parameter - - - - - Gets the underlying .NET ParameterInfo - - - - - Gets the Type of the parameter - - - - - A PropertyBag represents a collection of name/value pairs - that allows duplicate entries with the same key. Methods - are provided for adding a new pair as well as for setting - a key to a single value. All keys are strings but _values - may be of any type. Null _values are not permitted, since - a null entry represents the absence of the key. - - The entries in a PropertyBag are of two kinds: those that - take a single value and those that take multiple _values. - However, the PropertyBag has no knowledge of which entries - fall into each category and the distinction is entirely - up to the code using the PropertyBag. - - When working with multi-valued properties, client code - should use the Add method to add name/value pairs and - indexing to retrieve a list of all _values for a given - key. For example: - - bag.Add("Tag", "one"); - bag.Add("Tag", "two"); - Assert.That(bag["Tag"], - Is.EqualTo(new string[] { "one", "two" })); - - When working with single-valued propeties, client code - should use the Set method to set the value and Get to - retrieve the value. The GetSetting methods may also be - used to retrieve the value in a type-safe manner while - also providing default. For example: - - bag.Set("Priority", "low"); - bag.Set("Priority", "high"); // replaces value - Assert.That(bag.Get("Priority"), - Is.EqualTo("high")); - Assert.That(bag.GetSetting("Priority", "low"), - Is.EqualTo("high")); - - - - - Adds a key/value pair to the property bag - - The key - The value - - - - Sets the value for a key, removing any other - _values that are already in the property set. - - - - - - - Gets a single value for a key, using the first - one if multiple _values are present and returning - null if the value is not found. - - - - - Gets a flag indicating whether the specified key has - any entries in the property set. - - The key to be checked - True if their are _values present, otherwise false - - - - Gets or sets the list of _values for a particular key - - The key for which the _values are to be retrieved or set - - - - Gets a collection containing all the keys in the property set - - - - - The IReflectionInfo interface is implemented by NUnit wrapper objects that perform reflection. - - - - - Returns an array of custom attributes of the specified type applied to this object - - - - - Returns a value indicating whether an attribute of the specified type is defined on this object. - - - - - The ISimpleTestBuilder interface is exposed by a class that knows how to - build a single TestMethod from a suitable MethodInfo Types. In general, - it is exposed by an attribute, but may be implemented in a helper class - used by the attribute in some cases. - - - - - Build a TestMethod from the provided MethodInfo. - - The method to be used as a test - The TestSuite to which the method will be added - A TestMethod object - - - - The ISuiteBuilder interface is exposed by a class that knows how to - build a suite from one or more Types. - - - - - Examine the type and determine if it is suitable for - this builder to use in building a TestSuite. - - Note that returning false will cause the type to be ignored - in loading the tests. If it is desired to load the suite - but label it as non-runnable, ignored, etc., then this - method must return true. - - The type of the fixture to be used - True if the type can be used to build a TestSuite - - - - Build a TestSuite from type provided. - - The type of the fixture to be used - A TestSuite - - - - Common interface supported by all representations - of a test. Only includes informational fields. - The Run method is specifically excluded to allow - for data-only representations of a test. - - - - - Gets the id of the test - - - - - Gets the name of the test - - - - - Gets the fully qualified name of the test - - - - - Gets the name of the class containing this test. Returns - null if the test is not associated with a class. - - - - - Gets the name of the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the Type of the test fixture, if applicable, or - null if no fixture type is associated with this test. - - - - - Gets an IMethod for the method implementing this test. - Returns null if the test is not implemented as a method. - - - - - Gets the RunState of the test, indicating whether it can be run. - - - - - Count of the test cases ( 1 if this is a test case ) - - - - - Gets the properties of the test - - - - - Gets the parent test, if any. - - The parent test or null if none exists. - - - - Returns true if this is a test suite - - - - - Gets a bool indicating whether the current test - has any descendant tests. - - - - - Gets this test's child tests - - A list of child tests - - - - Gets a fixture object for running this test. - - - - - The ITestBuilder interface is exposed by a class that knows how to - build one or more TestMethods from a MethodInfo. In general, it is exposed - by an attribute, which has additional information available to provide - the necessary test parameters to distinguish the test cases built. - - - - - Build one or more TestMethods from the provided MethodInfo. - - The method to be used as a test - The TestSuite to which the method will be added - A TestMethod object - - - - The ITestCaseBuilder interface is exposed by a class that knows how to - build a test case from certain methods. - - - This interface is not the same as the ITestCaseBuilder interface in NUnit 2.x. - We have reused the name because the two products don't interoperate at all. - - - - - Examine the method and determine if it is suitable for - this builder to use in building a TestCase to be - included in the suite being populated. - - Note that returning false will cause the method to be ignored - in loading the tests. If it is desired to load the method - but label it as non-runnable, ignored, etc., then this - method must return true. - - The test method to examine - The suite being populated - True is the builder can use this method - - - - Build a TestCase from the provided MethodInfo for - inclusion in the suite being constructed. - - The method to be used as a test case - The test suite being populated, or null - A TestCase or null - - - - The ITestCaseData interface is implemented by a class - that is able to return complete testcases for use by - a parameterized test method. - - - - - Gets the expected result of the test case - - - - - Returns true if an expected result has been set - - - - - The ITestData interface is implemented by a class that - represents a single instance of a parameterized test. - - - - - Gets the name to be used for the test - - - - - Gets the RunState for this test case. - - - - - Gets the argument list to be provided to the test - - - - - Gets the property dictionary for the test case - - - - - Interface to be implemented by filters applied to tests. - The filter applies when running the test, after it has been - loaded, since this is the only time an ITest exists. - - - - - Determine if a particular test passes the filter criteria. Pass - may examine the parents and/or descendants of a test, depending - on the semantics of the particular filter - - The test to which the filter is applied - True if the test passes the filter, otherwise false - - - - Determine if a test matches the filter expicitly. That is, it must - be a direct match of the test itself or one of it's children. - - The test to which the filter is applied - True if the test matches the filter explicityly, otherwise false - - - - The ITestCaseData interface is implemented by a class - that is able to return the data required to create an - instance of a parameterized test fixture. - - - - - Get the TypeArgs if separately set - - - - - The ITestListener interface is used internally to receive - notifications of significant events while a test is being - run. The events are propagated to clients by means of an - AsyncCallback. NUnit extensions may also monitor these events. - - - - - Called when a test has just started - - The test that is starting - - - - Called when a test has finished - - The result of the test - - - - The ITestResult interface represents the result of a test. - - - - - Gets the ResultState of the test result, which - indicates the success or failure of the test. - - - - - Gets the name of the test result - - - - - Gets the full name of the test result - - - - - Gets the elapsed time for running the test in seconds - - - - - Gets or sets the time the test started running. - - - - - Gets or sets the time the test finished running. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. Not available in - the Compact Framework 1.0. - - - - - Gets the number of asserts executed - when running the test and all its children. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - Indicates whether this result has any child results. - Accessing HasChildren should not force creation of the - Children collection in classes implementing this interface. - - - - - Gets the the collection of child results. - - - - - Gets the Test to which this result applies. - - - - - Gets any text output written to this result. - - - - - The ITypeInfo interface is an abstraction of a .NET Type - - - - - Gets the underlying Type on which this ITypeInfo is based - - - - - Gets the base type of this type as an ITypeInfo - - - - - Returns true if the Type wrapped is equal to the argument - - - - - Gets the Name of the Type - - - - - Gets the FullName of the Type - - - - - Gets the assembly in which the type is declared - - - - - Gets the Namespace of the Type - - - - - Gets a value indicating whether the type is abstract. - - - - - Gets a value indicating whether the Type is a generic Type - - - - - Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. - - - - - Gets a value indicating whether the Type is a generic Type definition - - - - - Gets a value indicating whether the type is sealed. - - - - - Gets a value indicating whether this type is a static class. - - - - - Get the display name for this typeInfo. - - - - - Get the display name for an oject of this type, constructed with specific arguments - - - - - Returns a Type representing a generic type definition from which this Type can be constructed. - - - - - Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments - - - - - Returns a value indicating whether this type has a method with a specified public attribute - - - - - Returns an array of IMethodInfos for methods of this Type - that match the specified flags. - - - - - Returns a value indicating whether this Type has a public constructor taking the specified argument Types. - - - - - Construct an object of this Type, using the specified arguments. - - - - - An object implementing IXmlNodeBuilder is able to build - an XML representation of itself and any children. - - - - - Returns a TNode representing the current object. - - If true, children are included where applicable - A TNode representing the result - - - - Returns a TNode representing the current object after - adding it as a child of the supplied parent node. - - The parent node. - If true, children are included, where applicable - - - - - The ResultState class represents the outcome of running a test. - It contains two pieces of information. The Status of the test - is an enum indicating whether the test passed, failed, was - skipped or was inconclusive. The Label provides a more - detailed breakdown for use by client runners. - - - - - Initializes a new instance of the class. - - The TestStatus. - - - - Initializes a new instance of the class. - - The TestStatus. - The label. - - - - Initializes a new instance of the class. - - The TestStatus. - The stage at which the result was produced - - - - Initializes a new instance of the class. - - The TestStatus. - The label. - The stage at which the result was produced - - - - The result is inconclusive - - - - - The test has been skipped. - - - - - The test has been ignored. - - - - - The test was skipped because it is explicit - - - - - The test succeeded - - - - - The test failed - - - - - The test encountered an unexpected exception - - - - - The test was cancelled by the user - - - - - The test was not runnable. - - - - - A suite failed because one or more child tests failed or had errors - - - - - A suite failed in its OneTimeSetUp - - - - - A suite had an unexpected exception in its OneTimeSetUp - - - - - A suite had an unexpected exception in its OneTimeDown - - - - - Gets the TestStatus for the test. - - The status. - - - - Gets the label under which this test result is - categorized, if any. - - - - - Gets the stage of test execution in which - the failure or other result took place. - - - - - Get a new ResultState, which is the same as the current - one but with the FailureSite set to the specified value. - - The FailureSite to use - A new ResultState - - - - Determines whether the specified , is equal to this instance. - - The to compare with this instance. - - true if the specified is equal to this instance; otherwise, false. - - - - - Returns a hash code for this instance. - - - A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - - - - - Returns a that represents this instance. - - - A that represents this instance. - - - - - The FailureSite enum indicates the stage of a test - in which an error or failure occurred. - - - - - Failure in the test itself - - - - - Failure in the SetUp method - - - - - Failure in the TearDown method - - - - - Failure of a parent test - - - - - Failure of a child test - - - - - The RunState enum indicates whether a test can be executed. - - - - - The test is not runnable. - - - - - The test is runnable. - - - - - The test can only be run explicitly - - - - - The test has been skipped. This value may - appear on a Test when certain attributes - are used to skip the test. - - - - - The test has been ignored. May appear on - a Test, when the IgnoreAttribute is used. - - - - - The TestStatus enum indicates the result of running a test - - - - - The test was inconclusive - - - - - The test has skipped - - - - - The test succeeded - - - - - The test failed - - - - - TNode represents a single node in the XML representation - of a Test or TestResult. It replaces System.Xml.XmlNode and - System.Xml.Linq.XElement, providing a minimal set of methods - for operating on the XML in a platform-independent manner. - - - - - Constructs a new instance of TNode - - The name of the node - - - - Constructs a new instance of TNode with a value - - The name of the node - The text content of the node - - - - Constructs a new instance of TNode with a value - - The name of the node - The text content of the node - Flag indicating whether to use CDATA when writing the text - - - - Gets the name of the node - - - - - Gets the value of the node - - - - - Gets a flag indicating whether the value should be output using CDATA. - - - - - Gets the dictionary of attributes - - - - - Gets a list of child nodes - - - - - Gets the first ChildNode - - - - - Gets the XML representation of this node. - - - - - Create a TNode from it's XML text representation - - The XML text to be parsed - A TNode - - - - Adds a new element as a child of the current node and returns it. - - The element name. - The newly created child element - - - - Adds a new element with a value as a child of the current node and returns it. - - The element name - The text content of the new element - The newly created child element - - - - Adds a new element with a value as a child of the current node and returns it. - The value will be output using a CDATA section. - - The element name - The text content of the new element - The newly created child element - - - - Adds an attribute with a specified name and value to the XmlNode. - - The name of the attribute. - The value of the attribute. - - - - Finds a single descendant of this node matching an xpath - specification. The format of the specification is - limited to what is needed by NUnit and its tests. - - - - - - - Finds all descendants of this node matching an xpath - specification. The format of the specification is - limited to what is needed by NUnit and its tests. - - - - - Writes the XML representation of the node to an XmlWriter - - - - - - Class used to represent a list of XmlResults - - - - - Class used to represent the attributes of a node - - - - - Gets or sets the value associated with the specified key. - Overridden to return null if attribute is not found. - - The key. - Value of the attribute or null - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for a positive value - - - - - Returns a constraint that tests for a negative value - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the supplied argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable to the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable to the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a superset of the collection supplied as an argument. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. - - - - - Returns a constraint that tests whether the actual value falls - inclusively within a specified range. - - from must be less than or equal to true - Inclusive beginning of the range. Must be less than or equal to to. - Inclusive end of the range. Must be greater than or equal to from. - - - - - When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. - - - - - Executed before each test is run - - The test that is going to be run. - - - - Executed after each test is run - - The test that has just been run. - - - - Provides the target for the action attribute - - The target for the action attribute - - - - The Iz class is a synonym for Is intended for use in VB, - which regards Is as a keyword. - - - - - The List class is a helper class with properties and methods - that supply a number of constraints used with lists and collections. - - - - - List.Map returns a ListMapper, which can be used to map - the original collection to another collection. - - - - - - - ListMapper is used to transform a collection used as an actual argument - producing another collection to be used in the assertion. - - - - - Construct a ListMapper based on a collection - - The collection to be transformed - - - - Produces a collection containing all the _values of a property - - The collection of property _values - - - - - The SpecialValue enum is used to represent TestCase arguments - that cannot be used as arguments to an Attribute. - - - - - Null represents a null value, which cannot be used as an - argument to an attriute under .NET 1.x - - - - - Basic Asserts on strings. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - - - - Asserts that a string is not found within another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - - - - Asserts that a string starts with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string starts with another string. - - The expected string - The string to be examined - - - - Asserts that a string does not start with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not start with another string. - - The expected string - The string to be examined - - - - Asserts that a string ends with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string ends with another string. - - The expected string - The string to be examined - - - - Asserts that a string does not end with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not end with another string. - - The expected string - The string to be examined - - - - Asserts that two strings are equal, without regard to case. - - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that two strings are equal, without regard to case. - - The expected string - The actual string - - - - Asserts that two strings are not equal, without regard to case. - - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that two strings are not equal, without regard to case. - - The expected string - The actual string - - - - Asserts that a string matches an expected regular expression pattern. - - The regex pattern to be matched - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string matches an expected regular expression pattern. - - The regex pattern to be matched - The actual string - - - - Asserts that a string does not match an expected regular expression pattern. - - The regex pattern to be used - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not match an expected regular expression pattern. - - The regex pattern to be used - The actual string - - - - The TestCaseData class represents a set of arguments - and other parameter info to be used for a parameterized - test case. It is derived from TestCaseParameters and adds a - fluent syntax for use in initializing the test case. - - - - - Initializes a new instance of the class. - - The arguments. - - - - Initializes a new instance of the class. - - The argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - The third argument. - - - - Sets the expected result for the test - - The expected result - A modified TestCaseData - - - - Sets the name of the test case - - The modified TestCaseData instance - - - - Sets the description for the test case - being constructed. - - The description. - The modified TestCaseData instance. - - - - Applies a category to the test - - - - - - - Applies a named property to the test - - - - - - - - Applies a named property to the test - - - - - - - - Applies a named property to the test - - - - - - - - Marks the test case as explicit. - - - - - Marks the test case as explicit, specifying the reason. - - - - - Ignores this TestCase, specifying the reason. - - The reason. - - - - - Provide the context information of the current test. - This is an adapter for the internal ExecutionContext - class, hiding the internals from the user test. - - - - - Construct a TestContext for an ExecutionContext - - The ExecutionContext to adapt - - - - Get the current test context. This is created - as needed. The user may save the context for - use within a test, but it should not be used - outside the test for which it is created. - - - - - Gets a TextWriter that will send output to the current test result. - - - - - Get a representation of the current test. - - - - - Gets a Representation of the TestResult for the current test. - - - - - Gets the directory to be used for outputting files created - by this test run. - - - - - Gets the random generator. - - - The random generator. - - - - Write the string representation of a boolean value to the current result - - - Write a char to the current result - - - Write a char array to the current result - - - Write the string representation of a double to the current result - - - Write the string representation of an Int32 value to the current result - - - Write the string representation of an Int64 value to the current result - - - Write the string representation of a decimal value to the current result - - - Write the string representation of an object to the current result - - - Write the string representation of a Single value to the current result - - - Write a string to the current result - - - Write the string representation of a UInt32 value to the current result - - - Write the string representation of a UInt64 value to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a formatted string to the current result - - - Write a line terminator to the current result - - - Write the string representation of a boolean value to the current result followed by a line terminator - - - Write a char to the current result followed by a line terminator - - - Write a char array to the current result followed by a line terminator - - - Write the string representation of a double to the current result followed by a line terminator - - - Write the string representation of an Int32 value to the current result followed by a line terminator - - - Write the string representation of an Int64 value to the current result followed by a line terminator - - - Write the string representation of a decimal value to the current result followed by a line terminator - - - Write the string representation of an object to the current result followed by a line terminator - - - Write the string representation of a Single value to the current result followed by a line terminator - - - Write a string to the current result followed by a line terminator - - - Write the string representation of a UInt32 value to the current result followed by a line terminator - - - Write the string representation of a UInt64 value to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - Write a formatted string to the current result followed by a line terminator - - - - TestAdapter adapts a Test for consumption by - the user test code. - - - - - Construct a TestAdapter for a Test - - The Test to be adapted - - - - Gets the unique Id of a test - - - - - The name of the test, which may or may not be - the same as the method name. - - - - - The name of the method representing the test. - - - - - The FullName of the test - - - - - The ClassName of the test - - - - - The properties of the test. - - - - - ResultAdapter adapts a TestResult for consumption by - the user test code. - - - - - Construct a ResultAdapter for a TestResult - - The TestResult to be adapted - - - - Gets a ResultState representing the outcome of the test. - - - - - Gets the message associated with a test - failure or with not running the test - - - - - Gets any stacktrace associated with an - error or failure. - - - - - Gets the number of test cases that failed - when running the test and all its children. - - - - - Gets the number of test cases that passed - when running the test and all its children. - - - - - Gets the number of test cases that were skipped - when running the test and all its children. - - - - - Gets the number of test cases that were inconclusive - when running the test and all its children. - - - - - The TestFixtureData class represents a set of arguments - and other parameter info to be used for a parameterized - fixture. It is derived from TestFixtureParameters and adds a - fluent syntax for use in initializing the fixture. - - - - - Initializes a new instance of the class. - - The arguments. - - - - Initializes a new instance of the class. - - The argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - The third argument. - - - - Marks the test fixture as explicit. - - - - - Marks the test fixture as explicit, specifying the reason. - - - - - Ignores this TestFixture, specifying the reason. - - The reason. - - - - - Helper class with properties and methods that supply - constraints that operate on exceptions. - - - - - Creates a constraint specifying an expected exception - - - - - Creates a constraint specifying an exception with a given InnerException - - - - - Creates a constraint specifying an expected TargetInvocationException - - - - - Creates a constraint specifying an expected ArgumentException - - - - - Creates a constraint specifying an expected ArgumentNUllException - - - - - Creates a constraint specifying an expected InvalidOperationException - - - - - Creates a constraint specifying that no exception is thrown - - - - - Creates a constraint specifying the exact type of exception expected - - - - - Creates a constraint specifying the exact type of exception expected - - - - - Creates a constraint specifying the type of exception expected - - - - - Creates a constraint specifying the type of exception expected - - - - - Env is a static class that provides some of the features of - System.Environment that are not available under all runtimes - - - - - The newline sequence in the current environment. - - - - - Path to the 'My Documents' folder - - - - - Directory used for file output if not specified on commandline. - - - - - PackageSettings is a static class containing constant values that - are used as keys in setting up a TestPackage. These values are used in - the engine and framework. Setting values may be a string, int or bool. - - - - - Flag (bool) indicating whether tests are being debugged. - - - - - Flag (bool) indicating whether to pause execution of tests to allow - the user to attache a debugger. - - - - - The InternalTraceLevel for this run. Values are: "Default", - "Off", "Error", "Warning", "Info", "Debug", "Verbose". - Default is "Off". "Debug" and "Verbose" are synonyms. - - - - - Full path of the directory to be used for work and result files. - This path is provided to tests by the frameowrk TestContext. - - - - - The name of the config to use in loading a project. - If not specified, the first config found is used. - - - - - Bool indicating whether the engine should determine the private - bin path by examining the paths to all the tests. Defaults to - true unless PrivateBinPath is specified. - - - - - The ApplicationBase to use in loading the tests. If not - specified, and each assembly has its own process, then the - location of the assembly is used. For multiple assemblies - in a single process, the closest common root directory is used. - - - - - Path to the config file to use in running the tests. - - - - - Bool flag indicating whether a debugger should be launched at agent - startup. Used only for debugging NUnit itself. - - - - - Indicates how to load tests across AppDomains. Values are: - "Default", "None", "Single", "Multiple". Default is "Multiple" - if more than one assembly is loaded in a process. Otherwise, - it is "Single". - - - - - The private binpath used to locate assemblies. Directory paths - is separated by a semicolon. It's an error to specify this and - also set AutoBinPath to true. - - - - - The maximum number of test agents permitted to run simultneously. - Ignored if the ProcessModel is not set or defaulted to Multiple. - - - - - Indicates how to allocate assemblies to processes. Values are: - "Default", "Single", "Separate", "Multiple". Default is "Multiple" - for more than one assembly, "Separate" for a single assembly. - - - - - Indicates the desired runtime to use for the tests. Values - are strings like "net-4.5", "mono-4.0", etc. Default is to - use the target framework for which an assembly was built. - - - - - Bool flag indicating that the test should be run in a 32-bit process - on a 64-bit system. By default, NUNit runs in a 64-bit process on - a 64-bit system. Ignored if set on a 32-bit system. - - - - - Indicates that test runners should be disposed after the tests are executed - - - - - Bool flag indicating that the test assemblies should be shadow copied. - Defaults to false. - - - - - Integer value in milliseconds for the default timeout value - for test cases. If not specified, there is no timeout except - as specified by attributes on the tests themselves. - - - - - A TextWriter to which the internal trace will be sent. - - - - - A list of tests to be loaded. - - - - - The number of test threads to run for the assembly. If set to - 1, a single queue is used. If set to 0, tests are executed - directly, without queuing. - - - - - The random seed to be used for this assembly. If specified - as the value reported from a prior run, the framework should - generate identical random values for tests as were used for - that run, provided that no change has been made to the test - assembly. Default is a random value itself. - - - - - If true, execution stops after the first error or failure. - - - - - If true, use of the event queue is suppressed and test events are synchronous. - - - - - A shim of the .NET interface for platforms that do not support it. - Used to indicate that a control can be the target of a callback event on the server. - - - - - Processes a callback event that targets a control. - - - - - - Returns the results of a callback event that targets a control. - - - - - - A shim of the .NET attribute for platforms that do not support it. - - - - From ca87e306289e41b56a3518c7ab6bf709475cde82 Mon Sep 17 00:00:00 2001 From: Cory Todd Date: Thu, 27 Apr 2017 08:18:43 -0700 Subject: [PATCH 20/47] Remove EMGU from imaging lib --- ThermalTalk.Imaging/OpenTK.dll.config | 25 ---------- .../ThermalTalk.Imaging.csproj | 44 ++--------------- ThermalTalk.Imaging/Webcam.cs | 47 ------------------- ThermalTalk.Imaging/packages.config | 7 --- 4 files changed, 4 insertions(+), 119 deletions(-) delete mode 100644 ThermalTalk.Imaging/OpenTK.dll.config delete mode 100644 ThermalTalk.Imaging/Webcam.cs delete mode 100644 ThermalTalk.Imaging/packages.config diff --git a/ThermalTalk.Imaging/OpenTK.dll.config b/ThermalTalk.Imaging/OpenTK.dll.config deleted file mode 100644 index 7098d39..0000000 --- a/ThermalTalk.Imaging/OpenTK.dll.config +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ThermalTalk.Imaging/ThermalTalk.Imaging.csproj b/ThermalTalk.Imaging/ThermalTalk.Imaging.csproj index 2468503..47c689b 100644 --- a/ThermalTalk.Imaging/ThermalTalk.Imaging.csproj +++ b/ThermalTalk.Imaging/ThermalTalk.Imaging.csproj @@ -1,6 +1,5 @@  - Debug @@ -10,9 +9,10 @@ Properties ThermalTalk.Imaging ThermalTalk.Imaging - v4.5 + v4.0 512 - 6611d21a + 95571cb8 + true @@ -22,7 +22,7 @@ DEBUG;TRACE prompt 4 - x64 + AnyCPU true @@ -53,32 +53,11 @@ MinimumRecommendedRules.ruleset - - ..\packages\EmguCV.3.1.0.1\lib\net30\Emgu.CV.UI.dll - True - - - ..\packages\EmguCV.3.1.0.1\lib\net30\Emgu.CV.UI.GL.dll - True - - - ..\packages\EmguCV.3.1.0.1\lib\net30\Emgu.CV.World.dll - True - - - ..\packages\OpenTK.1.1.2225.0\lib\net20\OpenTK.dll - True - - - ..\packages\OpenTK.GLControl.1.1.2225.0\lib\net20\OpenTK.GLControl.dll - True - - @@ -87,10 +66,6 @@ - - ..\packages\ZedGraph.5.1.5\lib\ZedGraph.dll - True - @@ -103,23 +78,12 @@ - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\black_bitmap.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\blue_bitmap.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\gray_atkinson.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\gray_bitmap.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\gray_burkes.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\gray_floydsteinbergs.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\gray_jjn.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\gray_sierra.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\gray_sierra2.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\gray_sierralite.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\gray_stucki.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\green_bitmap.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\logo.bw.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\red_bitmap.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\white_bitmap.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ThermalTalk.Imaging.Test/Resources/black_bitmap.bmp b/ThermalTalk.Imaging.Test/Resources/black_bitmap.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c7c95a042a451c755855d36c70024ddd097b1cb7 GIT binary patch literal 3382 zcmeIxF>c&I429umAcdRw3@lT++L}mjpMgi=F`SNNiX4JP4v~^=fE4asF#l@z7S;%# zIK&8$@MiS=a>xO|bmF?+sy(Bo}^`|qb4JP>1g253;6dJP%!Qcoa3XQqH*Qky-zCl^k#;i&(I0A`6V^%E~9DzikF{=>_ zjzFT&m~{yTM<7vX%(@8%M<7vX%(@E(M<7vX%z6k0M<7vX%z6q2M<7vX%z6n1M<7vX z%z6t3M<7vX%=!ohM<7vX%zeL&>WJIktEi3HG{N8qBnpk$biv>VBnpk$48h6mB4=-`9=T$ literal 0 HcmV?d00001 diff --git a/ThermalTalk.Imaging.Test/Resources/blue_bitmap.bmp b/ThermalTalk.Imaging.Test/Resources/blue_bitmap.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cdf253946dd87be926905950f76e83516ad827b5 GIT binary patch literal 3382 zcmeIxF>c&I429umz(pGS3@lToa!t5T&cLJa7*5ABMGnCthj7W(KnnLUK>w@VTSOy# z;t(T1!kf|a_ooLP1z^hw{{`}5cDeSQ18 zGDm=CtPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0<%d(K~!i%)sG8q zA~6s|bN@@TQ^5~v%H1Bb(JtgkqpqKk_&T`#^6%^Rn|b_!@o!H0)BVtQA-oWu?9s=! z|44j-htb`GVZOEaWFPs~=wtnH=aTChJQwfq-0__QaKEz=Z}RgXGj8VZ@{ym1A_k`` z^36N_aUa6N$%E(O9iBVBm&V^-yvrBa99CCUTi?0nqD5|8bJ3#Oh{*fL+{~*T{Hwj+ z=;y~|RR_6q?N?-<-ml0$I~d)0An@MpW&&SjfcBex=R=p_LyOA$6~5_m;hS!El}A>O z#sBbrg>SkZ#i(PEW*$Msxf2lyhJAGj9jMc3yxz1YdnSKH%WKU(G0PI#9( zZ)&`#di1z+D1MrIC&)anJanDk@vR@>U+o|}QSD##aOk`78-vpot4*i5t4yrCU(@GO z#Ncr~7dxK2+KC@*?m<%ycW1SEH5a*a&ArNw?{0*b0`HmVcIdolQRUfJJ~KFU{Q&S} zT@Stk-?)bC{feqHJ%^(5d9&Zy09}=(hRlZVe*n6y^VRiUWang;8~4YZORj6K=c4jl z&js04UiE&3WzRAPs}8!(ulIti%PY-IeSFU!v2Y~M#{%8$ya)1~PWWy!KL;WP51-pr zUS-_B$rs)H18BVP4ysLh*xBMU2k%Xv2c3U47x-?IS7hIHV)!`(G@JCWsMnYID(@3$E+DXtC1W)^Df%LbI7e$j?pxuR7Oo c?!Rt-02gB3NsRU`>i_@%07*qoM6N<$f&|B&dH?_b literal 0 HcmV?d00001 diff --git a/ThermalTalk.Imaging.Test/Resources/gray_bitmap.bmp b/ThermalTalk.Imaging.Test/Resources/gray_bitmap.bmp new file mode 100644 index 0000000000000000000000000000000000000000..71dd9823ce12552e83be0b7aa9d370b1888cddb9 GIT binary patch literal 3382 zcmeIxA#NQ(494*igOB24q|Bh8pocKXAp%V+6@&*k|F`emqC2bK zdaPM#SKrJ&{dj!PF&^)wZ_K{m-0918f&1&%E8WptNGs(kshOMfNuTuHy+42d*|)#{ zR^|xstQ8uwa>3vTBnpjLgngCmeAG-f>ogCmeAG-ka7gCmeA zG-ka8gCmeAG-iDSgCmeAH0HM7Ms>t>?^V>sY?@$j1QLbDY`S1@1QLbDY=&TP1QLbD z9Oo?4sE$CQ(3s5<430pe(3s5@430pe(3s5;430pe(3ov;&Sh`}5{1TWn_zGR5{1TW zyI^nx5{1TWhhT675{1TWr(kdd5{1TWmtb%N5{1U_j|v7yAW{4NvHS9@BTs2p$F)q3 c<}$(VuXCIUoC%x>oC%x>oC%x>{AUS#0)%4Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0zpYcK~!i%)scaY zq(Bft_y2!-t{J-&v8ZlyMn{qgZveBJ{cHNX{Qf>~*7^bcYhHEzz2EsCID7#7Ehq20 z{RfzTS@O=?7lr@&$$RcU0Al_%>3g=@f05%~Iew?k3qUjcq_THvzQXDiKY9Ef#M_UM z<0net$~5}=NZIbHELgL4TfrRC zzPfC8RTdmhyZ~edD_6=kS7jBqTLN`Rxw>p~RW{)Hu@m=>p{sW6?dmbqhxT~mxaydz zE?E3nWbDNKUCiEYA41B!(c}Cs7C-j@i?h2JET`0kY?<&T|Zx5!J(>Ghh{pcu`N1{SsmhR)T_^S{d_sgklTc+ zULBh0pvJc7w6Qt_c6qq=qb|$BmD~9;*m*F-zq2l!IW&{GO}pbmP;eiuTsg#9)kE3F zW$MIfxH6P+wq=G!8|TpMrrq%&sFyqD-|Ud3eCc8uMb%+_tIykesvg@2{21%cfm0cIoEbAcm3^O}4*d2$^h}p9&e1=1s z&FtFM4>@LsT$gPi?j47!zPWz@%9!1;y5msB*;c!D`FMsy8K2oX4r#V^pU*!|k^C!! SXWIt=0000!lvI6;>1s;*b3=DjSL74G){)!Z!;0I3^$B+!?tNo08hZF=@e*gDZei5kcHS<_h zyRVt^iPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0*^^VK~!i%)sKOW z<1i3H`~N@PGq4N}E0@f&pBqkHPcHzsK{NIsAe7kG{>HL!kLxb$&kq&{7rL z%>&%y`w3OQ#ZNs3;O?IH^oQg29$0=Zz#Tnr%j?mdJV@R6>M{9CzuFCr;YVbD8`LrF{mj4y}rca&b?p1;H$AZ}CKV`+ zB(GZa}(+140f8?I*WYDWS;6Cj{>xV?f2T%13xc5!hR~urR zvUqu*xhl}Dd$PMBzDc{8zYk)AmnWKo11de}diB7&q#*e!EBf;o=vY0eva|u(RUTA1(2Rb3 s$H%<8+&5IPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0>DW`K~!i%)sKsA zV=)jy^Z!4cHLXc8X8h=Gq|K2=VBki|qw)Okdptjx;ScnG^l3g1{&y8WmcX;$Y~H0n zvv%_^Wz=2&F7*ubJbwiG;N^*C-oHx$JWt;9z&-GeXy*ODP|tw*?O;;Rz;5@Oo_KG* zEG7>;*S9K2{-pQqYS%88uAYJ2?$(p4FE&4eq(HM(4{m!^&p_3S-wwVMRQ;`21*uCr zpzppL1JcXMgXB*#&65Y3Q&+xSE=kqzJV@txC!Tor zH(k5o@$%%RR|W2Qd{dJLyRK^tU&lA`{G{`ZD)0ZCS>yN6w+Ekt-pLCT0$?K26OR#VedXRkDt~$_s{Smn7iD#;nPYS9`ZZ48{U1h*~uVWpE?a8j)6ui9RJJ(&7Jg7FRAnic& pd90@y{fUC)RlQGL((ijb{{Y+l(p7lXKb!yn002ovPDHLkV1h9soU8x< literal 0 HcmV?d00001 diff --git a/ThermalTalk.Imaging.Test/Resources/gray_sierra2.bmp b/ThermalTalk.Imaging.Test/Resources/gray_sierra2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..34cc7fc4c391a7315edbd49dfd7b9408af2b66a6 GIT binary patch literal 633 zcmV-<0*3vGP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0uD(;K~!i%)sc&C z!!Qg3`~N@PiHO-Kj$U@0wK+iGnXsF^d z>iS;0)zNhV)tyUlhlAPoNXOF)KjEZz8GlK>?a07Om%i#C@Y1D2g6e+78{PLV<1be@ zb7aq?gTPCdnvHp-i|*(QymaX{2mQ`UVC`hi7eMCK4n%J4bXpEnA78%PLBG=ptex`n zMerZavz3+u-M5S%-Q}e3tQ~+`cV+wsgg$Z?SdR3ZneDr@FW=$B^2)xy+q(E6$h^|& ze$o!UhM!}-x+n1x#a$6wSyVw zx#-8ou7bp_u9Ty>r+4s@>*R9$9&e8oxCdA4%UHvzMb9Q7zc)n)d_ zvkokeIxA;fW-CDEUgtT}>Z}Br_npkX7!lvI6;>1s;*b3=DjSL74G){)!Z!;0;d~$B+!?s}}>gnhgXP0^iraG`V!wY~$)P z?bAFHDl_LaTw1$++mD>wtEROMe3L4Jf2?v<;|P<=lyE(zm*D3eYUHr?)zpZnSUO$mcKomywYMzm-A{Y#9YHa zO(8N-M;C^o66Yl99JTn?KDvNP1f=uqR}gIvE6hM8Rv5R%f4F&z+xD+Mdrj~HFQ6Y8 NJYD@<);T3K0RUG^hJyeA literal 0 HcmV?d00001 diff --git a/ThermalTalk.Imaging.Test/Resources/gray_stucki.bmp b/ThermalTalk.Imaging.Test/Resources/gray_stucki.bmp new file mode 100644 index 0000000000000000000000000000000000000000..74f66de93405affa8fbe1c6be7c3c715132c950d GIT binary patch literal 483 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!h6+y?$B+!?tNj<(9X8-_{{G+oZnwL~LUAFZ zT&|5Nvh2J0YbUNd{CAh%w4aUN+?PN7T_H6)m(e!=s>Y$&HPfxKodUNvPf|SfEV0e$ z{kGX!w}npKDHFV8{^}uS79@5 zu9-AP>T67IN}aB)2C#Z}oe479w9>SCt6Objh*U|YONWw!hI zVVHdTJ9;X3)VFc6~d`El2oa$-+P|1!=BasG5(yjBqyF$|ur KelF{r5}E)XW6f^> literal 0 HcmV?d00001 diff --git a/ThermalTalk.Imaging.Test/Resources/green_bitmap.bmp b/ThermalTalk.Imaging.Test/Resources/green_bitmap.bmp new file mode 100644 index 0000000000000000000000000000000000000000..df59e41abc2c34414a2332b7e52f13c4c3bdd9dc GIT binary patch literal 3382 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 bxlFM8?;K|WX98yeX98yeX98ye|5*Z`Ouh$) literal 0 HcmV?d00001 diff --git a/ThermalTalk.Imaging.Test/Resources/white_bitmap.bmp b/ThermalTalk.Imaging.Test/Resources/white_bitmap.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d54feea396896faaf4cbb241d67e73e7589e2360 GIT binary patch literal 3382 zcmeIxA#NT)42Iz^Qb0*^2E)LjU@JU1gOB24B+Rg&hcL(?0!=FwlovQ}_Wy5@oz=4* zYgXFTH?vRAk9Ru8n0c+fkdG(>n<1^fkdG(>me8%fkdG(>nRum?W*fkdG( z>n#`@fkdG(>mwK(fkdG(*ZnrCBQATdqBdsJ1cM`xC^Tl%1%o4yC^Tj>1cM`xC^Y6c zXPHKI1QLbDY?fef1QLbDY_?!<1QLbDY>r@X1QLbDY>RU)gCmeAG-lfbgCmeAG-lfc zgCmeAG-f*lgCmeAG-f*mgCmeAG-kU5gCmeAG=_gvFgOB<+JFCdUte_ODedaGmdVk4 YO>mAgfir..\packages\NUnit.3.6.1\lib\net40\nunit.framework.dll True + + + + + + + + + + + True + True + Resources.resx + @@ -72,6 +86,57 @@ + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +