From e65c0eed259fbf1fb89230e60d4f9d0eb63b80d3 Mon Sep 17 00:00:00 2001 From: Derek Heiser Date: Sat, 9 Feb 2013 10:17:47 -0600 Subject: [PATCH] S7.NET Testability Updates Removed the Controls project and existing Test projects. Added new Test project and references to NUnit and Should projects for testing. Extracted IPlc interface to help test projects that reference this library. Also implemented the IDisposable interface on the Plc object so that references to mSocket would be cleaned up appropriately when the object is blown away. --- S7.Net.Test/Properties/AssemblyInfo.cs | 36 + S7.Net.Test/S7.Net.Test.csproj | 61 + S7.Net.Test/packages.config | 5 + S7.Net/Conversion.cs | 167 + S7.Net/Enums.cs | 54 + S7.Net/Interfaces/IPLC.cs | 26 + S7.Net/PLC.cs | 777 ++ S7.Net/Properties/AssemblyInfo.cs | 36 + S7.Net/S7.Net.csproj | 106 + S7.Net/Types/Boolean.cs | 28 + S7.Net/Types/Byte.cs | 24 + S7.Net/Types/ByteArray.cs | 42 + S7.Net/Types/Counter.cs | 63 + S7.Net/Types/DInt.cs | 73 + S7.Net/Types/DWord.cs | 61 + S7.Net/Types/Double.cs | 169 + S7.Net/Types/Int.cs | 76 + S7.Net/Types/String.cs | 38 + S7.Net/Types/Struct.cs | 204 + S7.Net/Types/Timer.cs | 76 + S7.Net/Types/Word.cs | 63 + S7.sln | 26 + packages/NUnit.2.6.2/NUnit.2.6.2.nupkg | Bin 0 -> 94702 bytes packages/NUnit.2.6.2/NUnit.2.6.2.nuspec | 30 + packages/NUnit.2.6.2/lib/nunit.framework.dll | Bin 0 -> 147456 bytes packages/NUnit.2.6.2/lib/nunit.framework.xml | 10899 ++++++++++++++++ packages/NUnit.2.6.2/license.txt | 15 + .../Should.1.1.12.0/Should.1.1.12.0.nupkg | Bin 0 -> 16895 bytes .../Should.1.1.12.0/Should.1.1.12.0.nuspec | 16 + packages/Should.1.1.12.0/lib/Should.dll | Bin 0 -> 26624 bytes packages/repositories.config | 4 + 31 files changed, 13175 insertions(+) create mode 100644 S7.Net.Test/Properties/AssemblyInfo.cs create mode 100644 S7.Net.Test/S7.Net.Test.csproj create mode 100644 S7.Net.Test/packages.config create mode 100644 S7.Net/Conversion.cs create mode 100644 S7.Net/Enums.cs create mode 100644 S7.Net/Interfaces/IPLC.cs create mode 100644 S7.Net/PLC.cs create mode 100644 S7.Net/Properties/AssemblyInfo.cs create mode 100644 S7.Net/S7.Net.csproj create mode 100644 S7.Net/Types/Boolean.cs create mode 100644 S7.Net/Types/Byte.cs create mode 100644 S7.Net/Types/ByteArray.cs create mode 100644 S7.Net/Types/Counter.cs create mode 100644 S7.Net/Types/DInt.cs create mode 100644 S7.Net/Types/DWord.cs create mode 100644 S7.Net/Types/Double.cs create mode 100644 S7.Net/Types/Int.cs create mode 100644 S7.Net/Types/String.cs create mode 100644 S7.Net/Types/Struct.cs create mode 100644 S7.Net/Types/Timer.cs create mode 100644 S7.Net/Types/Word.cs create mode 100644 S7.sln create mode 100644 packages/NUnit.2.6.2/NUnit.2.6.2.nupkg create mode 100644 packages/NUnit.2.6.2/NUnit.2.6.2.nuspec create mode 100644 packages/NUnit.2.6.2/lib/nunit.framework.dll create mode 100644 packages/NUnit.2.6.2/lib/nunit.framework.xml create mode 100644 packages/NUnit.2.6.2/license.txt create mode 100644 packages/Should.1.1.12.0/Should.1.1.12.0.nupkg create mode 100644 packages/Should.1.1.12.0/Should.1.1.12.0.nuspec create mode 100644 packages/Should.1.1.12.0/lib/Should.dll create mode 100644 packages/repositories.config diff --git a/S7.Net.Test/Properties/AssemblyInfo.cs b/S7.Net.Test/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..59df8bc --- /dev/null +++ b/S7.Net.Test/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("S7.Net.Test")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("S7.Net.Test")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[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("14c9af75-ff21-41a3-9b55-32b081e948f3")] + +// 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/S7.Net.Test/S7.Net.Test.csproj b/S7.Net.Test/S7.Net.Test.csproj new file mode 100644 index 0000000..466ab82 --- /dev/null +++ b/S7.Net.Test/S7.Net.Test.csproj @@ -0,0 +1,61 @@ + + + + + Debug + AnyCPU + {D34F7AF6-19DA-4AE6-9BB0-6666970F6838} + Library + Properties + S7.Net.Test + S7.Net.Test + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\NUnit.2.6.2\lib\nunit.framework.dll + + + ..\packages\Should.1.1.12.0\lib\Should.dll + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/S7.Net.Test/packages.config b/S7.Net.Test/packages.config new file mode 100644 index 0000000..32415d8 --- /dev/null +++ b/S7.Net.Test/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/S7.Net/Conversion.cs b/S7.Net/Conversion.cs new file mode 100644 index 0000000..6978323 --- /dev/null +++ b/S7.Net/Conversion.cs @@ -0,0 +1,167 @@ +using System; +using System.Linq; + +namespace S7 +{ + public static class Conversion + { + public static int BinStringToInt32(this string txt) + { + int cnt = 0; + int ret = 0; + + for (cnt = txt.Length - 1; cnt >= 0; cnt += -1) + { + if (int.Parse(txt.Substring(cnt, 1)) == 1) + { + ret += (int)(Math.Pow(2, (txt.Length - 1 - cnt))); + } + } + return ret; + } + + public static byte? BinStringToByte(this string txt) + { + int cnt = 0; + int ret = 0; + + if (txt.Length == 8) + { + for (cnt = 7; cnt >= 0; cnt += -1) + { + if (int.Parse(txt.Substring(cnt, 1)) == 1) + { + ret += (int)(Math.Pow(2, (txt.Length - 1 - cnt))); + } + } + return (byte)ret; + } + return null; + } + + public static string ValToBinString(this object value) + { + int cnt = 0; + int cnt2 = 0; + int x = 0; + string txt = ""; + long longValue = 0; + + try + { + if (value.GetType().Name.IndexOf("[]") < 0) + { + // ist nur ein Wert + switch (value.GetType().Name) + { + case "Byte": + x = 7; + longValue = (long)((byte)value); + break; + case "Int16": + x = 15; + longValue = (long)((Int16)value); + break; + case "Int32": + x = 31; + longValue = (long)((Int32)value); + break; + case "Int64": + x = 63; + longValue = (long)((Int64)value); + break; + default: + throw new Exception(); + } + + for (cnt = x; cnt >= 0; cnt += -1) + { + if (((Int64)longValue & (Int64)Math.Pow(2, cnt)) > 0) + txt += "1"; + else + txt += "0"; + } + } + else + { + // ist ein Array + switch (value.GetType().Name) + { + case "Byte[]": + x = 7; + byte[] ByteArr = (byte[])value; + for (cnt2 = 0; cnt2 <= ByteArr.Length - 1; cnt2++) + { + for (cnt = x; cnt >= 0; cnt += -1) + if ((ByteArr[cnt2] & (byte)Math.Pow(2, cnt)) > 0) txt += "1"; else txt += "0"; + } + break; + case "Int16[]": + x = 15; + Int16[] Int16Arr = (Int16[])value; + for (cnt2 = 0; cnt2 <= Int16Arr.Length - 1; cnt2++) + { + for (cnt = x; cnt >= 0; cnt += -1) + if ((Int16Arr[cnt2] & (byte)Math.Pow(2, cnt)) > 0) txt += "1"; else txt += "0"; + } + break; + case "Int32[]": + x = 31; + Int32[] Int32Arr = (Int32[])value; + for (cnt2 = 0; cnt2 <= Int32Arr.Length - 1; cnt2++) + { + for (cnt = x; cnt >= 0; cnt += -1) + if ((Int32Arr[cnt2] & (byte)Math.Pow(2, cnt)) > 0) txt += "1"; else txt += "0"; + } + break; + case "Int64[]": + x = 63; + byte[] Int64Arr = (byte[])value; + for (cnt2 = 0; cnt2 <= Int64Arr.Length - 1; cnt2++) + { + for (cnt = x; cnt >= 0; cnt += -1) + if ((Int64Arr[cnt2] & (byte)Math.Pow(2, cnt)) > 0) txt += "1"; else txt += "0"; + } + break; + default: + throw new Exception(); + } + } + return txt; + } + catch + { + return ""; + } + } + + public static int ByteToInt16(this byte[] data, int offset) + { + byte[] bytes = data.Skip(offset).Take(2).ToArray(); + Array.Reverse(bytes); + return BitConverter.ToInt16(bytes, 0); + } + + public static int ByteToInt32(this byte[] data, int offset) + { + byte[] bytes = data.Skip(offset).Take(4).ToArray(); + Array.Reverse(bytes); + return BitConverter.ToInt32(bytes, 0); + } + + public static float ByteToFloat(this byte[] data, int offset) + { + byte[] bytes = data.Skip(offset).Take(4).ToArray(); + Array.Reverse(bytes); + return BitConverter.ToSingle(bytes, 0); + } + + public static bool SelectBit(this byte data, int bitPosition) + { + int mask = 1 << bitPosition; + int result = data & mask; + + return (result != 0); + } + } +} diff --git a/S7.Net/Enums.cs b/S7.Net/Enums.cs new file mode 100644 index 0000000..fecbc2b --- /dev/null +++ b/S7.Net/Enums.cs @@ -0,0 +1,54 @@ +namespace S7 +{ + #region CPU_Type + public enum CPU_Type + { + S7200 = 0, + S7300 = 10, + S7400 = 20 + } + #endregion + #region Error Codes + public enum ErrorCode + { + NoError = 0, + WrongCPU_Type = 1, + ConnectionError = 2, + IPAdressNotAvailable, + + WrongVarFormat = 10, + WrongNumberReceivedBytes = 11, + + SendData = 20, + ReadData = 30, + + WriteData = 50 + } + #endregion + #region DataType + public enum DataType + { + Input = 129, + Output = 130, + Marker = 131, + DataBlock = 132, + Timer = 29, + Counter = 28 + } + #endregion + #region VarType + public enum VarType + { + Bit, + Byte, + Word, + DWord, + Int, + DInt, + Real, + String, + Timer, + Counter + } + #endregion +} diff --git a/S7.Net/Interfaces/IPLC.cs b/S7.Net/Interfaces/IPLC.cs new file mode 100644 index 0000000..d406bed --- /dev/null +++ b/S7.Net/Interfaces/IPLC.cs @@ -0,0 +1,26 @@ +using System; + +namespace S7 +{ + public interface IPlc : IDisposable + { + string IP { get; set; } + bool IsConnected { get; } + CPU_Type CPU { get; set; } + Int16 Rack { get; set; } + Int16 Slot { get; set; } + string Name { get; set; } + object Tag { get; set; } + bool IsAvailable { get; } + ErrorCode Open(); + void Close(); + byte[] ReadBytes(DataType DataType, int DB, int StartByteAdr, int count); + object Read(DataType DataType, int DB, int StartByteAdr, VarType VarType, int VarCount); + object Read(string variable); + object ReadStruct(Type structType, int DB); + ErrorCode WriteBytes(DataType DataType, int DB, int StartByteAdr, byte[] value); + object Write(DataType DataType, int DB, int StartByteAdr, object value); + object Write(string variable, object value); + ErrorCode WriteStruct(object structValue, int DB); + } +} \ No newline at end of file diff --git a/S7.Net/PLC.cs b/S7.Net/PLC.cs new file mode 100644 index 0000000..80d5970 --- /dev/null +++ b/S7.Net/PLC.cs @@ -0,0 +1,777 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Net.NetworkInformation; + +namespace S7 +{ + public class Plc : IPlc + { + // public properties + public string IP + { get; set; } + + public CPU_Type CPU + { get; set; } + + public Int16 Rack + { get; set; } + + public Int16 Slot + { get; set; } + + public string Name + { get; set; } + + public object Tag + { get; set; } + + public bool IsAvailable + { + get + { + Ping ping = new Ping(); + PingReply result = ping.Send(IP); + if (result.Status == IPStatus.Success) + return true; + else + return false; + } + } + + public bool IsConnected { get; private set; } + + public ErrorCode lastErrorCode = 0; + public string lastErrorString; + + public int LastReadTime = 0; + public int LastWriteTime = 0; + + private Socket mSocket; + + public Plc() : this(CPU_Type.S7400, "localhost", 0, 2) { } + + public Plc(CPU_Type cpu, string ip, Int16 rack, Int16 slot, string name = "", object tag = null) + { + IsConnected = false; + IP = ip; + CPU = cpu; + Rack = rack; + Slot = slot; + Name = name; + Tag = tag; + } + + #region Connection (Open, Close) + public ErrorCode Open() + { + byte[] bReceive = new byte[256]; + + try { + // check if available + Ping p = new Ping(); + PingReply pingReplay = p.Send(IP); + if (pingReplay.Status != IPStatus.Success) + throw new Exception(); + } + catch + { + lastErrorCode = ErrorCode.IPAdressNotAvailable; + lastErrorString = "Destination IP-Address '" + IP + "' is not available!"; + return lastErrorCode; + } + + try { + // open the channel + mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + + mSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000); + mSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 1000); + + IPEndPoint _server = new IPEndPoint(new IPAddress(IPToByteArray(IP)), 102); + mSocket.Connect(_server); + } + catch (Exception ex) { + lastErrorCode = ErrorCode.ConnectionError; + lastErrorString = ex.Message; + return ErrorCode.ConnectionError; + } + + try { + byte[] bSend1 = { 3, 0, 0, 22, 17, 224, 0, 0, 0, 46, + 0, 193, 2, 1, 0, 194, 2, 3, 0, 192, + 1, 9 }; + switch (CPU) { + case CPU_Type.S7200: + //S7200: Chr(193) & Chr(2) & Chr(16) & Chr(0) 'Eigener Tsap + bSend1[11] = 193; + bSend1[12] = 2; + bSend1[13] = 16; + bSend1[14] = 0; + //S7200: Chr(194) & Chr(2) & Chr(16) & Chr(0) 'Fremder Tsap + bSend1[15] = 194; + bSend1[16] = 2; + bSend1[17] = 16; + bSend1[18] = 0; + break; + case CPU_Type.S7300: + //S7300: Chr(193) & Chr(2) & Chr(1) & Chr(0) 'Eigener Tsap + bSend1[11] = 193; + bSend1[12] = 2; + bSend1[13] = 1; + bSend1[14] = 0; + //S7300: Chr(194) & Chr(2) & Chr(3) & Chr(2) 'Fremder Tsap + bSend1[15] = 194; + bSend1[16] = 2; + bSend1[17] = 3; + bSend1[18] = (byte)(Rack * 2 * 16 + Slot); + break; + case CPU_Type.S7400: + //S7400: Chr(193) & Chr(2) & Chr(1) & Chr(0) 'Eigener Tsap + bSend1[11] = 193; + bSend1[12] = 2; + bSend1[13] = 1; + bSend1[14] = 0; + //S7400: Chr(194) & Chr(2) & Chr(3) & Chr(3) 'Fremder Tsap + bSend1[15] = 194; + bSend1[16] = 2; + bSend1[17] = 3; + bSend1[18] = (byte)(Rack * 2 * 16 + Slot); + break; + default: + return ErrorCode.WrongCPU_Type; + } + mSocket.Send(bSend1, 22, SocketFlags.None); + + if (mSocket.Receive(bReceive, 22, SocketFlags.None) != 22) throw new Exception(ErrorCode.WrongNumberReceivedBytes.ToString()); + + byte[] bsend2 = { 3, 0, 0, 25, 2, 240, 128, 50, 1, 0, + 0, 255, 255, 0, 8, 0, 0, 240, 0, 0, + 3, 0, 3, 1, 0 }; + mSocket.Send(bsend2, 25, SocketFlags.None); + + if (mSocket.Receive(bReceive, 27, SocketFlags.None) != 27) throw new Exception(ErrorCode.WrongNumberReceivedBytes.ToString()); + IsConnected = true; + } + catch + { + lastErrorCode = ErrorCode.ConnectionError; + lastErrorString = "Couldn't establish the connection!"; + IsConnected = false; + return ErrorCode.ConnectionError; + } + + return ErrorCode.NoError; + // ok + } + + public void Close() + { + if (mSocket != null && mSocket.Connected) { + mSocket.Close(); + IsConnected = false; + } + } + + private byte[] IPToByteArray(string ip) + { + byte[] v = new byte[4]; + string txt = ip; + string txt2 = null; + try + { + txt2 = txt.Substring(0, txt.IndexOf(".")); + v[0] = byte.Parse(txt2); + txt = txt.Substring(txt2.Length + 1); + + txt2 = txt.Substring(0, txt.IndexOf(".")); + v[1] = byte.Parse(txt2); + txt = txt.Substring(txt2.Length + 1); + + txt2 = txt.Substring(0, txt.IndexOf(".")); + v[2] = byte.Parse(txt2); + txt = txt.Substring(txt2.Length + 1); + + v[3] = byte.Parse(txt); + return v; + } + catch + { + v[0] = 0; + v[1] = 0; + v[2] = 0; + v[3] = 0; + return v; + } + } + #endregion + + #region ReadBytes(DataType DataType, int DB, int StartByteAdr, int count) + public byte[] ReadBytes(DataType DataType, int DB, int StartByteAdr, int count) + { + byte[] bytes = new byte[count]; + + try + { + // first create the header + int packageSize = 31; + Types.ByteArray package = new Types.ByteArray(packageSize); + + package.Add(new byte[] { 0x03, 0x00, 0x00 }); + package.Add((byte)packageSize); + package.Add(new byte[] { 0x02, 0xf0, 0x80, 0x32, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x01, 0x12, + 0x0a, 0x10}); + // package.Add(0x02); // datenart + switch (DataType) + { + case DataType.Timer: + case DataType.Counter: + package.Add((byte)DataType); + break; + default: + package.Add(0x02); + break; + } + + package.Add(Types.Word.ToByteArray((ushort)(count))); + package.Add(Types.Word.ToByteArray((ushort)(DB))); + package.Add((byte)DataType); + package.Add((byte)0); + switch (DataType) + { + case DataType.Timer: + case DataType.Counter: + package.Add(Types.Word.ToByteArray((ushort)(StartByteAdr))); + break; + default: + package.Add(Types.Word.ToByteArray((ushort)((StartByteAdr) * 8))); + break; + } + + mSocket.Send(package.array, package.array.Length, SocketFlags.None); + + byte[] bReceive = new byte[512]; + int numReceived = mSocket.Receive(bReceive, 512, SocketFlags.None); + if (bReceive[21] != 0xff) throw new Exception(ErrorCode.WrongNumberReceivedBytes.ToString()); + + for (int cnt = 0; cnt < count; cnt++) + bytes[cnt] = bReceive[cnt + 25]; + + return bytes; + } + catch + { + lastErrorCode = ErrorCode.WriteData; + lastErrorString = ""; + return null; + } + } + #endregion + #region Read(DataType DataType, int DB, int StartByteAdr, VarType VarType, int VarCount) + public object Read(DataType DataType, int DB, int StartByteAdr, VarType VarType, int VarCount) + { + byte[] bytes = null; + int cntBytes = 0; + + switch (VarType) + { + case VarType.Byte: + cntBytes = VarCount; + if (cntBytes < 1) cntBytes = 1; + bytes = ReadBytes(DataType, DB, StartByteAdr, cntBytes); + if (bytes == null) return null; + if (VarCount == 1) + return bytes[0]; + else + return bytes; + case VarType.Word: + cntBytes = VarCount * 2; + bytes = ReadBytes(DataType, DB, StartByteAdr, cntBytes); + if (bytes == null) return null; + + if (VarCount == 1) + return Types.Word.FromByteArray(bytes); + else + return Types.Word.ToArray(bytes); + case VarType.Int: + cntBytes = VarCount * 2; + bytes = ReadBytes(DataType, DB, StartByteAdr, cntBytes); + if (bytes == null) return null; + + if (VarCount == 1) + return Types.Int.FromByteArray(bytes); + else + return Types.Int.ToArray(bytes); + case VarType.DWord: + cntBytes = VarCount * 4; + bytes = ReadBytes(DataType, DB, StartByteAdr, cntBytes); + if (bytes == null) return null; + + if (VarCount == 1) + return Types.DWord.FromByteArray(bytes); + else + return Types.DWord.ToArray(bytes); + case VarType.DInt: + cntBytes = VarCount * 4; + bytes = ReadBytes(DataType, DB, StartByteAdr, cntBytes); + if (bytes == null) return null; + + if (VarCount == 1) + return Types.DInt.FromByteArray(bytes); + else + return Types.DInt.ToArray(bytes); + case VarType.Real: + cntBytes = VarCount * 4; + bytes = ReadBytes(DataType, DB, StartByteAdr, cntBytes); + if (bytes == null) return null; + + if (VarCount == 1) + return Types.Double.FromByteArray(bytes); + else + return Types.Double.ToArray(bytes); + case VarType.String: + cntBytes = VarCount; + bytes = ReadBytes(DataType, DB, StartByteAdr, cntBytes); + if (bytes == null) return null; + + return Types.String.FromByteArray(bytes); + case VarType.Timer: + cntBytes = VarCount * 2; + bytes = ReadBytes(DataType, DB, StartByteAdr, cntBytes); + if (bytes == null) return null; + + if (VarCount == 1) + return Types.Timer.FromByteArray(bytes); + else + return Types.Timer.ToArray(bytes); + case VarType.Counter: + cntBytes = VarCount * 2; + bytes = ReadBytes(DataType, DB, StartByteAdr, cntBytes); + if (bytes == null) return null; + + if (VarCount == 1) + return Types.Counter.FromByteArray(bytes); + else + return Types.Counter.ToArray(bytes); + default: + return null; + } + return null; + } + #endregion + #region Read(string variable) + public object Read(string variable) + { + DataType mDataType; + int mDB; + int mByte; + int mBit; + + byte objByte; + UInt16 objUInt16; + UInt32 objUInt32; + double objDouble; + bool[] objBoolArray; + + string txt = variable.ToUpper(); + txt = txt.Replace(" ", ""); // remove spaces + + try + { + switch (txt.Substring(0, 2)) + { + case "DB": + string[] strings = txt.Split(new char[] { '.' }); + if (strings.Length < 2) + throw new Exception(); + + mDB = int.Parse(strings[0].Substring(2)); + mDataType = DataType.DataBlock; + string dbType = strings[1].Substring(0, 3); + int dbIndex = int.Parse(strings[1].Substring(3)); + + switch (dbType) + { + case "DBB": + byte obj = (byte)Read(DataType.DataBlock, mDB, dbIndex, VarType.Byte, 1); + return obj; + case "DBW": + UInt16 objI = (UInt16)Read(DataType.DataBlock, mDB, dbIndex, VarType.Word, 1); + return objI; + case "DBD": + UInt32 objU = (UInt32)Read(DataType.DataBlock, mDB, dbIndex, VarType.DWord, 1); + return objU; + case "DBX": + mByte = dbIndex; + mBit = int.Parse(strings[2]); + if (mBit > 7) throw new Exception(); + objBoolArray = (bool[])Read(DataType.DataBlock, mDB, mByte, VarType.Bit, 1); + return objBoolArray[mBit]; + default: + throw new Exception(); + } + case "EB": + // Eingangsbyte + objByte = (byte)Read(DataType.Input, 0, int.Parse(txt.Substring(2)), VarType.Byte, 1); + return objByte; + case "EW": + // Eingangswort + objUInt16 = (UInt16)Read(DataType.Input, 0, int.Parse(txt.Substring(2)), VarType.Word, 1); + return objUInt16; + case "ED": + // Eingangsdoppelwort + objUInt32 = (UInt32)Read(DataType.Input, 0, int.Parse(txt.Substring(2)), VarType.DWord, 1); + return objUInt32; + case "AB": + // Ausgangsbyte + objByte = (byte)Read(DataType.Output, 0, int.Parse(txt.Substring(2)), VarType.Byte, 1); + return objByte; + case "AW": + // Ausgangswort + objUInt16 = (UInt16)Read(DataType.Output, 0, int.Parse(txt.Substring(2)), VarType.Word, 1); + return objUInt16; + case "AD": + // Ausgangsdoppelwort + objUInt32 = (UInt32)Read(DataType.Output, 0, int.Parse(txt.Substring(2)), VarType.DWord, 1); + return objUInt32; + case "MB": + // Merkerbyte + objByte = (byte)Read(DataType.Marker, 0, int.Parse(txt.Substring(2)), VarType.Byte, 1); + return objByte; + case "MW": + // Merkerwort + objUInt16 = (UInt16)Read(DataType.Marker, 0, int.Parse(txt.Substring(2)), VarType.Word, 1); + return objUInt16; + case "MD": + // Merkerdoppelwort + objUInt32 = (UInt32)Read(DataType.Marker, 0, int.Parse(txt.Substring(2)), VarType.DWord, 1); + return objUInt32; + default: + switch (txt.Substring(0, 1)) + { + case "E": + case "I": + // Eingang + mDataType = DataType.Input; + break; + case "A": + case "O": + // Ausgang + mDataType = DataType.Output; + break; + case "M": + // Merker + mDataType = DataType.Marker; + break; + case "T": + // Timer + objDouble = (double)Read(DataType.Timer, 0, int.Parse(txt.Substring(1)), VarType.Timer, 1); + return objDouble; + case "Z": + case "C": + // Counter + objUInt16 = (UInt16)Read(DataType.Counter, 0, int.Parse(txt.Substring(1)), VarType.Counter, 1); + return objUInt16; + default: + throw new Exception(); + } + + string txt2 = txt.Substring(1); + if (txt2.IndexOf(".") == -1) throw new Exception(); + + mByte = int.Parse(txt2.Substring(0, txt2.IndexOf("."))); + mBit = int.Parse(txt2.Substring(txt2.IndexOf(".") + 1)); + if (mBit > 7) throw new Exception(); + objBoolArray = (bool[])Read(mDataType, 0, mByte, VarType.Bit, 1); + return objBoolArray[mBit]; + } + } + catch + { + lastErrorCode = ErrorCode.WrongVarFormat; + lastErrorString = "Die Variable '" + variable + "' konnte nicht entschlüsselt werden!"; + return lastErrorCode; + } + } + #endregion + #region ReadStruct(Type structType, int DB) + public object ReadStruct(Type structType, int DB) + { + double numBytes = Types.Struct.GetStructSize(structType); + // now read the package + byte[] bytes = (byte[])Read(DataType.DataBlock, DB, 0, VarType.Byte, (int)numBytes); + // and decode it + return Types.Struct.FromBytes(structType, bytes); + } + #endregion + + #region WriteBytes(DataType DataType, int DB, int StartByteAdr, byte[] value) + public ErrorCode WriteBytes(DataType DataType, int DB, int StartByteAdr, byte[] value) + { + byte[] bReceive = new byte[513]; + int varCount = 0; + + try + { + varCount = value.Length; + // first create the header + int packageSize = 35 + value.Length; + Types.ByteArray package = new Types.ByteArray(packageSize); + + package.Add(new byte[] { 3, 0, 0 }); + package.Add((byte)packageSize); + package.Add(new byte[] { 2, 0xf0, 0x80, 0x32, 1, 0, 0 }); + package.Add(Types.Word.ToByteArray((ushort)(varCount - 1))); + package.Add(new byte[] { 0, 0x0e }); + package.Add(Types.Word.ToByteArray((ushort)(varCount + 4))); + package.Add(new byte[] { 0x05, 0x01, 0x12, 0x0a, 0x10, 0x02 }); + package.Add(Types.Word.ToByteArray((ushort)varCount)); + package.Add(Types.Word.ToByteArray((ushort)(DB))); + package.Add((byte)DataType); + package.Add((byte)0); + package.Add(Types.Word.ToByteArray((ushort)(StartByteAdr * 8))); + package.Add(new byte[] { 0, 4 }); + package.Add(Types.Word.ToByteArray((ushort)(varCount * 8))); + + // now join the header and the data + package.Add(value); + + mSocket.Send(package.array, package.array.Length, SocketFlags.None); + + int numReceived = mSocket.Receive(bReceive, 512, SocketFlags.None); + if (bReceive[21] != 0xff) throw new Exception(ErrorCode.WrongNumberReceivedBytes.ToString()); + + return ErrorCode.NoError; + } + catch + { + lastErrorCode = ErrorCode.WriteData; + lastErrorString = ""; + return lastErrorCode; + } + } + #endregion + #region Write(DataType DataType, int DB, int StartByteAdr, object value) + public object Write(DataType DataType, int DB, int StartByteAdr, object value) + { + byte[] package = null; + + switch (value.GetType().Name) + { + case "Byte": + package = Types.Byte.ToByteArray((byte)value); + break; + case "Int16": + package = Types.Int.ToByteArray((Int16)value); + break; + case "UInt16": + package = Types.Word.ToByteArray((UInt16)value); + break; + case "Int32": + package = Types.DInt.ToByteArray((Int32)value); + break; + case "UInt32": + package = Types.DWord.ToByteArray((UInt32)value); + break; + case "Double": + package = Types.Double.ToByteArray((Double)value); + break; + case "Byte[]": + package = (byte[])value; + break; + case "Int16[]": + package = Types.Int.ToByteArray((Int16[])value); + break; + case "UInt16[]": + package = Types.Word.ToByteArray((UInt16[])value); + break; + case "Int32[]": + package = Types.DInt.ToByteArray((Int32[])value); + break; + case "UInt32[]": + package = Types.DWord.ToByteArray((UInt32[])value); + break; + case "Double[]": + package = Types.Double.ToByteArray((double[])value); + break; + case "String": + package = Types.String.ToByteArray(value as string); + break; + default: + return ErrorCode.WrongVarFormat; + } + return WriteBytes(DataType, DB, StartByteAdr, package); + } + #endregion + #region Write(string variable, object value) + public object Write(string variable, object value) + { + DataType mDataType; + int mDB; + int mByte; + int mBit; + + string txt2; + byte _byte; + object objValue; + + string txt = variable.ToUpper(); + txt = txt.Replace(" ", ""); // Leerzeichen entfernen + + try + { + switch (txt.Substring(0, 2)) + { + case "DB": + string[] strings = txt.Split(new char[]{'.'}); + if (strings.Length < 2) + throw new Exception(); + + mDB = int.Parse(strings[0].Substring(2)); + mDataType = DataType.DataBlock; + string dbType = strings[1].Substring(0, 3); + int dbIndex = int.Parse(strings[1].Substring(3)); + + switch (dbType) + { + case "DBB": + objValue = Convert.ChangeType(value, typeof(byte)); + return Write(DataType.DataBlock, mDB, dbIndex, (byte)objValue); + case "DBW": + objValue = Convert.ChangeType(value, typeof(UInt16)); + return Write(DataType.DataBlock, mDB, dbIndex, (UInt16)objValue); + case "DBD": + objValue = Convert.ChangeType(value, typeof(UInt32)); + return Write(DataType.DataBlock, mDB, dbIndex, (UInt32)objValue); + case "DBX": + mByte = dbIndex; + mBit = int.Parse(strings[2]); + if (mBit > 7) throw new Exception(); + byte b = (byte)Read(DataType.DataBlock, mDB, mByte, VarType.Byte, 1); + if ((int)value == 1) + b = (byte)(b | (byte)Math.Pow(2, mBit)); // Bit setzen + else + b = (byte)(b & (b ^ (byte)Math.Pow(2, mBit))); // Bit rücksetzen + + return Write(DataType.DataBlock, mDB, mByte, (byte)b); + case "DBS": + // DB-String + return Write(DataType.DataBlock, mDB, dbIndex, (string)value); + default: + throw new Exception(); + } + case "EB": + // Eingangsbyte + objValue = Convert.ChangeType(value, typeof(byte)); + return Write(DataType.Input, 0, int.Parse(txt.Substring(2)), (byte)objValue); + case "EW": + // Eingangswort + objValue = Convert.ChangeType(value, typeof(UInt16)); + return Write(DataType.Input, 0, int.Parse(txt.Substring(2)), (UInt16)objValue); + case "ED": + // Eingangsdoppelwort + objValue = Convert.ChangeType(value, typeof(UInt32)); + return Write(DataType.Input, 0, int.Parse(txt.Substring(2)), (UInt32)objValue); + case "AB": + // Ausgangsbyte + objValue = Convert.ChangeType(value, typeof(byte)); + return Write(DataType.Output, 0, int.Parse(txt.Substring(2)), (byte)objValue); + case "AW": + // Ausgangswort + objValue = Convert.ChangeType(value, typeof(UInt16)); + return Write(DataType.Output, 0, int.Parse(txt.Substring(2)), (UInt16)objValue); + case "AD": + // Ausgangsdoppelwort + objValue = Convert.ChangeType(value, typeof(UInt32)); + return Write(DataType.Output, 0, int.Parse(txt.Substring(2)), (UInt32)objValue); + case "MB": + // Merkerbyte + objValue = Convert.ChangeType(value, typeof(byte)); + return Write(DataType.Marker, 0, int.Parse(txt.Substring(2)), (byte)objValue); + case "MW": + // Merkerwort + objValue = Convert.ChangeType(value, typeof(UInt16)); + return Write(DataType.Marker, 0, int.Parse(txt.Substring(2)), (UInt16)objValue); + case "MD": + // Merkerdoppelwort + return Write(DataType.Marker, 0, int.Parse(txt.Substring(2)), value); + default: + switch (txt.Substring(0, 1)) + { + case "E": + case "I": + // Eingang + mDataType = DataType.Input; + break; + case "A": + case "O": + // Ausgang + mDataType = DataType.Output; + break; + case "M": + // Merker + mDataType = DataType.Marker; + break; + case "T": + // Timer + return Write(DataType.Timer, 0, int.Parse(txt.Substring(1)), (double)value); + case "Z": + case "C": + // Zähler + return Write(DataType.Counter, 0, int.Parse(txt.Substring(1)), (short)value); + default: + throw new Exception("Unbekannte Variable"); + } + + txt2 = txt.Substring(1); + if (txt2.IndexOf(".") == -1) throw new Exception("Unbekannte Variable"); + + mByte = int.Parse(txt2.Substring(0, txt2.IndexOf("."))); + mBit = int.Parse(txt2.Substring(txt2.IndexOf(".") + 1)); + if (mBit > 7) throw new Exception("Unbekannte Variable"); + _byte = (byte)Read(mDataType, 0, mByte, VarType.Byte, 1); + if ((int)value == 1) + _byte = (byte)(_byte | (byte)Math.Pow(2, mBit)); // Bit setzen + else + _byte = (byte)(_byte & (_byte ^ (byte)Math.Pow(2, mBit))); // Bit rücksetzen + + return Write(mDataType, 0, mByte, (byte)_byte); + } + } + catch (Exception ex) + { + string msg = ex.Message; + lastErrorCode = ErrorCode.WrongVarFormat; + lastErrorString = "Die Variable '" + variable + "' konnte nicht entschlüsselt werden!"; + return lastErrorCode; + } + } + #endregion + #region WriteStruct(object value, int DB) + public ErrorCode WriteStruct(object structValue, int DB) + { + try + { + byte[] bytes = Types.Struct.ToBytes(structValue); + ErrorCode errCode = WriteBytes(DataType.DataBlock, DB, 0, bytes); + return errCode; + } + catch + { + lastErrorCode = ErrorCode.WriteData; + lastErrorString = "Fehler beim Schreiben der Daten aufgetreten!"; + return lastErrorCode; + } + } + #endregion + + public void Dispose() + { + if (mSocket != null) + { + ((IDisposable)mSocket).Dispose(); + } + } + } +} diff --git a/S7.Net/Properties/AssemblyInfo.cs b/S7.Net/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..aad99a9 --- /dev/null +++ b/S7.Net/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die mit einer Assembly verknüpft sind. +[assembly: AssemblyTitle("S7.Net")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("S7.Net")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar +// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von +// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("1c01e753-a660-4c35-a681-c6f6a7deee83")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/S7.Net/S7.Net.csproj b/S7.Net/S7.Net.csproj new file mode 100644 index 0000000..b5869f3 --- /dev/null +++ b/S7.Net/S7.Net.csproj @@ -0,0 +1,106 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {BFD484F9-3F04-42A2-BF2A-60A189A25DCF} + Library + Properties + S7.Net + S7.Net + v3.5 + 512 + + + + + 3.5 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + + + + + + + + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + + + \ No newline at end of file diff --git a/S7.Net/Types/Boolean.cs b/S7.Net/Types/Boolean.cs new file mode 100644 index 0000000..497fd30 --- /dev/null +++ b/S7.Net/Types/Boolean.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace S7.Types +{ + public static class Boolean + { + public static bool GetValue(byte value, int bit) + { + if ((value & (int)Math.Pow(2, bit)) != 0) + return true; + else + return false; + } + + public static byte SetBit(byte value, int bit) + { + return (byte)(value | (byte)Math.Pow(2, bit)); + } + + public static byte ClearBit(byte value, int bit) + { + return (byte)(value & (byte)(~(byte)Math.Pow(2, bit))); + } + + } +} diff --git a/S7.Net/Types/Byte.cs b/S7.Net/Types/Byte.cs new file mode 100644 index 0000000..99b8683 --- /dev/null +++ b/S7.Net/Types/Byte.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace S7.Types +{ + public static class Byte + { + // publics + #region ToByteArray + public static byte[] ToByteArray(byte value) + { + byte[] bytes = new byte[] { value}; + return bytes; + } + #endregion + #region FromByteArray + public static byte FromByteArray(byte[] bytes) + { + return bytes[0]; + } + #endregion + } +} diff --git a/S7.Net/Types/ByteArray.cs b/S7.Net/Types/ByteArray.cs new file mode 100644 index 0000000..10adf33 --- /dev/null +++ b/S7.Net/Types/ByteArray.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace S7.Types +{ + class ByteArray + { + List list = new List(); + + public byte[] array + { + get { return list.ToArray(); } + } + + public ByteArray() + { + list = new List(); + } + + public ByteArray(int size) + { + list = new List(size); + } + + public void Clear() + { + list = new List(); + } + + public void Add(byte item) + { + list.Add(item); + } + + public void Add(byte[] items) + { + list.AddRange(items); + } + } +} diff --git a/S7.Net/Types/Counter.cs b/S7.Net/Types/Counter.cs new file mode 100644 index 0000000..4e49712 --- /dev/null +++ b/S7.Net/Types/Counter.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace S7.Types +{ + public static class Counter + { + // publics + #region FromByteArray + public static UInt16 FromByteArray(byte[] bytes) + { + // bytes[0] -> HighByte + // bytes[1] -> LowByte + return FromBytes(bytes[1], bytes[0]); + } + #endregion + #region FromBytes + public static UInt16 FromBytes(byte LoVal, byte HiVal) + { + return (UInt16)(HiVal * 256 + LoVal); + } + #endregion + + #region ToByteArray + public static byte[] ToByteArray(UInt16 value) + { + byte[] bytes = new byte[2]; + int x = 2; + long valLong = (long)((UInt16)value); + for (int cnt = 0; cnt < x; cnt++) + { + Int64 x1 = (Int64)Math.Pow(256, (cnt)); + + Int64 x3 = (Int64)(valLong / x1); + bytes[x - cnt - 1] = (byte)(x3 & 255); + valLong -= bytes[x - cnt - 1] * x1; + } + return bytes; + } + + public static byte[] ToByteArray(UInt16[] value) + { + ByteArray arr = new ByteArray(); + foreach (UInt16 val in value) + arr.Add(ToByteArray(val)); + return arr.array; + } + #endregion + #region ToArray + public static UInt16[] ToArray(byte[] bytes) + { + UInt16[] values = new UInt16[bytes.Length / 2]; + + int counter = 0; + for (int cnt = 0; cnt < bytes.Length / 2; cnt++) + values[cnt] = FromByteArray(new byte[] { bytes[counter++], bytes[counter++] }); + + return values; + } + #endregion + } +} diff --git a/S7.Net/Types/DInt.cs b/S7.Net/Types/DInt.cs new file mode 100644 index 0000000..fe3ef57 --- /dev/null +++ b/S7.Net/Types/DInt.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace S7.Types +{ + public static class DInt + { + // publics + #region FromByteArray + public static Int32 FromByteArray(byte[] bytes) + { + return FromBytes(bytes[3], bytes[2], bytes[1], bytes[0]); + } + #endregion + #region FromBytes + public static Int32 FromBytes(byte v1, byte v2, byte v3, byte v4) + { + return (Int32)(v1 + v2 * Math.Pow(2, 8) + v3 * Math.Pow(2, 16) + v4 * Math.Pow(2, 24)); + } + #endregion + + #region ToByteArray + public static byte[] ToByteArray(Int32 value) + { + byte[] bytes = new byte[4]; + int x = 4; + long valLong = (long)((Int32)value); + for (int cnt = 0; cnt < x; cnt++) + { + Int64 x1 = (Int64)Math.Pow(256, (cnt)); + + Int64 x3 = (Int64)(valLong / x1); + bytes[x - cnt - 1] = (byte)(x3 & 255); + valLong -= bytes[x - cnt - 1] * x1; + } + return bytes; + } + + public static byte[] ToByteArray(Int32[] value) + { + ByteArray arr = new ByteArray(); + foreach (Int32 val in value) + arr.Add(ToByteArray(val)); + return arr.array; + } + #endregion + #region ToArray + public static Int32[] ToArray(byte[] bytes) + { + Int32[] values = new Int32[bytes.Length / 4]; + + int counter = 0; + for (int cnt = 0; cnt < bytes.Length / 4; cnt++) + values[cnt] = FromByteArray(new byte[] { bytes[counter++], bytes[counter++], bytes[counter++], bytes[counter++] }); + + return values; + } + #endregion + + // conversion + public static Int32 CDWord(Int64 value) + { + if (value > Int32.MaxValue) + { + value -= (long)Int32.MaxValue + 1; + value = (long)Int32.MaxValue + 1 - value; + value *= -1; + } + return (int)value; + } + } +} diff --git a/S7.Net/Types/DWord.cs b/S7.Net/Types/DWord.cs new file mode 100644 index 0000000..5c71dcf --- /dev/null +++ b/S7.Net/Types/DWord.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace S7.Types +{ + public static class DWord + { + // publics + #region FromByteArray + public static UInt32 FromByteArray(byte[] bytes) + { + return FromBytes(bytes[3], bytes[2], bytes[1], bytes[0]); + } + #endregion + #region FromBytes + public static UInt32 FromBytes(byte v1, byte v2, byte v3, byte v4) + { + return (UInt32)(v1 + v2 * Math.Pow(2, 8) + v3 * Math.Pow(2, 16) + v4 * Math.Pow(2, 24)); + } + #endregion + + #region ToByteArray + public static byte[] ToByteArray(UInt32 value) + { + byte[] bytes = new byte[4]; + int x = 4; + long valLong = (long)((UInt32)value); + for (int cnt = 0; cnt < x; cnt++) + { + Int64 x1 = (Int64)Math.Pow(256, (cnt)); + + Int64 x3 = (Int64)(valLong / x1); + bytes[x - cnt - 1] = (byte)(x3 & 255); + valLong -= bytes[x - cnt - 1] * x1; + } + return bytes; + } + + public static byte[] ToByteArray(UInt32[] value) + { + ByteArray arr = new ByteArray(); + foreach (UInt32 val in value) + arr.Add(ToByteArray(val)); + return arr.array; + } + #endregion + #region ToArray + public static UInt32[] ToArray(byte[] bytes) + { + UInt32[] values = new UInt32[bytes.Length / 4]; + + int counter = 0; + for (int cnt = 0; cnt < bytes.Length / 4; cnt++) + values[cnt] = FromByteArray(new byte[] { bytes[counter++], bytes[counter++], bytes[counter++], bytes[counter++] }); + + return values; + } + #endregion + } +} diff --git a/S7.Net/Types/Double.cs b/S7.Net/Types/Double.cs new file mode 100644 index 0000000..cb79fa9 --- /dev/null +++ b/S7.Net/Types/Double.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using System.Text; +using S7; + +namespace S7.Types +{ + public static class Double + { + // publics + #region FromByteArray + public static double FromByteArray(byte[] bytes) + { + byte v1 = bytes[0]; + byte v2 = bytes[1]; + byte v3 = bytes[2]; + byte v4 = bytes[3]; + + if ((int)v1 + v2 + v3 + v4 == 0) + { + return 0.0; + } + else + { + // nun String bilden + string txt = ValToBinString(v1) + ValToBinString(v2) + ValToBinString(v3) + ValToBinString(v4); + // erstmal das Vorzeichen + int vz = int.Parse(txt.Substring(0, 1)); + int exd = Conversion.BinStringToInt32(txt.Substring(1, 8)); + string ma = txt.Substring(9, 23); + double mantisse = 1; + double faktor = 1.0; + + //das ist die Anzahl der restlichen bit's + for (int cnt = 0; cnt <= 22; cnt++) + { + faktor = faktor / 2.0; + //entspricht 2^-y + if (ma.Substring(cnt, 1) == "1") + { + mantisse = mantisse + faktor; + } + } + return Math.Pow((-1), vz) * Math.Pow(2, (exd - 127)) * mantisse; + } + } + #endregion + #region FromDWord + public static double FromDWord(Int32 value) + { + byte[] b = S7.Types.DInt.ToByteArray(value); + double d = FromByteArray(b); + return d; + } + + public static double FromDWord(UInt32 value) + { + byte[] b = S7.Types.DWord.ToByteArray(value); + double d = FromByteArray(b); + return d; + } + #endregion + + #region ToByteArray + public static byte[] ToByteArray(double value) + { + double wert = (double)value; + string binString = ""; + byte[] bytes = new byte[4]; + if (wert != 0f) + { + if (wert < 0) + { + wert *= -1; + binString = "1"; + } + else + { + binString = "0"; + } + int exponent = (int)Math.Floor((double)Math.Log(wert) / Math.Log(2.0)); + wert = wert / (Math.Pow(2, exponent)) - 1; + + binString += ValToBinString((byte)(exponent + 127)); + for (int cnt = 1; cnt <= 23; cnt++) + { + if (!(wert - System.Math.Pow(2, -cnt) < 0)) + { + wert = wert - System.Math.Pow(2, -cnt); + binString += "1"; + } + else + binString += "0"; + } + bytes[0] = (byte)BinStringToByte(binString.Substring(0, 8)); + bytes[1] = (byte)BinStringToByte(binString.Substring(8, 8)); + bytes[2] = (byte)BinStringToByte(binString.Substring(16, 8)); + bytes[3] = (byte)BinStringToByte(binString.Substring(24, 8)); + + } + else + { + bytes[0] = 0; + bytes[1] = 0; + bytes[2] = 0; + bytes[3] = 0; + } + return bytes; + } + + public static byte[] ToByteArray(double[] value) + { + ByteArray arr = new ByteArray(); + foreach (double val in value) + arr.Add(ToByteArray(val)); + return arr.array; + } + #endregion + #region ToArray + public static double[] ToArray(byte[] bytes) + { + double[] values = new double[bytes.Length / 4]; + + int counter = 0; + for (int cnt = 0; cnt < bytes.Length / 4; cnt++) + values[cnt] = FromByteArray(new byte[] { bytes[counter++], bytes[counter++], bytes[counter++], bytes[counter++] }); + + return values; + } + #endregion + + // privates + #region ValToBinString + private static string ValToBinString(byte value) + { + string txt = ""; + + for (int cnt = 7; cnt >= 0; cnt += -1) + { + if ((value & (byte)Math.Pow(2, cnt)) > 0) + txt += "1"; + else + txt += "0"; + } + return txt; + } + #endregion + #region BinStringToByte + private static byte? BinStringToByte(string txt) + { + int cnt = 0; + int ret = 0; + + if (txt.Length == 8) + { + for (cnt = 7; cnt >= 0; cnt += -1) + { + if (int.Parse(txt.Substring(cnt, 1)) == 1) + { + ret += (int)(Math.Pow(2, (txt.Length - 1 - cnt))); + } + } + return (byte)ret; + } + return null; + } + #endregion + } +} diff --git a/S7.Net/Types/Int.cs b/S7.Net/Types/Int.cs new file mode 100644 index 0000000..3e600de --- /dev/null +++ b/S7.Net/Types/Int.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace S7.Types +{ + public static class Int + { + // publics + #region FromByteArray + public static Int16 FromByteArray(byte[] bytes) + { + // bytes[0] -> HighByte + // bytes[1] -> LowByte + return FromBytes(bytes[1], bytes[0]); + } + #endregion + #region FromBytes + public static Int16 FromBytes(byte LoVal, byte HiVal) + { + return (Int16)(HiVal * 256 + LoVal); + } + #endregion + + #region ToByteArray + public static byte[] ToByteArray(Int16 value) + { + byte[] bytes = new byte[2]; + int x = 2; + long valLong = (long)((Int16)value); + for (int cnt = 0; cnt < x; cnt++) + { + Int64 x1 = (Int64)Math.Pow(256, (cnt)); + + Int64 x3 = (Int64)(valLong / x1); + bytes[x - cnt - 1] = (byte)(x3 & 255); + valLong -= bytes[x - cnt - 1] * x1; + } + return bytes; + } + + public static byte[] ToByteArray(Int16[] value) + { + ByteArray arr = new ByteArray(); + foreach (Int16 val in value) + arr.Add(ToByteArray(val)); + return arr.array; + } + #endregion + #region ToArray + public static Int16[] ToArray(byte[] bytes) + { + Int16[] values = new Int16[bytes.Length / 2]; + + int counter = 0; + for (int cnt = 0; cnt < bytes.Length / 2; cnt++) + values[cnt] = FromByteArray(new byte[] { bytes[counter++], bytes[counter++] }); + + return values; + } + #endregion + + // conversion + public static Int16 CWord(int value) + { + if (value > 32767) + { + value -= 32768; + value = 32768 - value; + value *= -1; + } + return (short)value; + } + + } +} diff --git a/S7.Net/Types/String.cs b/S7.Net/Types/String.cs new file mode 100644 index 0000000..b8f12da --- /dev/null +++ b/S7.Net/Types/String.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace S7.Types +{ + public static class String + { + // publics + #region ToByteArray + public static byte[] ToByteArray(string value) + { + string txt = (string)value; + char[] ca = txt.ToCharArray(); + byte[] bytes = new byte[txt.Length]; + for (int cnt = 0; cnt <= ca.Length - 1; cnt++) + bytes[cnt] = (byte)Asc(ca[cnt].ToString()); + return bytes; + } + #endregion + + #region FromByteArray + public static string FromByteArray(byte[] bytes) + { + return System.Text.Encoding.ASCII.GetString(bytes); + } + #endregion + + // privates + private static int Asc(string s) + { + byte[] b = System.Text.Encoding.ASCII.GetBytes(s); + if (b.Length > 0) + return b[0]; + return 0; + } + } +} diff --git a/S7.Net/Types/Struct.cs b/S7.Net/Types/Struct.cs new file mode 100644 index 0000000..daf7976 --- /dev/null +++ b/S7.Net/Types/Struct.cs @@ -0,0 +1,204 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace S7.Types +{ + public static class Struct + { + /// + /// Gets the size of the struct in bytes. + /// + /// the type of the struct + /// the number of bytes + public static int GetStructSize(Type structType) + { + double numBytes = 0.0; + + System.Reflection.FieldInfo[] infos = structType.GetFields(); + foreach (System.Reflection.FieldInfo info in infos) + { + switch (info.FieldType.Name) + { + case "Boolean": + numBytes += 0.125; + break; + case "Byte": + numBytes = Math.Ceiling(numBytes); + numBytes++; + break; + case "Int16": + case "UInt16": + numBytes = Math.Ceiling(numBytes); + if ((numBytes / 2 - Math.Floor(numBytes / 2.0)) > 0) + numBytes++; + numBytes += 2; + break; + case "Int32": + case "UInt32": + numBytes = Math.Ceiling(numBytes); + if ((numBytes / 2 - Math.Floor(numBytes / 2.0)) > 0) + numBytes++; + numBytes += 4; + break; + case "Float": + case "Double": + numBytes = Math.Ceiling(numBytes); + if ((numBytes / 2 - Math.Floor(numBytes / 2.0)) > 0) + numBytes++; + numBytes += 4; + break; + } + } + return (int)numBytes; + } + + /// + /// Creates a struct of a specified type by an array of bytes. + /// + /// The struct type + /// The array of bytes + /// The object depending on the struct type or null if fails(array-length != struct-length + public static object FromBytes(Type structType, byte[] bytes) + { + if (bytes == null) + return null; + + if (bytes.Length != GetStructSize(structType)) + return null; + + // and decode it + int bytePos = 0; + int bitPos = 0; + double numBytes = 0.0; + object structValue = Activator.CreateInstance(structType); + + System.Reflection.FieldInfo[] infos = structValue.GetType().GetFields(); + foreach (System.Reflection.FieldInfo info in infos) + { + switch (info.FieldType.Name) + { + case "Boolean": + // get the value + bytePos = (int)Math.Floor(numBytes); + bitPos = (int)((numBytes - (double)bytePos) / 0.125); + if ((bytes[bytePos] & (int)Math.Pow(2, bitPos)) != 0) + info.SetValue(structValue, true); + else + info.SetValue(structValue, false); + numBytes += 0.125; + break; + case "Byte": + numBytes = Math.Ceiling(numBytes); + info.SetValue(structValue, (byte)(bytes[(int)numBytes])); + numBytes++; + break; + case "Int16": + case "UInt16": + numBytes = Math.Ceiling(numBytes); + if ((numBytes / 2 - Math.Floor(numBytes / 2.0)) > 0) + numBytes++; + // hier auswerten + info.SetValue(structValue, S7.Types.Word.FromBytes(bytes[(int)numBytes + 1], + bytes[(int)numBytes])); + numBytes += 2; + break; + case "Int32": + case "UInt32": + numBytes = Math.Ceiling(numBytes); + if ((numBytes / 2 - Math.Floor(numBytes / 2.0)) > 0) + numBytes++; + // hier auswerten + info.SetValue(structValue, S7.Types.DWord.FromBytes(bytes[(int)numBytes], + bytes[(int)numBytes + 1], + bytes[(int)numBytes + 2], + bytes[(int)numBytes + 3])); + numBytes += 4; + break; + case "Double": + numBytes = Math.Ceiling(numBytes); + if ((numBytes / 2 - Math.Floor(numBytes / 2.0)) > 0) + numBytes++; + // hier auswerten + info.SetValue(structValue, S7.Types.Double.FromByteArray(new byte[] { bytes[(int)numBytes], + bytes[(int)numBytes + 1], + bytes[(int)numBytes + 2], + bytes[(int)numBytes + 3] })); + numBytes += 4; + break; + } + } + return structValue; + } + + /// + /// Creates a byte array depending on the struct type. + /// + /// The struct object + /// A byte array or null if fails. + public static byte[] ToBytes(object structValue) + { + Type type = structValue.GetType(); + + int size = S7.Types.Struct.GetStructSize(type); + byte[] bytes = new byte[size]; + byte[] bytes2 = null; + + int bytePos = 0; + int bitPos = 0; + double numBytes = 0.0; + + System.Reflection.FieldInfo[] infos = type.GetFields(); + foreach (System.Reflection.FieldInfo info in infos) + { + bytes2 = null; + switch (info.FieldType.Name) + { + case "Boolean": + // get the value + bytePos = (int)Math.Floor(numBytes); + bitPos = (int)((numBytes - (double)bytePos) / 0.125); + if ((bool)info.GetValue(structValue)) + bytes[bytePos] |= (byte)Math.Pow(2, bitPos); // is true + else + bytes[bytePos] &= (byte)(~(byte)Math.Pow(2, bitPos)); // is false + numBytes += 0.125; + break; + case "Byte": + numBytes = (int)Math.Ceiling(numBytes); + bytePos = (int)numBytes; + bytes[bytePos] = (byte)info.GetValue(structValue); + numBytes++; + break; + case "Int16": + bytes2 = S7.Types.Int.ToByteArray((Int16)info.GetValue(structValue)); + break; + case "UInt16": + bytes2 = S7.Types.Word.ToByteArray((UInt16)info.GetValue(structValue)); + break; + case "Int32": + bytes2 = S7.Types.DInt.ToByteArray((Int32)info.GetValue(structValue)); + break; + case "UInt32": + bytes2 = S7.Types.DWord.ToByteArray((UInt32)info.GetValue(structValue)); + break; + case "Double": + bytes2 = S7.Types.Double.ToByteArray((double)info.GetValue(structValue)); + break; + } + if (bytes2 != null) + { + // add them + numBytes = Math.Ceiling(numBytes); + if ((numBytes / 2 - Math.Floor(numBytes / 2.0)) > 0) + numBytes++; + bytePos = (int)numBytes; + for (int bCnt=0; bCnt HighByte + // bytes[1] -> LowByte + return FromBytes(bytes[1], bytes[0]); + } + #endregion + #region FromBytes + public static UInt16 FromBytes(byte LoVal, byte HiVal) + { + return (UInt16)(HiVal * 256 + LoVal); + } + #endregion + + #region ToByteArray + public static byte[] ToByteArray(UInt16 value) + { + byte[] bytes = new byte[2]; + int x = 2; + long valLong = (long)((UInt16)value); + for (int cnt = 0; cnt < x; cnt++) + { + Int64 x1 = (Int64)Math.Pow(256, (cnt)); + + Int64 x3 = (Int64)(valLong / x1); + bytes[x - cnt - 1] = (byte)(x3 & 255); + valLong -= bytes[x - cnt - 1] * x1; + } + return bytes; + } + + public static byte[] ToByteArray(UInt16[] value) + { + ByteArray arr = new ByteArray(); + foreach (UInt16 val in value) + arr.Add(ToByteArray(val)); + return arr.array; + } + #endregion + #region ToArray + public static UInt16[] ToArray(byte[] bytes) + { + UInt16[] values = new UInt16[bytes.Length / 2]; + + int counter = 0; + for (int cnt = 0; cnt < bytes.Length / 2; cnt++) + values[cnt] = FromByteArray(new byte[] { bytes[counter++], bytes[counter++] }); + + return values; + } + #endregion + } +} diff --git a/S7.sln b/S7.sln new file mode 100644 index 0000000..ac8f5d5 --- /dev/null +++ b/S7.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "S7.Net", "S7.Net\S7.Net.csproj", "{BFD484F9-3F04-42A2-BF2A-60A189A25DCF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "S7.Net.Test", "S7.Net.Test\S7.Net.Test.csproj", "{D34F7AF6-19DA-4AE6-9BB0-6666970F6838}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BFD484F9-3F04-42A2-BF2A-60A189A25DCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BFD484F9-3F04-42A2-BF2A-60A189A25DCF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BFD484F9-3F04-42A2-BF2A-60A189A25DCF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BFD484F9-3F04-42A2-BF2A-60A189A25DCF}.Release|Any CPU.Build.0 = Release|Any CPU + {D34F7AF6-19DA-4AE6-9BB0-6666970F6838}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D34F7AF6-19DA-4AE6-9BB0-6666970F6838}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D34F7AF6-19DA-4AE6-9BB0-6666970F6838}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D34F7AF6-19DA-4AE6-9BB0-6666970F6838}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/packages/NUnit.2.6.2/NUnit.2.6.2.nupkg b/packages/NUnit.2.6.2/NUnit.2.6.2.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..26f15bdc7f1075d97c4e8bdd2ee9bdaf7833fcb6 GIT binary patch literal 94702 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%0A3$?eQaoC`p1VEmOx~yGx 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 zΜM&X+u=@)Lb&h#~8H@wfMw4dUNWhW5<&Laru`bYPQIQ%8zd8#&$B1elxF3ukyT zpQ5_HJ#GEW92{$%N`$}eP}%TypfGSEQ#x-^%AGsc2C!qr%$LpFuY|u)U6Jf(Tr9~j zT2;WF`;JaFl9O1!AV*4AdpxLOwx|X79#lkow>{`-673rz!;CIi$s10ch;y5K=8oOT z>M!33goZf<)YD}ZA2uB52kUmRi_fvixOpFFvc3{scId=y7O8QhKT_JL(Tn_G;h@y5 zS<~T15+1#5LswSZZM4VtVwc8*z{sP9NuLKcZ&{_PA+uW*AeZAjbXpA%l$qI9!ql*& zh&0+KqDZdtH@M%Lh%&fb$_|D96gP9c9W}+XvmDlym~n08Ky)93N~VN$l?_{w_3_unn8&_77y=b5!?ei)UCzitu!B&t|Y^I%x0 zN22qTs29gmV)I~p0%6z7O-tx@!tHr3oSiQ-ds#1B`Bz~V(wbX&ZiR1W{ zW-S@zHXQHp=O}KJ;zxZJ$AkK>`?FSKHj-6=wURE0-Mr0RO&vKHD(r?+t!+m|PrrO5 z9EJLkKb8?OF^L4D#j2L=ysK}1)u2ovee6N;S^-zwvSp<5`C-#583XLwuM`;dkkFnR zg?GnvkA4WqMX!xyANA|qJXv(JXWq!|;FG(JBfk#5g;DdYuKdE(Rztgo1GxKfsWFtL zNb6{rM*{%vHXQ&Rz!d~>1ld9P5Kwn77zB#obB20=Y(O3$J_y_$%H!$|cZIrpz>p{S zp5{1PtyX$tb|f&j^INK;Sko7duHtPY+ujF-B=Ai92!aKed5Kj0-~C1|rF5 z@8RJp&d2BK>F&e}cemrSf$%|{pw3Vi4+Nh8uK*w8pJP3s?#_t+2>5;G&yhX|*q@`k zy}fz8g?74L8sZ z>Vo_e0tC6(06pxXaCcvz2NdCf#3K*D5I|2Pmn>+Qp(%}Yz+@U}ak`U+t z2SR0%erx{Ty(5DnW!>R+NVlDlC504(J0a=y?;!t32oUB1aq>h469{*4x-%7u zbOsqEZ@9bT@Ax@`oqTzLCU8%nH_XWi=mJG@A`Smt0?7S8o#xg3BO-qid%8G55eT3! z5_#vbC*sZm(4D>RHavI1@cl;+d4K2j-}8BwUziQjUzjZn>i$Q1e-HY%gA)IkHd4qS z@d`@t{d4yY>jZMK^F&T$DX0sNf!=TApNAwIp}t7xY!Fg+0s5Ws-=VRw`8UV^T0cl1 z?~23K$X_?~e)p|2-igf7rz1ac2{97Ain(L7q+?K*c|*|E@V9OAf&Z{D<*( zT9S+)S63$(1avnA`Mg|g{xOV literal 0 HcmV?d00001 diff --git a/packages/NUnit.2.6.2/NUnit.2.6.2.nuspec b/packages/NUnit.2.6.2/NUnit.2.6.2.nuspec new file mode 100644 index 0000000..985f4e0 --- /dev/null +++ b/packages/NUnit.2.6.2/NUnit.2.6.2.nuspec @@ -0,0 +1,30 @@ + + + + NUnit + 2.6.2 + NUnit + Charlie Poole + Charlie Poole + http://nunit.org/nuget/license.html + http://nunit.org/ + http://nunit.org/nuget/nunit_32x32.png + false + NUnit features a fluent assert syntax, parameterized, generic and theory tests and is user-extensible. A number of runners, both from the NUnit project and by third parties, are able to execute NUnit tests. + +Version 2.6 is the seventh major release of this well-known and well-tested programming tool. + +This package includes only the framework assembly. You will need to install the NUnit.Runners package unless you are using a third-party runner. + NUnit is a unit-testing framework for all .Net languages with a strong TDD focus. + Version 2.6 is the seventh major release of NUnit. + +Unlike earlier versions, this package includes only the framework assembly. You will need to install the NUnit.Runners package unless you are using a third-party runner. + +The nunit.mocks assembly is now provided by the NUnit.Mocks package. The pnunit.framework assembly is provided by the pNUnit package. + en-US + test testing tdd framework fluent assert theory plugin addin + + + + + \ No newline at end of file diff --git a/packages/NUnit.2.6.2/lib/nunit.framework.dll b/packages/NUnit.2.6.2/lib/nunit.framework.dll new file mode 100644 index 0000000000000000000000000000000000000000..3e24ba1ca6260d7d0499624d13d2c5a2cd75b52a GIT binary patch literal 147456 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 W^f}PyK%WDB4)i(D=fM9-4*U=F(vzP6 literal 0 HcmV?d00001 diff --git a/packages/NUnit.2.6.2/lib/nunit.framework.xml b/packages/NUnit.2.6.2/lib/nunit.framework.xml new file mode 100644 index 0000000..7702cee --- /dev/null +++ b/packages/NUnit.2.6.2/lib/nunit.framework.xml @@ -0,0 +1,10899 @@ + + + + nunit.framework + + + +

