Mega Code Archive

 
Categories / C# / Development Class
 

Design By Contract Checks

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace ObjectBakery.Utils {     /// <summary>     /// Design By Contract Checks.     ///      /// Each method generates an exception or     /// a trace assertion statement if the contract is broken.     /// </summary>     /// <remarks>     /// This example shows how to call the Require method.     /// <code>     /// public void Test(int x)     /// {     ///   try     ///   {     ///      Check.Require(x > 1, "x must be > 1");     ///    }     ///    catch (System.Exception ex)     ///    {     ///      Console.WriteLine(ex.ToString());     ///    }     ///  }     /// </code>     ///     /// You can direct output to a Trace listener. For example, you could insert     /// <code>     /// Trace.Listeners.Clear();     /// Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));     /// </code>     ///      /// or direct output to a file or the Event Log.     ///      /// (Note: For ASP.NET clients use the Listeners collection     /// of the Debug, not the Trace, object and, for a Release build, only exception-handling     /// is possible.)     /// </remarks>     ///      public sealed class Check     {         #region Interface         /// <summary>         /// Precondition check - should run regardless of preprocessor directives.         /// </summary>         public static void Require(bool assertion, string message)         {             if (UseExceptions)             {                 if (!assertion) throw new PreconditionException(message);             }             else             {                 Trace.Assert(assertion, "Precondition: " + message);             }         }         /// <summary>         /// Precondition check - should run regardless of preprocessor directives.         /// </summary>         public static void Require(bool assertion, string message, Exception inner)         {             if (UseExceptions)             {                 if (!assertion) throw new PreconditionException(message, inner);             }             else             {                 Trace.Assert(assertion, "Precondition: " + message);             }         }         /// <summary>         /// Precondition check - should run regardless of preprocessor directives.         /// </summary>         public static void Require(bool assertion)         {             if (UseExceptions)             {                 if (!assertion) throw new PreconditionException("Precondition failed.");             }             else             {                 Trace.Assert(assertion, "Precondition failed.");             }         }         /// <summary>         /// Postcondition check.         /// </summary>         public static void Ensure(bool assertion, string message)         {             if (UseExceptions)             {                 if (!assertion) throw new PostconditionException(message);             }             else             {                 Trace.Assert(assertion, "Postcondition: " + message);             }         }         /// <summary>         /// Postcondition check.         /// </summary>         public static void Ensure(bool assertion, string message, Exception inner)         {             if (UseExceptions)             {                 if (!assertion) throw new PostconditionException(message, inner);             }             else             {                 Trace.Assert(assertion, "Postcondition: " + message);             }         }         /// <summary>         /// Postcondition check.         /// </summary>         public static void Ensure(bool assertion)         {             if (UseExceptions)             {                 if (!assertion) throw new PostconditionException("Postcondition failed.");             }             else             {                 Trace.Assert(assertion, "Postcondition failed.");             }         }         /// <summary>         /// Invariant check.         /// </summary>         public static void Invariant(bool assertion, string message)         {             if (UseExceptions)             {                 if (!assertion) throw new InvariantException(message);             }             else             {                 Trace.Assert(assertion, "Invariant: " + message);             }         }         /// <summary>         /// Invariant check.         /// </summary>         public static void Invariant(bool assertion, string message, Exception inner)         {             if (UseExceptions)             {                 if (!assertion) throw new InvariantException(message, inner);             }             else             {                 Trace.Assert(assertion, "Invariant: " + message);             }         }         /// <summary>         /// Invariant check.         /// </summary>         public static void Invariant(bool assertion)         {             if (UseExceptions)             {                 if (!assertion) throw new InvariantException("Invariant failed.");             }             else             {                 Trace.Assert(assertion, "Invariant failed.");             }         }         /// <summary>         /// Assertion check.         /// </summary>         public static void Assert(bool assertion, string message)         {             if (UseExceptions)             {                 if (!assertion) throw new AssertionException(message);             }             else             {                 Trace.Assert(assertion, "Assertion: " + message);             }         }         /// <summary>         /// Assertion check.         /// </summary>         public static void Assert(bool assertion, string message, Exception inner)         {             if (UseExceptions)             {                 if (!assertion) throw new AssertionException(message, inner);             }             else             {                 Trace.Assert(assertion, "Assertion: " + message);             }         }         /// <summary>         /// Assertion check.         /// </summary>         public static void Assert(bool assertion)         {             if (UseExceptions)             {                 if (!assertion) throw new AssertionException("Assertion failed.");             }             else             {                 Trace.Assert(assertion, "Assertion failed.");             }         }         /// <summary>         /// Set this if you wish to use Trace Assert statements          /// instead of exception handling.          /// (The Check class uses exception handling by default.)         /// </summary>         public static bool UseAssertions         {             get             {                 return useAssertions;             }             set             {                 useAssertions = value;             }         }         #endregion // Interface         #region Implementation         // No creation         private Check() { }         /// <summary>         /// Is exception handling being used?         /// </summary>         private static bool UseExceptions         {             get             {                 return !useAssertions;             }         }         // Are trace assertion statements being used?          // Default is to use exception handling.         private static bool useAssertions = false;         #endregion // Implementation     } // End Check     #region Exceptions     /// <summary>     /// Exception raised when a contract is broken.     /// Catch this exception type if you wish to differentiate between      /// any DesignByContract exception and other runtime exceptions.     ///       /// </summary>     public class DesignByContractException : ApplicationException     {         protected DesignByContractException() { }         protected DesignByContractException(string message) : base(message) { }         protected DesignByContractException(string message, Exception inner) : base(message, inner) { }     }     /// <summary>     /// Exception raised when a precondition fails.     /// </summary>     public class PreconditionException : DesignByContractException     {         /// <summary>         /// Precondition Exception.         /// </summary>         public PreconditionException() { }         /// <summary>         /// Precondition Exception.         /// </summary>         public PreconditionException(string message) : base(message) { }         /// <summary>         /// Precondition Exception.         /// </summary>         public PreconditionException(string message, Exception inner) : base(message, inner) { }     }     /// <summary>     /// Exception raised when a postcondition fails.     /// </summary>     public class PostconditionException : DesignByContractException     {         /// <summary>         /// Postcondition Exception.         /// </summary>         public PostconditionException() { }         /// <summary>         /// Postcondition Exception.         /// </summary>         public PostconditionException(string message) : base(message) { }         /// <summary>         /// Postcondition Exception.         /// </summary>         public PostconditionException(string message, Exception inner) : base(message, inner) { }     }     /// <summary>     /// Exception raised when an invariant fails.     /// </summary>     public class InvariantException : DesignByContractException     {         /// <summary>         /// Invariant Exception.         /// </summary>         public InvariantException() { }         /// <summary>         /// Invariant Exception.         /// </summary>         public InvariantException(string message) : base(message) { }         /// <summary>         /// Invariant Exception.         /// </summary>         public InvariantException(string message, Exception inner) : base(message, inner) { }     }     /// <summary>     /// Exception raised when an assertion fails.     /// </summary>     public class AssertionException : DesignByContractException     {         /// <summary>         /// Assertion Exception.         /// </summary>         public AssertionException() { }         /// <summary>         /// Assertion Exception.         /// </summary>         public AssertionException(string message) : base(message) { }         /// <summary>         /// Assertion Exception.         /// </summary>         public AssertionException(string message, Exception inner) : base(message, inner) { }     }     #endregion // Exception classes }