+ 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 + + + + + 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 an array as containing a set of datapoints to be used + executing a theory within the same fixture that requires an argument + of the Type of the array elements. + + + + + Attribute used to provide descriptive text about a + test case or fixture. + + + + + Construct the attribute + + Text describing the test + + + + Gets the test description + + + + + Enumeration indicating how the expected message parameter is to be used + + + + Expect an exact match + + + Expect a message containing the parameter string + + + Match the regular expression provided as a parameter + + + Expect a message that starts with the parameter string + + + + ExpectedExceptionAttribute + + + + + + Constructor for a non-specific exception + + + + + Constructor for a given type of exception + + The type of the expected exception + + + + Constructor for a given exception name + + The full name of the expected exception + + + + Gets or sets the expected exception type + + + + + Gets or sets the full Type name of the expected exception + + + + + Gets or sets the expected message text + + + + + Gets or sets the user message displayed in case of failure + + + + + Gets or sets the type of match to be performed on the expected message + + + + + Gets the name of a method to be used as an exception handler + + + + + 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 + + + + The reason test is marked explicit + + + + + 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 without giving a reason + for ignoring the test. + + + + + Constructs the attribute giving a reason for ignoring the test + + The reason for ignoring the test + + + + The reason for ignoring a test + + + + + 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 itemss 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 + + + + + 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-deliminted list of platforms + + + + 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 + + + + Marks a test to use a combinatorial join of any argument data + provided. NUnit will create a test case for every combination of + the arguments provided. This can result in a large number of test + cases and so should be used judiciously. This is the default join + type, so the attribute need not be used except as documentation. + + + + + 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 + + + + + Default constructor + + + + + Marks a test to use pairwise join of any argument data provided. + NUnit will attempt too excercise every pair of argument values at + least once, using as small a number of test cases as it can. With + only two arguments, this is the same as a combinatorial join. + + + + + Default constructor + + + + + Marks a test to use a sequential join of any argument data + provided. NUnit will use arguements for each parameter in + sequence, generating test cases up to the largest number + of argument values provided and using null for any arguments + for which it runs out of values. Normally, this should be + used with the same number of arguments for each parameter. + + + + + Default constructor + + + + + Summary description for MaxTimeAttribute. + + + + + Construct a MaxTimeAttribute, given a time in milliseconds. + + The maximum elapsed time in milliseconds + + + + RandomAttribute is used to supply a set of random values + to a single parameter of a parameterized test. + + + + + ValuesAttribute is used to provide literal arguments for + an individual parameter of a test. + + + + + Abstract base class for attributes that apply to parameters + and supply data for the parameter. + + + + + Gets the data to be provided to the specified parameter + + + + + 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. + + + + + 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 + + + + + Construct a set of doubles from 0.0 to 1.0, + specifying only the count. + + + + + + Construct a set of doubles from min to max + + + + + + + + Construct a set of ints from min to max + + + + + + + + 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 longs + + + + + + + + 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 + + + + RequiredAddinAttribute may be used to indicate the names of any addins + that must be present in order to run some or all of the tests in an + assembly. If the addin is not loaded, the entire assembly is marked + as NotRunnable. + + + + + Initializes a new instance of the class. + + The required addin. + + + + Gets the name of required addin. + + The required addin name. + + + + Summary description for SetCultureAttribute. + + + + + Construct given the name of a culture + + + + + + Summary description for SetUICultureAttribute. + + + + + Construct given the name of a culture + + + + + + SetUpAttribute is used in a TestFixture to identify a method + that is called immediately before each test is run. It is + also used in a SetUpFixture to identify the method that is + called once, before any of the subordinate tests are run. + + + + + 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 static (shared in VB) property + that returns a list of tests. + + + + + Attribute used in a TestFixture to identify a method that is + called immediately after each test is run. It is also used + in a SetUpFixture to identify the method that is called once, + after all subordinate tests have run. In either case, the method + is guaranteed to be called, even if an exception is thrown. + + + + + Provide actions to execute before and after tests. + + + + + When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. + + + + + Executed before each test is run + + Provides details about the test that is going to be run. + + + + Executed after each test is run + + Provides details about the test that has just been run. + + + + Provides the target for the action attribute + + 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")] + publc void TestDescriptionMethod() + {} + } + + + + + + Descriptive text for this test + + + + + TestCaseAttribute is used to mark parameterized test cases + and provide them with their arguments. + + + + + The ITestCaseData interface is implemented by a class + that is able to return complete testcases for use by + a parameterized test method. + + NOTE: This interface is used in both the framework + and the core, even though that results in two different + types. However, sharing the source code guarantees that + the various implementations will be compatible and that + the core is able to reflect successfully over the + framework implementations of ITestCaseData. + + + + + Gets the argument list to be provided to the test + + + + + Gets the expected result + + + + + Indicates whether a result has been specified. + This is necessary because the result may be + null, so it's value cannot be checked. + + + + + Gets the expected exception Type + + + + + Gets the FullName of the expected exception + + + + + Gets the name to be used for the test + + + + + Gets the description of the test + + + + + Gets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets a value indicating whether this is explicit. + + true if explicit; otherwise, false. + + + + Gets the ignore reason. + + The ignore reason. + + + + 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 the list of arguments to a test case + + + + + Gets or sets the expected result. Use + ExpectedResult by preference. + + The result. + + + + Gets or sets the expected result. + + The result. + + + + Gets a flag indicating whether an expected + result has been set. + + + + + Gets a list of categories associated with this test; + + + + + Gets or sets the category associated with this test. + May be a single category or a comma-separated list. + + + + + Gets or sets the expected exception. + + The expected exception. + + + + Gets or sets the name the expected exception. + + The expected name of the exception. + + + + Gets or sets the expected message of the expected exception + + The expected message of the exception. + + + + Gets or sets the type of match to be performed on the expected message + + + + + Gets or sets the description. + + The description. + + + + Gets or sets the name of the test. + + The name of the test. + + + + Gets or sets the ignored status of the test + + + + + Gets or sets the ignored status of the test + + + + + Gets or sets the explicit status of the test + + + + + Gets or sets the reason for not running the test + + + + + Gets or sets the reason for not running the test. + Set has the side effect of marking the test as ignored. + + The ignore reason. + + + + FactoryAttribute indicates the source to be used to + provide test cases for a test method. + + + + + Construct with the name of the data source, which must + be a property, field or method of the test class itself. + + An array of the names of the factories that will provide data + + + + Construct with a Type, which must implement IEnumerable + + The Type that will provide data + + + + Construct with a Type and name. + that don't support params arrays. + + The Type that will provide data + The name of the 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 or sets the category associated with this test. + May be a single category or a comma-separated list. + + + + + [TestFixture] + public class ExampleClass + {} + + + + + 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. + + + + + + Descriptive text for this fixture + + + + + Gets and sets the category for this fixture. + May be a comma-separated list of categories. + + + + + Gets a list of categories for this fixture + + + + + The arguments originally provided to the attribute + + + + + Gets or sets a value indicating whether this should be ignored. + + true if ignore; otherwise, false. + + + + Gets or sets the ignore reason. May set Ignored as a side effect. + + The ignore reason. + + + + Get or set the type arguments. If not set + explicitly, any leading arguments that are + Types are taken as type arguments. + + + + + 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")] + publc void TestDescriptionMethod() + {} + } + + + + + + 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 method or assembly, sets the default timeout + for all contained test methods. + + + + + Construct a TimeoutAttribute given a time in milliseconds + + The timeout value in milliseconds + + + + Marks a test that must run in the STA, causing it + to run in a separate thread if necessary. + + On methods, you may also use STAThreadAttribute + to serve the same purpose. + + + + + Construct a RequiresSTAAttribute + + + + + 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 on a separate thread. + + + + + Construct a RequiresThreadAttribute + + + + + Construct a RequiresThreadAttribute, specifying the apartment + + + + + 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 the data source to be used + + + + 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 the 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 + + + + + AttributeExistsConstraint tests for the presence of a + specified attribute on a Type. + + + + + The Constraint class is the base of all built-in constraints + within NUnit. It provides the operator overloads used to combine + constraints. + + + + + The IConstraintExpression interface is implemented by all + complete and resolvable constraints and expressions. + + + + + Return the top-level constraint for this expression + + + + + + Static UnsetObject used to detect derived constraints + failing to set the actual value. + + + + + The actual value being tested against a constraint + + + + + The display name of this Constraint for use by ToString() + + + + + Argument fields used by ToString(); + + + + + The builder holding this constraint + + + + + Construct a constraint with no arguments + + + + + Construct a constraint with one argument + + + + + Construct a constraint with two arguments + + + + + Sets the ConstraintBuilder holding this constraint + + + + + Write the failure message to the MessageWriter provided + as an argument. The default implementation simply passes + the constraint 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 + + + + 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 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 + True for success, false for failure + + + + 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 + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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 + + + + 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 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. + + + + + 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. + + + + + 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. + + + + + Class used to detect any derived constraints + that fail to set the actual value in their + Matches override. + + + + + Constructs an AttributeExistsConstraint for a specific attribute Type + + + + + + Tests whether the object provides the expected attribute. + + A Type, MethodInfo, or other ICustomAttributeProvider + True if the expected attribute is present, otherwise false + + + + Writes the description of the constraint to the specified writer + + + + + 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. + + + + + Abstract base class used for prefixes + + + + + The base constraint + + + + + Construct given a base constraint + + + + + + Constructs an AttributeConstraint for a specified attriute + Type and base constraint. + + + + + + + Determines whether the Type or other provider has the + expected attribute and if its value matches the + additional constraint specified. + + + + + Writes a description of the attribute to the specified writer. + + + + + Writes the actual value supplied to the specified writer. + + + + + Returns a string representation of the constraint. + + + + + BasicConstraint is the abstract base for constraints that + perform a simple comparison to a constant value. + + + + + Initializes a new instance of the class. + + The expected. + The description. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + NullConstraint tests that the actual value is null + + + + + Initializes a new instance of the class. + + + + + TrueConstraint tests that the actual value is true + + + + + Initializes a new instance of the class. + + + + + FalseConstraint tests that the actual value is false + + + + + Initializes a new instance of the class. + + + + + NaNConstraint tests that the actual value is a double or float NaN + + + + + Test that the actual value is an NaN + + + + + + + Write the constraint description to a specified writer + + + + + + 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 + + + + AndConstraint succeeds only if both members succeed. + + + + + Create an AndConstraint from two other constraints + + The first constraint + The second 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 a description for this contraint to a MessageWriter + + The MessageWriter to receive the description + + + + 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 + + + + OrConstraint succeeds if either member succeeds + + + + + Create an OrConstraint from two other constraints + + The first constraint + The second 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 + + + + Write a description for this contraint to a MessageWriter + + The MessageWriter to receive the description + + + + 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 + + + + + + + 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 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 + + + + Flag the constraint to ignore case and return self. + + + + + EmptyCollectionConstraint tests whether a collection is empty. + + + + + Check that the collection is empty + + + + + + + Write the constraint description to a MessageWriter + + + + + + UniqueItemsConstraint tests whether all the items in a + collection are unique. + + + + + Check that all items are unique. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + CollectionContainsConstraint is used to test whether a collection + contains an expected object as a member. + + + + + Construct a CollectionContainsConstraint + + + + + + Test whether the expected item is contained in the collection + + + + + + + Write a descripton of the constraint to a MessageWriter + + + + + + CollectionEquivalentCOnstraint is used to determine whether two + collections are equivalent. + + + + + Construct a CollectionEquivalentConstraint + + + + + + Test whether two collections are equivalent + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + 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 + + + + Test whether the actual collection is a subset of + the expected collection provided. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + CollectionOrderedConstraint is used to test whether a collection is ordered. + + + + + Construct a CollectionOrderedConstraint + + + + + Modifies the constraint to use an IComparer and returns self. + + + + + Modifies the constraint to use an IComparer<T> and returns self. + + + + + Modifies the constraint to use a Comparison<T> and returns self. + + + + + Modifies the constraint to test ordering by the value of + a specified property and returns self. + + + + + Test whether the collection is ordered + + + + + + + Write a description of the constraint to a MessageWriter + + + + + + Returns the string representation of the constraint. + + + + + + If used performs a reverse comparison + + + + + CollectionTally counts (tallies) the number of + occurences of each object in one or more enumerations. + + + + + Construct a CollectionTally object from a comparer and a collection + + + + + 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 + + + + The number of objects remaining in the tally + + + + + ComparisonAdapter class centralizes all comparisons of + values in NUnit, adapting to the use of any provided + IComparer, IComparer<T> or Comparison<T> + + + + + Returns a ComparisonAdapter that wraps an IComparer + + + + + Returns a ComparisonAdapter that wraps an IComparer<T> + + + + + Returns a ComparisonAdapter that wraps a Comparison<T> + + + + + Compares two objects + + + + + Gets the default ComparisonAdapter, which wraps an + NUnitComparer object. + + + + + Construct a ComparisonAdapter for an IComparer + + + + + Compares two objects + + + + + + + + Construct a default ComparisonAdapter + + + + + ComparisonAdapter<T> extends ComparisonAdapter and + allows use of an IComparer<T> or Comparison<T> + to actually perform the comparison. + + + + + Construct a ComparisonAdapter for an IComparer<T> + + + + + Compare a Type T to an object + + + + + Construct a ComparisonAdapter for a Comparison<T> + + + + + 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. This class supplies the Using modifiers. + + + + + ComparisonAdapter to be used in making the comparison + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Modifies the constraint to use an IComparer and returns self + + + + + Modifies the constraint to use an IComparer<T> and returns self + + + + + Modifies the constraint to use a Comparison<T> and returns self + + + + + Delegate used to delay evaluation of the actual value + to be used in evaluating a 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 reognized. a ConstraintStack holds + input constraints as well as the results of each + operator applied. + + + + + 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 expresson 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. + + + + + OperatorStack is a type-safe stack for holding ConstraintOperators + + + + + Initializes a new instance of the class. + + The builder. + + + + Pushes the specified operator onto the stack. + + The op. + + + + Pops the topmost operator from the stack. + + + + + + Gets a value indicating whether this is empty. + + true if empty; otherwise, false. + + + + Gets the topmost operator without modifying the stack. + + The top. + + + + ConstraintStack is a type-safe stack for holding Constraints + + + + + Initializes a new instance of the class. + + The builder. + + + + Pushes the specified constraint. As a side effect, + the constraint's builder field is set to the + ConstraintBuilder owning this stack. + + The constraint. + + + + Pops this topmost constrait from the stack. + As a side effect, the constraint's builder + field is set to null. + + + + + + Gets a value indicating whether this is empty. + + true if empty; otherwise, false. + + + + Gets the topmost constraint without modifying the stack. + + The topmost constraint + + + + 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 + reognized. Once an actual Constraint is appended, the expression + returns a resolvable Constraint. + + + + + ConstraintExpressionBase is the abstract base class for the + ConstraintExpression class, which represents a + compound constraint in the process of being constructed + from a series of syntactic elements. + + NOTE: ConstraintExpressionBase is separate because the + ConstraintExpression class was generated in earlier + versions of NUnit. The two classes may be combined + in a future version. + + + + + 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. + + + + + 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 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 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 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 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 suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled 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 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 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 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 matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex 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 the same path or under an 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 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 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. + + + + + With is currently a NOP - reserved for future use. + + + + + 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 whether a collection is ordered + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + 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 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 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 suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled 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 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 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 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 fails if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern 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 the same path or under an 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 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 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 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 whether a collection is ordered + + + + + 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. + + + + + 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. + + + + + + The syntax element preceding this operator + + + + + The syntax element folowing 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. + + + + + 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. + + + + + + + Negates the test of the constraint it wraps. + + + + + Constructs a new NotOperator + + + + + Returns a NotConstraint applied to its argument. + + + + + Abstract base for operators that indicate how to + apply a constraint to items in a collection. + + + + + Constructs a CollectionOperator + + + + + 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 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. + + + + + 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 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 simply wraps the + constraint provided as an argument, without any + further functionality, but which modifes the + order of evaluation because of its precedence. + + + + + Constructor for the WithOperator + + + + + Returns a constraint that wraps its argument + + + + + Abstract base class for operators that are able to reduce to a + constraint whether or not another syntactic element follows. + + + + + 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. + + + + + 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. + + + + + + Gets the name of the property to which the operator applies + + + + + 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. + + + + + 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. + + + + + 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. + + + + + + Abstract method that produces a constraint by applying + the operator to its left and right constraint arguments. + + + + + Gets the left precedence of the operator + + + + + Gets the right precedence of the operator + + + + + Operator that requires both it's arguments to succeed + + + + + Construct an AndOperator + + + + + Apply the operator to produce an AndConstraint + + + + + Operator that requires at least one of it's arguments to succeed + + + + + Construct an OrOperator + + + + + Apply the operator to produce an OrConstraint + + + + + 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. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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. + + + + Flag the constraint to ignore case and return self. + + + + + Applies a delay to the match so that a match can be evaluated in the future. + + + + + Creates a new DelayedConstraint + + The inner constraint two 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 two decorate + The time interval after which the match is performed + The time interval used for polling + If the value of is less than 0 + + + + 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 + True for if the base constraint fails, false if it succeeds + + + + 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 + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a MessageWriter. + + The writer on which the actual value is displayed + + + + Returns the string representation of the constraint. + + + + + EmptyDirectoryConstraint is used to test that a directory is empty + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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 + + + + 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. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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. + + + + + If true, strings in error messages will be clipped + + + + + NUnitEqualityComparer used to test equality. + + + + + Initializes a new instance of the class. + + The expected value. + + + + Flag the constraint to use a tolerance when determining equality. + + Tolerance value to be used + 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 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 + + + + Write a failure message. Overridden to provide custom + failure messages for EqualConstraint. + + The MessageWriter to write to + + + + Write description of this constraint + + 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 enumerations, 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 + + + + 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. + + + + + 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 + + + + EqualityAdapter class handles all equality comparisons + that use an IEqualityComparer, IEqualityComparer<T> + or a ComparisonAdapter. + + + + + 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 EqualityAdapter that wraps an IComparer. + + + + + Returns an EqualityAdapter that wraps an IEqualityComparer. + + + + + Returns an EqualityAdapter that wraps an IEqualityComparer<T>. + + + + + Returns an EqualityAdapter that wraps an IComparer<T>. + + + + + Returns an EqualityAdapter that wraps a Comparison<T>. + + + + + EqualityAdapter that wraps an IComparer. + + + + + Returns true if the two objects can be compared by this adapter. + Generic adapter requires objects of the specified type. + + + + + EqualityAdapter that wraps an IComparer. + + + + 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. + + + + + 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 + + + + 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 + + + + Tests whether a value is greater than the value supplied to its constructor + + + + + The value against which a comparison is to be made + + + + + Initializes a new instance of the class. + + The expected value. + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Tests whether a value is greater than or equal to the value supplied to its constructor + + + + + The value against which a comparison is to be made + + + + + Initializes a new instance of the class. + + The expected value. + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Tests whether a value is less than the value supplied to its constructor + + + + + The value against which a comparison is to be made + + + + + Initializes a new instance of the class. + + The expected value. + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Tests whether a value is less than or equal to the value supplied to its constructor + + + + + The value against which a comparison is to be made + + + + + Initializes a new instance of the class. + + The expected value. + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + 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 + + + + + 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 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 locating the point where the strings differ + If true, the strings should be clipped to fit the line + + + + Writes the text for a connector. + + The connector. + + + + Writes the text for a predicate. + + The predicate. + + + + Writes the text for an expected value. + + The expected value. + + + + Writes the text for a modifier + + The modifier. + + + + 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 + + + + Abstract method to get the max line length + + + + + Static methods used in creating messages + + + + + Static string used when strings are clipped + + + + + 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 enumerable, + 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 + + + + 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. + + + + + Compares two objects + + + + + + + + Returns the default NUnitComparer. + + + + + Generic version of NUnitComparer + + + + + + Compare two objects of the same type + + + + + NUnitEqualityComparer encapsulates NUnit's handling of + equality tests between objects. + + + + + + + + + + Compares two objects for equality within a tolerance + + The first object to compare + The second object to compare + The tolerance to use in the comparison + + + + + 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. + + + + + 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 + + + + 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 and sets an external comparer to be used to + test for equality. It is applied to members of + collections, in place of NUnit's own logic. + + + + + Gets the list of failure points for the last Match performed. + + + + + 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 + + + + + PathConstraint serves as the abstract base of constraints + that operate on paths and provides several helper methods. + + + + + The expected path used in the constraint + + + + + The actual path being tested + + + + + Flag indicating whether a caseInsensitive comparison should be made + + + + + Construct a PathConstraint for a give expected path + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Returns true if the expected path and actual path match + + + + + Returns the string representation of this constraint + + + + + Canonicalize the provided path + + + The path in standardized form + + + + Test whether two paths are the same + + The first path + The second path + Indicates whether case should be ignored + + + + + Test whether one path is under another path + + The first path - supposed to be the parent path + The second path - supposed to be the child path + Indicates whether case should be ignored + + + + + Test whether one path is the same as or under another path + + The first path - supposed to be the parent path + The second path - supposed to be the child path + + + + + Modifies the current instance to be case-insensitve + and returns it. + + + + + Modifies the current instance to be case-sensitve + and returns it. + + + + + Summary description for SamePathConstraint. + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The expected path + The actual path + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + SubPathConstraint tests that the actual path is under the expected path + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The expected path + The actual path + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + SamePathOrUnderConstraint tests that one path is under another + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The expected path + The actual path + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Predicate constraint wraps a Predicate in a constraint, + returning success if the predicate is true. + + + + + Construct a PredicateConstraint from a predicate + + + + + Determines whether the predicate succeeds when applied + to the actual value. + + + + + Writes the description to a MessageWriter + + + + + 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 + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a MessageWriter. + + The writer on which the actual value is displayed + + + + 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. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + 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. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + NoItemConstraint applies another constraint to each + item in a collection, failing if any of them succeeds. + + + + + Construct a NoItemConstraint on top of an existing constraint + + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + ExactCoutConstraint 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. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + 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 vaue + of the property. The two constraints are now separate. + + + + + Initializes a new instance of the class. + + The name of the property. + + + + Test whether the property exists for a given object + + The object to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. + + The writer on which the actual value is displayed + + + + Returns the string representation of the constraint. + + + + + + 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 + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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 + + + + Returns the string representation of the constraint. + + + + + + RangeConstraint tests whethe two values are within a + specified range. + + + + + Initializes a new instance of the class. + + From. + To. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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. + + + + + Resolve the current expression to a Constraint + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + 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 either + of the argument constraints is 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. + + + + + Appends an And Operator to the expression + + + + + Appends an Or operator to the expression. + + + + + ReusableConstraint wraps a resolved constraint so that it + may be saved and reused as needed. + + + + + Construct a ReusableConstraint + + The constraint or expression to be reused + + + + Conversion operator from a normal constraint to a ReusableConstraint. + + The original constraint to be wrapped as a ReusableConstraint + + + + + Returns the string representation of the constraint. + + A string representing the constraint + + + + Resolves the ReusableConstraint by returning the constraint + that it originally wrapped. + + A resolved constraint + + + + SameAsConstraint tests whether an object is identical to + the object passed to its constructor + + + + + Initializes a new instance of the class. + + The expected object. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + BinarySerializableConstraint tests whether + an object is serializable in binary format. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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 + + + + Returns the string representation + + + + + BinarySerializableConstraint tests whether + an object is serializable in binary format. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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 + + + + Returns the string representation of this constraint + + + + + 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 + + + + + Constructs a StringConstraint given an expected value + + The expected value + + + + Modify the constraint to ignore case in matching. + + + + + EmptyStringConstraint tests whether a string is empty. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + NullEmptyStringConstraint tests whether a string is either null or empty. + + + + + Constructs a new NullOrEmptyStringConstraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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 + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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. + + + + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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. + + + + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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 + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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. + + + + 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 constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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 + + + + Returns the string representation of this constraint + + + + + Get the actual exception thrown - used by Assert.Throws. + + + + + ThrowsNothingConstraint tests that a delegate does not + throw an exception. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True if no exception is thrown, otherwise false + + + + Converts an ActualValueDelegate to a TestDelegate + before calling the primary overload. + + + + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + 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 + + + + 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. + + + + + 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. + + + + + Constructs a linear tolerance of a specdified amount + + + + + Constructs a tolerance given an amount and ToleranceMode + + + + + Tests that the current Tolerance is linear with a + numeric value, throwing an exception if it is not. + + + + + Returns an empty Tolerance object, equivalent to + specifying no tolerance. In most cases, it results + in an exact match but for floats and doubles a + default tolerance may be used. + + + + + Returns a zero Tolerance object, equivalent to + specifying an exact match. + + + + + Gets the ToleranceMode for the current Tolerance + + + + + 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 TimeSpan as the amount, using + the current amount as a number of days. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of hours. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of minutes. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of seconds. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of milliseconds. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of clock ticks. + + + + + Returns true if the current tolerance is empty. + + + + + TypeConstraint is the abstract base for constraints + that take a Type as their expected value. + + + + + The expected Type used by the constraint + + + + + Construct a TypeConstraint for a given Type + + + + + + Write the actual value for a failing constraint test to a + MessageWriter. TypeConstraints override this method to write + the name of the type. + + The writer on which the actual value is displayed + + + + 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. + + + + Test that an object is of the exact type specified + + The actual value. + True if the tested object is of the exact type provided, otherwise false. + + + + Write the description of this constraint to a MessageWriter + + The MessageWriter to use + + + + ExceptionTypeConstraint is a special version of ExactTypeConstraint + used to provided detailed info about the exception thrown in + an error message. + + + + + Constructs an ExceptionTypeConstraint + + + + + Write the actual value for a failing constraint test to a + MessageWriter. Overriden to write additional information + in the case of an Exception. + + The MessageWriter to use + + + + 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 + + + + Test whether an object is of the specified type or a derived type + + The object to be tested + True if the object is of the provided type or derives from it, otherwise false. + + + + Write a description of this constraint to a MessageWriter + + The MessageWriter to use + + + + AssignableFromConstraint is used to test that an object + can be assigned from a given Type. + + + + + Construct an AssignableFromConstraint for the type provided + + + + + + Test whether an object can be assigned from the specified type + + The object to be tested + True if the object can be assigned a value of the expected Type, otherwise false. + + + + Write a description of this constraint to a MessageWriter + + The MessageWriter to use + + + + AssignableToConstraint is used to test that an object + can be assigned to a given Type. + + + + + Construct an AssignableToConstraint for the type provided + + + + + + Test whether an object can be assigned to the specified type + + The object to be tested + True if the object can be assigned a value of the expected Type, otherwise false. + + + + Write a description of this constraint to a MessageWriter + + The MessageWriter to use + + + + 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 + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + 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 + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + + + + + + + Compares two objects of a given Type for equality within a tolerance + + The first object to compare + The second object to compare + The tolerance to use in the comparison + + + + + 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 + + + + + Delegate used by tests that execute code and + capture any thrown exception. + + + + + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. + + + + + 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. + + + + + + + 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 + + + + 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. + + + + + 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 to be applied + The actual value to test + The message that will be displayed on failure + + + + 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. + + 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. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + The message that will be displayed on failure + + + + 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 + + + + Apply a constraint to a referenced 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 a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint 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 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 + The message to display if the condition is false + + + + 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 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. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + + + + 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 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 + The message that will be displayed on failure + + + + 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 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. + + The exception Type expected + A TestSnippet delegate + The message that will be displayed on failure + + + + Verifies that a delegate throws a particular exception when called. + + The exception Type expected + A TestSnippet delegate + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected 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. + + Type of the expected exception + A TestSnippet delegate + The message that will be displayed on failure + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected exception + A TestSnippet delegate + + + + 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 + The message that will be displayed on failure + + + + 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 + The message that will be displayed on failure + + + + 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. + + 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 + The message that will be displayed on failure + + + + 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 does not throw an exception + + A TestSnippet delegate + 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 TestSnippet delegate + The message that will be displayed on failure + + + + Verifies that a delegate does not throw an exception. + + A TestSnippet delegate + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + + + + Assert that a string is either null or 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 either null or equal to string.Empty + + The string to be tested + The message to display in case of failure + + + + Assert that a string is either null or equal to string.Empty + + The string to be tested + + + + Assert that a string is not null or 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 null or empty + + The string to be tested + The message to display in case of failure + + + + Assert that a string is not null or empty + + The string to be tested + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 tothe 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 tothe 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 + + + + Verifies that the first value is greater than or equal tothe 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 tothe 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 tothe 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 + + + + Verifies that the first value is greater than or equal tothe 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 tothe 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 tothe 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 + + + + Verifies that the first value is greater than or equal tothe 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 tothe 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 tothe 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 + + + + Verifies that the first value is greater than or equal tothe 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 tothe 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 tothe 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 + + + + Verifies that the first value is greater than or equal tothe 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 tothe 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 tothe 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 + + + + Verifies that the first value is greater than or equal tothe 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 tothe 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 tothe 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 + + + + Verifies that the first value is greater than or equal tothe 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 tothe 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 tothe 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 + + + + Verifies that the first value is greater than or equal tothe 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 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 + The message to display in case of failure + + + + Asserts that an object is contained in a list. + + The expected object + The list to be examined + + + + Gets the number of assertions executed so far and + resets the counter to zero. + + + + + AssertionHelper is an optional base class for user tests, + allowing the use of shorter names for constraints and + asserts and avoiding conflict with the definition of + , from which it inherits much of its + behavior, in certain mock object frameworks. + + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. Works + identically to Assert.That + + 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. Works + identically to Assert.That. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. Works + identically to Assert.That + + A Constraint 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. + + 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. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + The message that will be displayed on failure + + + + 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 + + + + Apply a constraint to a referenced 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 a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint 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 a condition is true. If the condition is false the method throws + an . Works Identically to Assert.That. + + 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 Assert.That. + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically Assert.That. + + 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 + + + + 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 + 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 + + + + 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 + + + + 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. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + The message that will be displayed on failure + + + + 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 + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + + + + Apply a constraint to a referenced 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 + + + + Apply a constraint to a referenced 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 + + + + 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 + The message to display if the condition is false + + + + 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 + + + + A set of Assert methods operationg 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 + + + + 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 containing objects to be considered + The message that will be displayed on failure + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + 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 + + + + 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 superset is not a subject of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + + + + Asserts that superset is not a subject of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + + + + Asserts that superset is not a subject of subset. + + 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 superset is a subset of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + + + + Asserts that superset is a subset of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + + + + Asserts that superset is a subset of subset. + + 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 + The message to be displayed on failure + + + + 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 + The message to be displayed on failure + + + + 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 + The message to be displayed on failure + + + + 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 + The message to be displayed on failure + + + + 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 + + + + Static helper class used in the constraint-based syntax + + + + + Creates a new SubstringConstraint + + The value of the substring + A SubstringConstraint + + + + Creates a new CollectionContainsConstraint. + + The item that should be found. + A new CollectionContainsConstraint + + + + Summary description for DirectoryAssert + + + + + 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. + + + + + + + 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. + + + + + Verifies that two directories are equal. Two directories 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 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 + + + + Verifies that two directories are equal. Two directories 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 directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + + + + Verifies that two directories are equal. Two directories 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 directory containing the value that is expected + A directory containing the actual value + + + + Verifies that two directories are equal. Two directories 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 directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if 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 have the same value byte for byte. + If they are not equal an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are not equal + + + + Verifies that two directories are equal. Two directories 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 directory path string containing the value that is expected + A directory path string 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 + The message to display if directories are not equal + + + + 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 two directories are not equal. If they are equal + an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are 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 path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are equal + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Summary description for FileAssert. + + + + + 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. + + + + + + + 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. + + + + + 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 + The message to display if objects are not equal + + + + 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 + The message to display if objects are not equal + + + + 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 + The message to display if objects are not equal + + + + 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 + The message to be displayed when the Streams are the same. + + + + 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 + The message to display if objects are not equal + + + + 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 + The message to display if objects are not equal + + + + 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 + + + + 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, 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 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. + + + + + 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 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. + + + + + Interface implemented by a user fixture in order to + validate any expected exceptions. It is only called + for test methods marked with the ExpectedException + attribute. + + + + + Method to handle an expected exception + + The exception to be handled + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + 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 suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled 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 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 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 Regex 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 the same path or under an 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 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 whether a collection is ordered + + + + + 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 + + + + + Randomizer returns a set of random values in a repeatable + way, to allow re-running of tests if necessary. + + + + + 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. + + + + + Construct a randomizer using a random seed + + + + + Construct a randomizer using a specified seed + + + + + Return an array of random doubles between 0.0 and 1.0. + + + + + + + Return an array of random doubles with values in a specified range. + + + + + Return an array of random ints with values in a specified range. + + + + + Get a random seed for use in creating a randomizer. + + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 Notequal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + + + + 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 + The message to display in case of failure + + + + 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 message to display in case of failure + + + + 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 provides a number of instance modifiers + for use in initializing the test case. + + Note: Instance modifiers are getters that return + the same instance after modifying it's state. + + + + + The argument list to be provided to the test + + + + + The expected result to be returned + + + + + Set to true if this has an expected result + + + + + The expected exception Type + + + + + The FullName of the expected exception + + + + + The name to be used for the test + + + + + The description of the test + + + + + A dictionary of properties, used to add information + to tests without requiring the class to change. + + + + + If true, indicates that the test case is to be ignored + + + + + If true, indicates that the test case is marked explicit + + + + + The reason for ignoring a 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 expected exception type for the test + + Type of the expected exception. + The modified TestCaseData instance + + + + Sets the expected exception type for the test + + FullName of the expected exception. + The modified TestCaseData instance + + + + 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 + + + + + + + + Ignores this TestCase. + + + + + + Ignores this TestCase, specifying the reason. + + The reason. + + + + + Marks this TestCase as Explicit + + + + + + Marks this TestCase as Explicit, specifying the reason. + + The reason. + + + + + Gets the argument list to be provided to the test + + + + + Gets the expected result + + + + + Returns true if the result has been set + + + + + Gets the expected exception Type + + + + + Gets the FullName of the expected exception + + + + + Gets the name to be used for the test + + + + + Gets the description of the test + + + + + Gets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets a value indicating whether this is explicit. + + true if explicit; otherwise, false. + + + + Gets the ignore reason. + + The ignore reason. + + + + Gets a list of categories associated with this test. + + + + + Gets the property dictionary for this test + + + + + Provide the context information of the current test + + + + + Constructs a TestContext using the provided context dictionary + + A context dictionary + + + + 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 TestAdapter representing the currently executing test in this context. + + + + + Gets a ResultAdapter representing the current result for the test + executing in this context. + + + + + Gets the directory containing the current test assembly. + + + + + Gets the directory to be used for outputing files created + by this test run. + + + + + TestAdapter adapts a Test for consumption by + the user test code. + + + + + Constructs a TestAdapter for this context + + The context dictionary + + + + The name of the test. + + + + + The FullName of the test + + + + + The properties of the test. + + + + + ResultAdapter adapts a TestResult for consumption by + the user test code. + + + + + Construct a ResultAdapter for a context + + The context holding the result + + + + The TestState of current test. This maps to the ResultState + used in nunit.core and is subject to change in the future. + + + + + The TestStatus of current test. This enum will be used + in future versions of NUnit and so is to be preferred + to the TestState value. + + + + + Provides details about a test + + + + + Creates an instance of TestDetails + + The fixture that the test is a member of, if available. + The method that implements the test, if available. + The full name of the test. + A string representing the type of test, e.g. "Test Case". + Indicates if the test represents a suite of tests. + + + + The fixture that the test is a member of, if available. + + + + + The method that implements the test, if available. + + + + + The full name of the test. + + + + + A string representing the type of test, e.g. "Test Case". + + + + + Indicates if the test represents a suite of tests. + + + + + The ResultState enum indicates the result of running a test + + + + + The result is inconclusive + + + + + The test was not runnable. + + + + + The test has been skipped. + + + + + The test has been ignored. + + + + + The test succeeded + + + + + The test failed + + + + + The test encountered an unexpected exception + + + + + The test was cancelled by the user + + + + + The TestStatus enum indicates the result of running a test + + + + + The test was inconclusive + + + + + The test has skipped + + + + + The test succeeded + + + + + The test failed + + + + + Helper class with static methods used to supply constraints + that operate on strings. + + + + + 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 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 fails if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that fails if the actual + value matches the pattern supplied as an argument. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + 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. + + + + + + + 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 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 a connector. + + The connector. + + + + Writes the text for a predicate. + + The predicate. + + + + Write the text for a modifier. + + The modifier. + + + + Writes the text for an expected value. + + The expected value. + + + + 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 constraint for which the actual value is to be written + + + + Write the generic 'Actual' line for a given value + + The actual value causing a failure + + + + Gets or sets the maximum line length for this writer + + + + + Helper class with properties and methods that supply + constraints that operate on exceptions. + + + + + 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 + + + + + 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 TargetInvocationException + + + + + Creates a constraint specifying an expected TargetInvocationException + + + + + Creates a constraint specifying that no exception is thrown + + + + diff --git a/packages/NUnit.2.6.2/license.txt b/packages/NUnit.2.6.2/license.txt new file mode 100644 index 0000000..724e465 --- /dev/null +++ b/packages/NUnit.2.6.2/license.txt @@ -0,0 +1,15 @@ +Copyright © 2002-2012 Charlie Poole +Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov +Copyright © 2000-2002 Philip A. Craig + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required. + +Portions Copyright © 2002-2012 Charlie Poole or Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright © 2000-2002 Philip A. Craig + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. diff --git a/packages/Should.1.1.12.0/Should.1.1.12.0.nupkg b/packages/Should.1.1.12.0/Should.1.1.12.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..9149a1f9576b7eae1ed6c45c1c9656d7ed4d867f GIT binary patch literal 16895 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 literal 0 HcmV?d00001 diff --git a/packages/Should.1.1.12.0/Should.1.1.12.0.nuspec b/packages/Should.1.1.12.0/Should.1.1.12.0.nuspec new file mode 100644 index 0000000..1f0efe7 --- /dev/null +++ b/packages/Should.1.1.12.0/Should.1.1.12.0.nuspec @@ -0,0 +1,16 @@ + + + + Should + 1.1.12.0 + Should + Eric Hexter + Eric Hexter + false + The Should Assertion Library provides a set of extension methods for test assertions for AAA and BDD style tests. It provides assertions only, and as a result it is Test runner agnostic. The assertions are a direct fork of the xUnit test assertions. This project was born because test runners Should be independent of the the assertions! + The Should Assertion Library provides a set of extension methods for test assertions for AAA and BDD style tests. It provides assertions only, and as a result it is Test runner agnostic. The assertions are a direct fork of the xUnit test assertions. This project was born because test runners Should be independent of the the assertions! + + + + + \ No newline at end of file diff --git a/packages/Should.1.1.12.0/lib/Should.dll b/packages/Should.1.1.12.0/lib/Should.dll new file mode 100644 index 0000000000000000000000000000000000000000..f0f7443db0146b44fcf5f4feabb820cb2a40b028 GIT binary patch literal 26624 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 P{yPui|LgvrwZQ)YBF;|S literal 0 HcmV?d00001 diff --git a/packages/repositories.config b/packages/repositories.config new file mode 100644 index 0000000..fadbfc5 --- /dev/null +++ b/packages/repositories.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file