From 4d7e393a59c1a19f1de39f14279bcc96834bae48 Mon Sep 17 00:00:00 2001 From: Marcin Wachulski Date: Sat, 27 Jan 2018 23:32:02 +0100 Subject: [PATCH] Change NUnit v2 to v3 Applied automatic fixes with the help of https://github.com/wachulski/nunit-migrator. --- Tools/NUnit/framework/nunit.framework.dll | Bin 151552 -> 354816 bytes Tools/NUnit/framework/nunit.framework.xml | 22078 +++++++++++----- .../UnitTests/Core/Config/PreprocessorTest.cs | 96 +- .../Core/Label/DefaultLabellerTest.cs | 28 +- .../Core/Publishers/PackagePublisherTests.cs | 4 +- .../Statistics/StatisticsBuilderTest.cs | 2 +- .../SourceControl/GitHistoryParserTest.cs | 4 +- .../SourceControl/MksHistoryParserTest.cs | 2 +- .../Telelogic/SynergyCommandBuilderTest.cs | 2 +- .../Telelogic/SynergyParserTest.cs | 2 +- .../Tasks/AntsPerformanceProfilerTaskTests.cs | 2 +- .../UnitTests/Core/Tasks/DumpValueTaskTest.cs | 2 +- .../Core/Tasks/ExecutableTaskTest.cs | 2 +- project/UnitTests/Core/Tasks/FakeTaskTest.cs | 2 +- .../UnitTests/Core/Tasks/GendarmeTaskTest.cs | 2 +- .../UnitTests/Core/Tasks/MsBuildTaskTest.cs | 2 +- project/UnitTests/Core/Tasks/NAntTaskTest.cs | 2 +- .../Core/Tasks/PowerShellTaskTest.cs | 2 +- project/UnitTests/Core/Tasks/RakeTaskTest.cs | 2 +- .../UnitTests/IntegrationTests/CCNet_1835.cs | 2 +- .../UnitTests/IntegrationTests/CCNet_1902.cs | 2 +- .../IntegrationTests/PublisherTests.cs | 2 +- .../IntegrationTests/SimpleScenarioTests.cs | 2 +- .../SpacesInBuildArgsOfTask.cs | 2 +- .../UnitTests/IntegrationTests/TaskTests.cs | 2 +- project/UnitTests/UnitTests.csproj | 2 +- .../UnitTests/Xsl/StylesheetTestFixture.cs | 2 +- 27 files changed, 15797 insertions(+), 6455 deletions(-) diff --git a/Tools/NUnit/framework/nunit.framework.dll b/Tools/NUnit/framework/nunit.framework.dll index 780727f219d08aa635e12a56a326850ef82dbec5..0a5beac579a395e3c24e56c03ed3cf0ba9cc3d1c 100644 GIT binary patch literal 354816 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

(60}dyO;(k-1mxg`;cT}7tE!+yf))ZXcN-($ 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%0ANEfz#`T+5knLeJ%5cmKE0sc26YHG1oPt)XZ; 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≺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 - + +

+ FrameworkController provides a facade for use in loading, browsing + and running tests without requiring a reference to the NUnit + framework. All calls are encapsulated in constructors for + this class and its nested classes, which only require the + types of the Common Type System as arguments. + + The controller supports four actions: Load, Explore, Count and Run. + They are intended to be called by a driver, which should allow for + proper sequencing of calls. Load must be called before any of the + other actions. The driver may support other actions, such as + reload on run, by combining these calls. + + + - Delegate used by tests that execute code and - capture any thrown exception. + Construct a FrameworkController using the default builder and runner. + The AssemblyName or path to the test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests - + - The Assert class contains a collection of static methods that - implement the most common assertions used in NUnit. + Construct a FrameworkController using the default builder and runner. + The test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests - + - 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. + Construct a FrameworkController, specifying the types to be used + for the runner and builder. This constructor is provided for + purposes of development. + The full AssemblyName or the path to the test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + The Type of the test runner + The Type of the test builder - + - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. + Construct a FrameworkController, specifying the types to be used + for the runner and builder. This constructor is provided for + purposes of development. - - + The test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + The Type of the test runner + The Type of the test builder - + - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. + Gets the ITestAssemblyBuilder used by this controller instance. - - + The builder. - + - 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. + Gets the ITestAssemblyRunner used by this controller instance. - The message to initialize the with. - Arguments to be used in formatting the message + The runner. - + - 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. + Gets the AssemblyName or the path for which this FrameworkController was created - 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. + Gets the Assembly for which this - + - Throws an with the message and arguments - that are passed in. This is used by the other Assert functions. + Gets a dictionary of settings for the FrameworkController - 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. + Loads the tests in the assembly - The message to initialize the with. + - + - Throws an . - This is used by the other Assert functions. + Returns info about the tests in an assembly + A string containing the XML representation of the filter to use + The XML result of exploring the tests - + - Throws an with the message and arguments - that are passed in. This causes the test to be reported as ignored. + Runs the tests in an assembly - The message to initialize the with. - Arguments to be used in formatting the message + A string containing the XML representation of the filter to use + The XML result of the test run - + - Throws an with the message that is - passed in. This causes the test to be reported as ignored. + Runs the tests in an assembly synchronously reporting back the test results through the callback + or through the return value - The message to initialize the with. + The callback that receives the test results + A string containing the XML representation of the filter to use + The XML result of the test run - + - Throws an . - This causes the test to be reported as ignored. + Runs the tests in an assembly asynchronously reporting back the test results through the callback + The callback that receives the test results + A string containing the XML representation of the filter to use - + - Throws an with the message and arguments - that are passed in. This causes the test to be reported as inconclusive. + Stops the test run - The message to initialize the with. - Arguments to be used in formatting the message + True to force the stop, false for a cooperative stop - + - Throws an with the message that is - passed in. This causes the test to be reported as inconclusive. + Counts the number of test cases in the loaded TestSuite - The message to initialize the with. + A string containing the XML representation of the filter to use + The number of tests - + - Throws an . - This causes the test to be reported as Inconclusive. + Inserts environment element + Target node + The new node - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Inserts settings element - The actual value to test - A Constraint to be applied + Target node + Settings dictionary + The new node - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + FrameworkControllerAction is the base class for all actions + performed against a FrameworkController. - The actual value to test - A Constraint to be applied - 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. + LoadTestsAction loads a test into the FrameworkController - The actual value to test - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message + LoadTestsAction loads the tests in an assembly. + + The controller. + The callback handler. - + - Asserts that a condition is true. If the condition is false the method throws - an . + ExploreTestsAction returns info about the tests in an assembly - 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 . + Initializes a new instance of the class. - The evaluated condition + The controller for which this action is being performed. + Filter used to control which tests are included (NYI) + The callback handler. - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + CountTestsAction counts the number of test cases in the loaded TestSuite + held by the FrameworkController. - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Construct a CountsTestAction and perform the count of test cases. - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure + A FrameworkController holding the TestSuite whose cases are to be counted + A string containing the XML representation of the filter to use + A callback handler used to report results - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + RunTestsAction runs the loaded TestSuite held by the FrameworkController. - 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. + Construct a RunTestsAction and run all tests in the loaded TestSuite. - The actual value to test - A Constraint to be applied + A FrameworkController holding the TestSuite to run + A string containing the XML representation of the filter to use + A callback handler used to report results - + - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + RunAsyncAction initiates an asynchronous test run, returning immediately - The actual value to test - A Constraint to be applied - 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. + Construct a RunAsyncAction and run all tests in the loaded TestSuite. - The actual value to test - A Constraint to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message + A FrameworkController holding the TestSuite to run + A string containing the XML representation of the filter to use + A callback handler used to report results - + - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. + StopRunAction stops an ongoing run. - 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. + Construct a StopRunAction and stop any ongoing run. If no + run is in process, no error is raised. - The actual value to test - A Constraint to be applied + The FrameworkController for which a run is to be stopped. + True the stop should be forced, false for a cooperative stop. + >A callback handler used to report results + A forced stop will cause threads and processes to be killed as needed. - + - 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. + Implementation of ITestAssemblyRunner - The actual value to test - A Constraint to be applied - 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. + Initializes a new instance of the class. - - This method is provided for use by VB developers needing to test - the value of properties with private setters. - - The actual value to test - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message + The builder. - + - Verifies that a delegate throws a particular exception when called. + Gets the default level of parallel execution (worker threads) - A constraint to be satisfied by the exception - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Verifies that a delegate throws a particular exception when called. + The tree of tests that was loaded by the builder - A constraint to be satisfied by the exception - A TestDelegate - The message that will be displayed on failure - + - Verifies that a delegate throws a particular exception when called. + The test result, if a run has completed - A constraint to be satisfied by the exception - A TestDelegate - + - Verifies that a delegate throws a particular exception when called. + Indicates whether a test is loaded - The exception Type expected - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Verifies that a delegate throws a particular exception when called. + Indicates whether a test is running - The exception Type expected - A TestDelegate - The message that will be displayed on failure - + - Verifies that a delegate throws a particular exception when called. + Indicates whether a test run is complete - The exception Type expected - A TestDelegate - + - Verifies that a delegate throws a particular exception when called. + Our settings, specified when loading the assembly - Type of the expected exception - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Verifies that a delegate throws a particular exception when called. + The top level WorkItem created for the assembly as a whole - Type of the expected exception - A TestDelegate - The message that will be displayed on failure - + - Verifies that a delegate throws a particular exception when called. + The TestExecutionContext for the top level WorkItem - Type of the expected exception - A TestDelegate - + - Verifies that a delegate throws an exception when called - and returns it. + Loads the tests found in an Assembly - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message + File name of the assembly to load + Dictionary of option settings for loading the assembly + True if the load was successful - + - Verifies that a delegate throws an exception when called - and returns it. + Loads the tests found in an Assembly - A TestDelegate - The message that will be displayed on failure + The assembly to load + Dictionary of option settings for loading the assembly + True if the load was successful - + - Verifies that a delegate throws an exception when called - and returns it. + Count Test Cases using a filter - A TestDelegate + The filter to apply + The number of test cases found - + - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. + Explore the test cases using a filter - The expected Exception Type - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message + The filter to apply + Test Assembly with test cases that matches the filter - + - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. + Run selected tests and return a test result. The test is run synchronously, + and the listener interface is notified as it progresses. - The expected Exception Type - A TestDelegate - The message that will be displayed on failure + Interface to receive EventListener notifications. + A test filter used to select tests to be run + - + - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. + Run selected tests asynchronously, notifying the listener interface as it progresses. - The expected Exception Type - A TestDelegate + Interface to receive EventListener notifications. + A test filter used to select tests to be run + + RunAsync is a template method, calling various abstract and + virtual methods to be overridden by derived classes. + - + - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. + Wait for the ongoing run to complete. - The expected Exception Type - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message + Time to wait in milliseconds + True if the run completed, otherwise false - + - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. + Signal any test run that is in process to stop. Return without error if no test is running. - The expected Exception Type - A TestDelegate - The message that will be displayed on failure + If true, kill any tests that are currently running - + - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. + Initiate the test run. - The expected Exception Type - A TestDelegate - + - Verifies that a delegate does not throw an exception + Create the initial TestExecutionContext used to run tests - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message + The ITestListener specified in the RunAsync call - + - Verifies that a delegate does not throw an exception. + Handle the the Completed event for the top level work item - A TestDelegate - The message that will be displayed on failure - + - Verifies that a delegate does not throw an exception. + The ITestAssemblyBuilder interface is implemented by a class + that is able to build a suite of tests given an assembly or + an assembly filename. - A TestDelegate - + - Asserts that a condition is true. If the condition is false the method throws - an . + Build a suite of tests from a provided assembly - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message + The assembly from which tests are to be built + A dictionary of options to use in building the suite + A TestSuite containing the tests found in the assembly - + - Asserts that a condition is true. If the condition is false the method throws - an . + Build a suite of tests given the filename of an assembly - The evaluated condition - The message to display in case of failure + The filename of the assembly from which tests are to be built + A dictionary of options to use in building the suite + A TestSuite containing the tests found in the assembly - + - Asserts that a condition is true. If the condition is false the method throws - an . + The ITestAssemblyRunner interface is implemented by classes + that are able to execute a suite of tests loaded + from an assembly. - The evaluated condition - + - Asserts that a condition is true. If the condition is false the method throws - an . + Gets the tree of loaded tests, or null if + no tests have been loaded. - 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 . + Gets the tree of test results, if the test + run is completed, otherwise null. - 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 . + Indicates whether a test has been loaded - 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 + Indicates whether a test is currently running + - + - 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 + Indicates whether a test run is complete + - + - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition + Loads the tests found in an Assembly, returning an + indication of whether or not the load succeeded. + + File name of the assembly to load + Dictionary of options to use in loading the test + An ITest representing the loaded tests - + - 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 + Loads the tests found in an Assembly, returning an + indication of whether or not the load succeeded. + + The assembly to load + Dictionary of options to use in loading the test + An ITest representing the loaded tests - + - 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 + Count Test Cases using a filter + + The filter to apply + The number of test cases found - + - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition + Explore the test cases using a filter + + The filter to apply + Test Assembly with test cases that matches the filter - + - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. + Run selected tests and return a test result. The test is run synchronously, + and the listener interface is notified as it progresses. - 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 + Interface to receive ITestListener notifications. + A test filter used to select tests to be run - + - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. + Run selected tests asynchronously, notifying the listener interface as it progresses. - The object that is to be tested - The message to display in case of failure + Interface to receive EventListener notifications. + A test filter used to select tests to be run - + - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. + Wait for the ongoing run to complete. - The object that is to be tested + Time to wait in milliseconds + True if the run completed, otherwise false - + - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. + Signal any test run that is in process to stop. Return without error if no test is running. - 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 + If true, kill any test-running threads - + - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. + DefaultTestAssemblyBuilder loads a single assembly and builds a TestSuite + containing test fixtures present in the assembly. - 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 default suite builder used by the test assembly builder. - 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. + Initializes a new instance of the class. - 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. + Build a suite of tests from a provided assembly - The object that is to be tested - The message to display in case of failure + The assembly from which tests are to be built + A dictionary of options to use in building the suite + + A TestSuite containing the tests found in the assembly + - + - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. + Build a suite of tests given the filename of an assembly - The object that is to be tested + The filename of the assembly from which tests are to be built + A dictionary of options to use in building the suite + + A TestSuite containing the tests found in the assembly + - + - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. + Marks a test that must run in a particular threading apartment state, causing it + to run in a separate thread if necessary. - 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. + Construct an ApartmentAttribute - The object that is to be tested - The message to display in case of failure + The apartment state that this test must be run under. You must pass in a valid apartment state. - + - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. + Provides the Author of a test or test fixture. - The object that is to be tested - + - Verifies that two ints are equal. If they are not, then an - is thrown. + Initializes a new instance of the class. - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message + The name of the author. - + - Verifies that two ints are equal. If they are not, then an - is thrown. + Initializes a new instance of the class. - The expected value - The actual value - The message to display in case of failure + The name of the author. + The email address of the author. - + - Verifies that two ints are equal. If they are not, then an - is thrown. + Marks a test to use a particular CombiningStrategy to join + any parameter data provided. Since this is the default, the + attribute is optional. - The expected value - The actual value - + - Verifies that two longs are equal. If they are not, then an - is thrown. + Construct a CombiningStrategyAttribute incorporating an + ICombiningStrategy and an IParameterDataProvider. - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message + Combining strategy to be used in combining data + An IParameterDataProvider to supply data - + - Verifies that two longs are equal. If they are not, then an - is thrown. + Construct a CombiningStrategyAttribute incorporating an object + that implements ICombiningStrategy and an IParameterDataProvider. + This constructor is provided for CLS compliance. - The expected value - The actual value - The message to display in case of failure + Combining strategy to be used in combining data + An IParameterDataProvider to supply data - + - Verifies that two longs are equal. If they are not, then an - is thrown. + Construct one or more TestMethods from a given MethodInfo, + using available parameter data. - The expected value - The actual value + The MethodInfo for which tests are to be constructed. + The suite to which the tests will be added. + One or more TestMethods - + - Verifies that two unsigned ints are equal. If they are not, then an - is thrown. + Modify the test by adding the name of the combining strategy + to the properties. - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message + The test to modify - + - Verifies that two unsigned ints are equal. If they are not, then an - is thrown. + DefaultFloatingPointToleranceAttribute sets the tolerance used + by default when checking the equality of floating point values. - The expected value - The actual value - The message to display in case of failure - + - Verifies that two unsigned ints are equal. If they are not, then an - is thrown. + Construct specifying an amount - The expected value - The actual value + - + - Verifies that two unsigned longs are equal. If they are not, then an - is thrown. + Apply changes to the TestExecutionContext - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message + The TestExecutionContext - + - Verifies that two unsigned longs are equal. If they are not, then an - is thrown. + NonParallelizableAttribute is used to mark tests that should NOT be run in parallel. - The expected value - The actual value - The message to display in case of failure - + - Verifies that two unsigned longs are equal. If they are not, then an - is thrown. + Construct a NonParallelizableAttribute. - The expected value - The actual value - + - Verifies that two decimals are equal. If they are not, then an - is thrown. + The NonTestAssemblyAttribute may be used by third-party frameworks + or other software that references the nunit framework but does not + contain tests. Applying the attribute indicates that the assembly + is not a test assembly and may prevent errors if certain runners + attempt to load the assembly. Note that recognition of the attribute + depends on each individual runner. - 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 decimals are equal. If they are not, then an - is thrown. + SingleThreadedAttribute applies to a test fixture and indicates + that all the child tests must be run on the same thread as the + OneTimeSetUp and OneTimeTearDown. It sets a flag in the + TestExecutionContext and forces all tests to be run sequentially + on the current thread. Any ParallelScope setting is ignored. - The expected value - The actual value - The message to display in case of failure - + - Verifies that two decimals are equal. If they are not, then an - is thrown. + Apply changes to the TestExecutionContext - The expected value - The actual value + The TestExecutionContext - + - 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. + TestAssemblyDirectoryResolveAttribute is used to mark a test assembly as needing a + special assembly resolution hook that will explicitly search the test assembly's + directory for dependent assemblies. This works around a conflict between mixed-mode + assembly initialization and tests running in their own AppDomain in some cases. - 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. + Defines the order that the test will run in - 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. + Defines the order that the test will run in - 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. + Defines the order that the test will run in - 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. + Modifies a test as defined for the specific attribute. - 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 + The test to modify - + - 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. + is used on a test method to specify that it should + be rerun if it fails, up to a maximum number of times. - 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. + Construct a - 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 + The maximum number of times the test should be run if it fails - + - 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. + Wrap a command and return the result. - The value that is expected - The actual value - The message to display in case of failure + The command to be wrapped + The wrapped command - + - 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 test command for the - The value that is expected - The actual value - + - Verifies that two ints are not equal. If they are equal, then an - is thrown. + Initializes a new instance of the class. - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message + The inner command. + The maximum number of repetitions - + - Verifies that two ints are not equal. If they are equal, then an - is thrown. + Runs the test, saving a TestResult in the supplied TestExecutionContext. - The expected value - The actual value - The message to display in case of failure + The context in which the test should run. + A TestResult - + - Verifies that two ints are not equal. If they are equal, then an - is thrown. + Attribute used to identify a method that is called once + after all the child tests have run. The method is + guaranteed to be called, even if an exception is thrown. - The expected value - The actual value - + - Verifies that two longs are not equal. If they are equal, then an - is thrown. + Attribute used to identify a method that is called once + to perform setup before any child tests are run. - 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 longs are not equal. If they are equal, then an - is thrown. + LevelOfParallelismAttribute is used to set the number of worker threads + that may be allocated by the framework for running tests. - The expected value - The actual value - The message to display in case of failure - + - Verifies that two longs are not equal. If they are equal, then an - is thrown. + Construct a LevelOfParallelismAttribute. - The expected value - The actual value + The number of worker threads to be created by the framework. - + - Verifies that two unsigned ints are not equal. If they are equal, then an - is thrown. + ParallelizableAttribute is used to mark tests that may be run in parallel. - 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 unsigned ints are not equal. If they are equal, then an - is thrown. + Construct a ParallelizableAttribute using default ParallelScope.Self. - The expected value - The actual value - The message to display in case of failure - + - Verifies that two unsigned ints are not equal. If they are equal, then an - is thrown. + Construct a ParallelizableAttribute with a specified scope. - The expected value - The actual value + The ParallelScope associated with this attribute. - + - Verifies that two unsigned longs are not equal. If they are equal, then an - is thrown. + Defines the degree to which this test and its descendants may be run in parallel - 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 unsigned longs are not equal. If they are equal, then an - is thrown. + Overridden to check for invalid combinations of settings - The expected value - The actual value - The message to display in case of failure + - + - Verifies that two unsigned longs are not equal. If they are equal, then an - is thrown. + Modify the context to be used for child tests - The expected value - The actual value + The current TestExecutionContext - + - Verifies that two decimals are not equal. If they are equal, then an - is thrown. + The ParallelScope enumeration permits specifying the degree to + which a test and its descendants may be run in parallel. - 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 decimals are not equal. If they are equal, then an - is thrown. + No ParallelScope was specified on the test - The expected value - The actual value - The message to display in case of failure - + - Verifies that two decimals are not equal. If they are equal, then an - is thrown. + The test may be run in parallel with others at the same level. + Valid on classes and methods but not assemblies. - The expected value - The actual value - + - Verifies that two floats are not equal. If they are equal, then an - is thrown. + Test may not be run in parallel with any others. Valid on + classes and methods but not assemblies. - 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 floats are not equal. If they are equal, then an - is thrown. + Mask used to extract the flags that apply to the item on which a + ParallelizableAttribute has been placed, as opposed to descendants. - The expected value - The actual value - The message to display in case of failure - + - Verifies that two floats are not equal. If they are equal, then an - is thrown. + Descendants of the test may be run in parallel with one another. + Valid on assemblies and classes but not on methods. - The expected value - The actual value - + - Verifies that two doubles are not equal. If they are equal, then an - is thrown. + Descendants of the test down to the level of TestFixtures may be + run in parallel with one another. Valid on assemblies and classes + but not on methods. - 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 doubles are not equal. If they are equal, then an - is thrown. + Mask used to extract all the flags that impact descendants of a + test and place them in the TestExecutionContext. - The expected value - The actual value - The message to display in case of failure - + - Verifies that two doubles are not equal. If they are equal, then an - is thrown. + The test and its descendants may be run in parallel with others at + the same level. Valid on classes and methods but not assemblies. - 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. + Provide actions to execute before and after tests. - 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. + Executed before each test is run - The value that is expected - The actual value - The message to display in case of failure + The test that is going to be run. - + - 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. + Executed after each test is run - The value that is expected - The actual value + The test that has just been run. - + - Asserts that two objects refer to the same object. If they - are not the same an is thrown. + Provides the target for the action attribute - 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. + TestCaseSourceAttribute indicates the source to be used to + provide test fixture instances for a test class. - 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. + Error message string is public so the tests can use it - 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. + Construct with the name of the method, property or field that will provide data - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message + The name of a static method, property or field that will provide data. - + - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. + Construct with a Type and name - The expected object - The actual object - The message to display in case of failure + The Type that will provide data + The name of a static method, property or field that will provide data. - + - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. + Construct with a Type - The expected object - The actual object + The type that will provide data - + - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. + The name of a the method, property or fiend to be used as a source - 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. + A Type to be used as a source - 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. + Gets or sets the category associated with every fixture created from + this attribute. May be a single category or a comma-separated list. - 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. + Construct one or more TestFixtures from a given Type, + using available parameter data. - 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 + The TypeInfo for which fixtures are to be constructed. + One or more TestFixtures as TestSuite - + - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. + Returns a set of ITestFixtureData items for use as arguments + to a parameterized test fixture. - The value that is to be tested - The message to display in case of failure + The type for which data is needed. + - + - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. + Indicates which class the test or test fixture is testing - The value that is to be tested - + - Assert that a string is empty - that is equal to string.Empty + Initializes a new instance of the class. - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message + The type that is being tested. - + - Assert that a string is empty - that is equal to string.Empty + Initializes a new instance of the class. - The string to be tested - The message to display in case of failure + The type that is being tested. - + + Provides a for the . + + + Result of a of the collections to compare for equivalence. + + + Maximum amount of elements to write to the if there are + extra/missing elements from the collection. + + + Construct a using a . + Source . + Result of the collection comparison. + Actual collection to compare. + Whether or not the succeeded. + + + Write the custom failure message for this object's . + The to write the failure message to. + + - Assert that a string is empty - that is equal to string.Empty + CollectionSupersetConstraint is used to determine whether + one collection is a superset of another - The string to be tested - + - Assert that an array, list or other collection is empty + Construct a CollectionSupersetConstraint - 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 + The collection that the actual value is expected to be a superset of - - - Assert that an array, list or other collection is empty + + + 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. - 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 + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - An array, list or other collection implementing ICollection - + - Assert that a string is not empty - that is not equal to string.Empty + Test whether the actual collection is a superset of + the expected collection provided. - 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 + Flag the constraint to use the supplied predicate function - The string to be tested - The message to display in case of failure + The comparison function to use. + Self. - + - Assert that a string is not empty - that is not equal to string.Empty + Comparator for two s. - The string to be tested - + - Assert that an array, list or other collection is not empty + Comparator for two s. - 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 + Comparator for two s. - 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 + Comparator for two s. - An array, list or other collection implementing ICollection - + - Assert that a string is either null or equal to string.Empty + Comparator for two s. - 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 + Comparator for two s. - 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 + Comparator for two s. - The string to be tested - + - Assert that a string is not null or empty + Comparator for two types related by . - 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 + Interface for comparing two s. - The string to be tested - The message to display in case of failure - + - Assert that a string is not null or empty + Method for comparing two objects with a tolerance. - The string to be tested + The first object to compare. + The second object to compare. + The tolerance to use when comparing the objects. + Flag indicating whether or not this is the top level comparison. + + null if the objects cannot be compared using the method. + Otherwise the result of the comparison is returned. + - + - Asserts that an object may be assigned a value of a given Type. + Comparator for two s. - 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. + Comparator for two s. - 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. + Comparator for two s. - The expected Type. - The object under examination - + - Asserts that an object may be assigned a value of a given Type. + Comparator for two s. - 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. + Comparator for two s or s. - 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. + Comparator for two Tuples. - The expected Type. - The object under examination - + - Asserts that an object may not be assigned a value of a given Type. + Base class for comparators for tuples (both regular Tuples and ValueTuples). - 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. + Comparator for two ValueTuples. - 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. + DictionaryContainsValueConstraint is used to test whether a dictionary + contains an expected object as a value. - The expected Type. - The object under examination - + - Asserts that an object may not be assigned a value of a given Type. + Construct a DictionaryContainsValueConstraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. - The 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 Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + Gets the expected object - The expected Type. - The object under examination - + - Asserts that an object is an instance of a given type. + Test whether the expected value is contained in the dictionary - 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. + Flag the constraint to use the supplied predicate function - The expected Type - The object being examined - The message to display in case of failure + The comparison function to use. + Self. - + - Asserts that an object is an instance of a given type. + The EqualConstraintResult class is tailored for formatting + and displaying the result of an EqualConstraint. - The expected Type - The object being examined - + - Asserts that an object is an instance of a given type. + Construct an EqualConstraintResult - 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. + Write a failure message. Overridden to provide custom + failure messages for EqualConstraint. - The expected Type - The object being examined - The message to display in case of failure + The MessageWriter to write to - + - Asserts that an object is an instance of a given type. + Display the failure information for two collections that did not match. - The expected Type - The object being examined + The MessageWriter on which to display + The expected collection. + The actual collection + The depth of this failure in a set of nested collections - + - Asserts that an object is an instance of a given type. + Displays a single line showing the types and sizes of the expected + and actual collections or arrays. If both are identical, the value is + only shown once. - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message + The MessageWriter on which to display + The expected collection or array + The actual collection or array + The indentation level for the message line - + - Asserts that an object is an instance of a given type. + 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 expected Type - The object being examined - The message to display in case of failure + 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 - + - Asserts that an object is an instance of a given type. + Display the failure information for two IEnumerables that did not match. - The expected Type - The object being examined + The MessageWriter on which to display + The expected enumeration. + The actual enumeration + The depth of this failure in a set of nested collections - + - Asserts that an object is not an instance of a given type. + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + Applies the constraint to an actual value, returning a ConstraintResult. - The expected Type - The object being examined - The message to display in case of failure + The value to be tested + A ConstraintResult - + - Asserts that an object is not an instance of a given type. + FileExistsConstraint is used to determine if a file exists - The expected Type - The object being examined - + - Asserts that an object is not an instance of a given type. + Initializes a new instance of the class. - 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 Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + FileOrDirectoryExistsConstraint is used to determine if a file or directory exists - The expected Type - The object being examined - + - Asserts that an object is not an instance of a given type. + If true, the constraint will only check if files exist, not directories - 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. + If true, the constraint will only check if directories exist, not files - 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. + Initializes a new instance of the class that + will check files and directories. - The expected Type - The object being examined - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Initializes a new instance of the class that + will only check files if ignoreDirectories is true. - 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 + if set to true [ignore directories]. - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + Applies the constraint to an actual value, returning a ConstraintResult. - The first value, expected to be greater - The second value, expected to be less + The value to be tested + A ConstraintResult - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Interface for all constraints - 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 display name of this Constraint for use by ToString(). - 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 Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + Arguments provided to this Constraint, for use in + formatting the description. - 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 ConstraintBuilder holding this constraint - 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. + Applies the constraint to an actual value, returning a ConstraintResult. - The first value, expected to be greater - The second value, expected to be less + The value to be tested + A ConstraintResult - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. - 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 + An ActualValueDelegate + A ConstraintResult - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + 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. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure + A reference to the value to be tested + A ConstraintResult - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + An extension of ResolvableConstraintExpression that adds a no-op Items property for readability. - 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. + Create a new instance of ItemsConstraintExpression - 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. + Create a new instance of ResolvableConstraintExpression, + passing in a pre-populated ConstraintBuilder. - 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. + No-op property for readability. - 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. + Keeps track of an interval time which can be represented in + Minutes, Seconds or Milliseconds - 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. + Constructs a interval given an value in milliseconds - 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. + Gets Interval value represented as a TimeSpan object - 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. + Returns the interval with the current value as a number of minutes. - 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. + Returns the interval with the current value as a number of seconds. - 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. + Returns the interval with the current value as a number of milliseconds. - 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. + Is true for intervals created with a non zero value - 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. + Returns a string that represents the current object. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure + + A string that represents the current object. + - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + IntervalUnit provides the semantics to the value stored in Interval class. - 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. + Unit representing an Interval in minutes - 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. + Unit representing an Interval in seconds - 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. + Unit representing an Interval in milliseconds - 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. + Represents a constraint that succeeds if all the + members of a collection match a base constraint. - 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. + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + they all succeed. - 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. + Represents a constraint that succeeds if none of the + members of a collection match a base constraint. - 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. + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + none of them succeed. - 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. + Represents a constraint that succeeds if any of the + members of a collection match a base constraint. - 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. + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + any of them succeed. - 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. + SubPathConstraint tests that the actual path is under the expected path - 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. + Initializes a new instance of the class. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure + The expected path - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + Test whether the constraint is satisfied by a given value - 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 + The value to be tested + True for success, false for failure - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + ThrowsExceptionConstraint tests that an exception has + been thrown, without any further tests. - 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 Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + Executes the code and returns success if an exception 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 + A delegate representing the code to be tested + True if an exception is thrown, otherwise false - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. - 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. + AllItemsConstraint applies another constraint to each + item in a collection, succeeding if they all succeed. - 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. + Construct an AllItemsConstraint on top of an existing constraint - 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 display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. - The 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. + Apply the item constraint to each item in the collection, + failing if any item fails. - 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. + AndConstraint succeeds only if both members succeed. - 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. + Create an AndConstraint from two other constraints - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure + The first constraint + The second constraint - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Gets text describing a constraint - 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. + Apply both member constraints to an actual value, succeeding + succeeding only if both of them succeed. - 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 + The actual value + True if the constraints both succeeded - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + 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 first value, expected to be greater - The second value, expected to be less - The message to display in case of failure + The writer on which the actual value is displayed - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + AssignableFromConstraint is used to test that an object + can be assigned from a given Type. - 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. + Construct an AssignableFromConstraint for the type provided - 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. + Apply the constraint to an actual value, returning true if it succeeds - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure + The actual argument + True if the constraint succeeds, otherwise false. - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + AssignableToConstraint is used to test that an object + can be assigned to a given Type. - 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. + Construct an AssignableToConstraint for the type provided - 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. + Apply the constraint to an actual value, returning true if it succeeds - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure + The actual argument + True if the constraint succeeds, otherwise false. - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + 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. - 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. + Constructs an AttributeConstraint for a specified attribute + Type and base constraint. - 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. + Determines whether the Type or other provider has the + expected attribute and if its value matches the + additional constraint specified. - 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. + Returns a string representation of the constraint. - 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. + AttributeExistsConstraint tests for the presence of a + specified attribute on a Type. - 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. + Constructs an AttributeExistsConstraint for a specific attribute Type - 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 Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + Tests whether the object provides the expected attribute. - 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 + A Type, MethodInfo, or other ICustomAttributeProvider + True if the expected attribute is present, otherwise false - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + BinaryConstraint is the abstract base of all constraints + that combine two other constraints in some fashion. - 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 constraint being combined - 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 second constraint being combined - 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. + Construct a BinaryConstraint from two other constraints - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure + The first constraint + The second constraint - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + BinarySerializableConstraint tests whether + an object is serializable in binary format. - 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 Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + Test whether the constraint is satisfied by a given value - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure + The value to be tested + True for success, false for failure - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns the string representation - 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. + CollectionConstraint is the abstract base class for + constraints that operate on collections. - 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. + Construct an empty CollectionConstraint - 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. + Construct a CollectionConstraint - 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. + Determines whether the specified enumerable is empty. - 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 + The enumerable. + + true if the specified enumerable is empty; otherwise, false. + - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Test whether the constraint is satisfied by a given value - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure + The value to be tested + True for success, false for failure - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Protected method to be implemented by derived classes - 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. + CollectionContainsConstraint is used to test whether a collection + contains an expected object as a member. - 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. + Construct a CollectionContainsConstraint - 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 display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. - The 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 Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + Gets the expected object - 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. + Test whether the expected item is contained in the collection - 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. + Flag the constraint to use the supplied predicate function - 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 + The comparison function to use. + Self. - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + CollectionEquivalentConstraint is used to determine whether two + collections are equivalent. - 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 result of the from the collections + under comparison. + + + Construct a CollectionEquivalentConstraint + Expected collection. + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. - The 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 Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + Test whether two collections are equivalent - 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. + Test whether the collection is equivalent to the expected. - The first value, expected to be less - The second value, expected to be greater + + Actual collection type. + + + Actual collection to compare. + + + A indicating whether or not + the two collections are equivalent. + - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Flag the constraint to use the supplied predicate function - 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 + The comparison function to use. + Self. - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + CollectionItemsEqualConstraint is the abstract base class for all + collection constraints that apply some notion of item equality + as a part of their operation. - 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 NUnitEqualityComparer in use for this constraint - 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. + Construct an empty CollectionConstraint - 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. + Construct a CollectionConstraint - 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. + Get a flag indicating whether the user requested us to ignore case. - The first value, expected to be less - The second value, expected to be greater - + - Asserts that an object is contained in a list. + Get a flag indicating whether any external comparers are in use. - 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. + Flag the constraint to ignore case and return self. - 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. + Flag the constraint to use the supplied IComparer object. - The expected object - The list to be examined + The IComparer object to use. + Self. - + - Helper for Assert.AreEqual(double expected, double actual, ...) - allowing code generation to work consistently. + Flag the constraint to use the supplied IComparer object. - 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 + The IComparer object to use. + Self. - + - Gets the number of assertions executed so far and - resets the counter to zero. + Flag the constraint to use the supplied Comparison object. + The IComparer object to use. + Self. - + - 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. + Flag the constraint to use the supplied IEqualityComparer object. + The IComparer object to use. + Self. - + - Helper class with properties and methods that supply - a number of constraints used in Asserts. + Flag the constraint to use the supplied IEqualityComparer object. + The IComparer object to use. + Self. - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. + Flag the constraint to use the supplied boolean-returning delegate. + The supplied boolean-returning delegate to use. - + - 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. + Compares two collection members for equality - + - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. + Return a new CollectionTally for use in making tests + The collection to be included in the tally - + - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. + CollectionOrderedConstraint is used to test whether a collection is ordered. - + - Returns a constraint that tests two items for equality + Construct a CollectionOrderedConstraint - + - Returns a constraint that tests that two references are the same object + 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 constraint that tests whether the - actual value is greater than the suppled argument + If used performs a default ascending comparison - + - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument + If used performs a reverse comparison - + - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument + Modifies the constraint to use an and returns self. - + - Returns a constraint that tests whether the - actual value is less than the suppled argument + Modifies the constraint to use an and returns self. - + - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument + Modifies the constraint to use a and returns self. - + - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument + Modifies the constraint to test ordering by the value of + a specified property and returns self. - + - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. + Then signals a break between two ordering steps - + - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Test whether the collection is ordered + + - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Returns the string representation of the constraint. + - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + An OrderingStep represents one stage of the sort - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + CollectionSubsetConstraint is used to determine whether + one collection is a subset of another - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Construct a CollectionSubsetConstraint + The collection that the actual value is expected to be a subset of - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + + + 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 constraint that tests whether the actual value - is assignable from the type supplied as an argument. + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Test whether the actual collection is a subset of + the expected collection provided. + + - + - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. + Flag the constraint to use the supplied predicate function + The comparison function to use. + Self. + + + counts (tallies) the number of occurrences + of each object in one or more enumerations. - + + The result of a . + + + Items that were not in the expected collection. + + + Items that were not accounted for in the expected collection. + + + Constructs an empty . + + + The result of the comparision between the two collections. + + + Construct a CollectionTally object from a comparer and a collection. + The comparer to use for equality. + The expected collection to compare against. + + + Try to remove an object from the tally. + The object to remove. + + + Try to remove a set of objects from the tally. + The objects to remove. + + - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. + ComparisonAdapter class centralizes all comparisons of + values in NUnit, adapting to the use of any provided + , + or . - + - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. + Gets the default ComparisonAdapter, which wraps an + NUnitComparer object. - + - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. + Returns a ComparisonAdapter that wraps an - + - 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 ComparisonAdapter that wraps an - + - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. + Returns a ComparisonAdapter that wraps a - + - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. + Compares two objects - + - Returns a constraint that fails if the actual - value contains the substring supplied as an argument. + Construct a default ComparisonAdapter - + - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. + Construct a ComparisonAdapter for an - + - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. + Compares two objects + + + - + - Returns a constraint that fails if the actual - value starts with the substring supplied as an argument. + ComparerAdapter extends and + allows use of an or + to actually perform the comparison. - + - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. + Construct a ComparisonAdapter for an - + - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. + Compare a Type T to an object - + - Returns a constraint that fails if the actual - value ends with the substring supplied as an argument. + Construct a ComparisonAdapter for a - + - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. + Compare a Type T to an object - + - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. + Abstract base class for constraints that compare values to + determine if one is greater than, equal to or less than + the other. - + - Returns a constraint that fails if the actual - value matches the pattern supplied as an argument. + The value against which a comparison is to be made - + - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. + Tolerance used in making the comparison - + - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. + ComparisonAdapter to be used in making the comparison - + - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. + Initializes a new instance of the class. + The value against which to make a comparison. - + - Returns a constraint that tests whether the actual value falls - within a specified range. + Test whether the constraint is satisfied by a given value + The value to be tested + A ConstraintResult - + - Returns a ConstraintExpression that negates any - following constraint. + Protected function overridden by derived class to actually perform the comparison - + - Returns a ConstraintExpression that negates any - following constraint. + Modifies the constraint to use an and returns self + The comparer used for comparison tests + A constraint modified to use the given comparer - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. + Modifies the constraint to use an and returns self + The comparer used for comparison tests + A constraint modified to use the given comparer - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. + Modifies the constraint to use a and returns self + The comparer used for comparison tests + A constraint modified to use the given comparer - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. + Set the tolerance for use in this comparison - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. + Switches the .Within() modifier to interpret its tolerance as + a percentage that the actual values is allowed to deviate from + the expected value. + Self - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. + Delegate used to delay evaluation of the actual value + to be used in evaluating a constraint - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. + The Constraint class is the base of all built-in constraints + within NUnit. It provides the operator overloads used to combine + constraints. - + - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. + Construct a constraint with optional arguments + Arguments to be saved - + - Returns a constraint that tests for null + 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 constraint that tests for True + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - + - Returns a constraint that tests for False + Arguments provided to this Constraint, for use in + formatting the description. - + - Returns a constraint that tests for a positive value + The ConstraintBuilder holding this constraint - + - Returns a constraint that tests for a negative value + Applies the constraint to an actual value, returning a ConstraintResult. + The value to be tested + A ConstraintResult - + - Returns a constraint that tests for NaN + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + An ActualValueDelegate + A ConstraintResult - + - Returns a constraint that tests for empty + Test whether the constraint is satisfied by a given reference. + The default implementation simply dereferences the value but + derived classes may override it to provide for delayed processing. + A reference to the value to be tested + A ConstraintResult - + - Returns a constraint that tests whether a collection - contains all unique items. + Retrieves the value to be tested from an ActualValueDelegate. + The default implementation simply evaluates the delegate but derived + classes may override it to provide for delayed processing. + An ActualValueDelegate + Delegate evaluation result - + - Returns a constraint that tests whether an object graph is serializable in binary format. + Default override of ToString returns the constraint DisplayName + followed by any arguments within angle brackets. + - + - Returns a constraint that tests whether an object graph is serializable in xml format. + Returns the string representation of this constraint - + - Returns a constraint that tests whether a collection is ordered + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. - + - 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. + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. - The actual value to test - A Constraint to be applied - + - 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. + This operator creates a constraint that is satisfied if the + argument constraint is not satisfied. - The actual value to test - A Constraint to be applied - The message to be displayed in case of 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. + Returns a ConstraintExpression by appending And + to the current constraint. - The actual value to test - A Constraint to be applied - The message to be displayed in case of failure - Arguments to use in formatting the message - + - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to - . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message + Returns a ConstraintExpression by appending And + to the current constraint. + - + - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to - . + Returns a ConstraintExpression by appending Or + to the current constraint. - 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 to . + Returns a DelayedConstraint.WithRawDelayInterval with the specified delay time. - The evaluated condition + The delay, which defaults to milliseconds. + - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Returns a DelayedConstraint with the specified delay time + and polling interval. - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested + The delay in milliseconds. + The interval at which to test the constraint. + - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Resolves any pending operators and returns the resolved constraint. - 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. + ConstraintBuilder maintains the stacks that are used in + processing a ConstraintExpression. An OperatorStack + is used to hold operators that are waiting for their + operands to be reorganized. a ConstraintStack holds + input constraints as well as the results of each + operator applied. - 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. + OperatorStack is a type-safe stack for holding ConstraintOperators - The actual value to test - A Constraint to be applied - + - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Initializes a new instance of the class. - The actual value to test - A Constraint to be applied - The message that will be displayed on failure + The ConstraintBuilder using this stack. - + - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Gets a value indicating whether this is empty. - The actual value to test - A Constraint to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message + true if empty; otherwise, false. - + - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. + Gets the topmost operator without modifying the stack. - A TestDelegate to be executed - A ThrowsConstraint used in the test - + - Returns a ListMapper based on a collection. + Pushes the specified operator onto the stack. - The original collection - + The operator to put onto the stack. - + - 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. + Pops the topmost operator from the stack. + The topmost operator on the stack - + - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. + ConstraintStack is a type-safe stack for holding Constraints - - - + - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. + Initializes a new instance of the class. - - + The ConstraintBuilder using this stack. - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Gets a value indicating whether this is empty. - A Constraint expression to be applied - The actual value to test + true if empty; otherwise, false. - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Pushes the specified constraint. As a side effect, + the constraint's Builder field is set to the + ConstraintBuilder owning this stack. - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure + The constraint to put onto the stack - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Pops this topmost constraint from the stack. + As a side effect, the constraint's Builder + field is set to null. - 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 + The topmost contraint on the stack - + - 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 + Initializes a new instance of the class. + - + - Asserts that a condition is true. If the condition is false the method throws - an . + Appends the specified operator to the expression by first + reducing the operator stack and then pushing the new + operator on the stack. - The evaluated condition - The message to display if the condition is false + The operator to push. - + - Asserts that a condition is true. If the condition is false the - method throws an . + Appends the specified constraint to the expression by pushing + it on the constraint stack. - The evaluated condition + The constraint to push. - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Sets the top operator right context. - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested + The right context. - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Reduces the operator stack until the topmost item + precedence is greater than or equal to the target precedence. - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - The message that will be displayed on failure + The target precedence. - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Resolves this instance, returning a Constraint. If the Builder + is not currently in a resolvable state, an exception is thrown. - 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 + The resolved constraint - + - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Gets a value indicating whether this instance is resolvable. - A Constraint expression to be applied - The actual value to test + + true if this instance is resolvable; otherwise, false. + + + + + ConstraintExpression represents a compound constraint in the + process of being constructed from a series of syntactic elements. + + Individual elements are appended to the expression as they are + reorganized. When a constraint is appended, it is returned as the + value of the operation so that modifiers may be applied. However, + any partially built expression is attached to the constraint for + later resolution. When an operator is appended, the partial + expression is returned. If it's a self-resolving operator, then + a ResolvableConstraintExpression is returned. + - + - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + The ConstraintBuilder holding the elements recognized so far - 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. + Initializes a new instance of the class. - 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 the code represented by a delegate throws an exception - that satisfies the constraint provided. + Initializes a new instance of the + class passing in a ConstraintBuilder, which may be pre-populated. - A TestDelegate to be executed - A ThrowsConstraint used in the test + The builder. - + - Waits for pending asynchronous operations to complete, if appropriate, - and returns a proper result of the invocation by unwrapping task results + 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. - The raw result of the method invocation - The unwrapped result, if necessary + - + - A set of Assert methods operationg on one or more collections + Appends an operator to the expression and returns the + resulting expression itself. - + - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. + Appends a self-resolving operator to the expression and + returns a new ResolvableConstraintExpression. - - - + - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. + Appends a constraint to the expression and returns that + constraint, which is associated with the current state + of the expression being built. Note that the constraint + is not reduced at this time. For example, if there + is a NotOperator on the stack we don't reduce and + return a NotConstraint. The original constraint must + be returned because it may support modifiers that + are yet to be applied. - - - + - Asserts that all items contained in collection are of the type specified by expectedType. + Returns a ConstraintExpression that negates any + following constraint. - 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. + Returns a ConstraintExpression that negates any + following constraint. - 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. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. - 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. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. - IEnumerable containing objects to be considered - + - Asserts that all items contained in collection are not equal to null. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. - 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. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. - 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. + Returns a , which will + apply the following constraint to a collection of length one, succeeding + only if exactly one of them succeeds. - IEnumerable of objects to be considered - + - Ensures that every object contained in collection exists within the collection - once and only once. + 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. - 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. + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. - 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. + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. - 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. + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. - 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. + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. - 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. + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. - 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. + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. - 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. + With is currently a NOP - reserved for future use. - 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. + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. - 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. + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. - 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. + Returns a constraint that tests for null - 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. + Returns a constraint that tests for True - 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. + Returns a constraint that tests for False - 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. + Returns a constraint that tests for a positive value - 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. + Returns a constraint that tests for a negative value - 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. + Returns a constraint that tests if item is equal to zero - 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. + Returns a constraint that tests for NaN - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - + - Asserts that expected and actual are not equivalent. + Returns a constraint that tests for empty - 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. + Returns a constraint that tests whether a collection + contains all unique items. - 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. + Returns a constraint that tests whether an object graph is serializable in binary format. - IEnumerable of objects to be considered - Object to be found within collection - + - Asserts that collection contains actual as an item. + Returns a constraint that tests whether an object graph is serializable in xml format. - 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. + Returns a constraint that tests two items for equality - 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. + Returns a constraint that tests that two references are the same object - IEnumerable of objects to be considered - Object that cannot exist within collection - + - Asserts that collection does not contain actual as an item. + Returns a constraint that tests whether the + actual value is greater than the supplied argument - 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. + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument - 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. + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument - The IEnumerable superset to be considered - The IEnumerable subset to be considered - + - Asserts that superset is not a subject of subset. + Returns a constraint that tests whether the + actual value is less than the supplied argument - 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. + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument - 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. + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument - The IEnumerable superset to be considered - The IEnumerable subset to be considered - + - Asserts that superset is a subset of subset. + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. - 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. + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. - 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 + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. - 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 + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. - 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 + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - An array, list or other collection implementing IEnumerable - + - Assert that an array, list or other collection is empty + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - 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 + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - 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 + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - An array, list or other collection implementing IEnumerable - + - Assert that an array, list or other collection is ordered + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. - 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 + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. - 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 + Returns a constraint that tests whether the actual value + is a superset of the collection supplied as an argument. - An array, list or other collection implementing IEnumerable - + - Assert that an array, list or other collection is ordered + Returns a constraint that tests whether a 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 + Returns a new checking for the + presence of a particular object in the collection. - 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 + Returns a new checking for the + presence of a particular object in the collection. - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - + - Helper class with properties and methods that supply - a number of constraints used in Asserts. + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. - + - Returns a new CollectionContainsConstraint checking for the + Returns a new checking for the presence of a particular object in the collection. - + - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. + 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. - + - Summary description for DirectoryAssert + Returns a new DictionaryContainsKeyConstraint checking for the + presence of a particular key in the Dictionary key collection. + The key to be matched in the Dictionary key collection - + - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. + Returns a new DictionaryContainsValueConstraint checking for the + presence of a particular value in the Dictionary value collection. - - + The value to be matched in the Dictionary value collection - + - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. - - - + - 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. + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. - + - 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. + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. - 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. + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. - 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. + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. - 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. + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. - 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. + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. - 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. + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. - 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. + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. - 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. + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. - 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. + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. - 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. + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. - 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. + Returns a constraint that tests whether the path provided + is the a subpath of the expected path after canonicalization. - 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. + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. - 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. + Returns a constraint that tests whether the actual value falls + inclusively within a specified range. - A directory to search - The message to display if directories are not equal - Arguments to be used in formatting the message + Inclusive beginning of the range. + Inclusive end of the range. - + - Asserts that the directory is empty. If it is not empty - an is thrown. + Returns a constraint that succeeds if the value + is a file or directory and it exists. - 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. + 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. - A directory to search - + - Asserts that the directory is empty. If it is not empty - an is thrown. + Initializes a new instance of the class. - A directory to search - The message to display if directories are not equal - Arguments to be used in formatting the message + The expected value contained within the string/collection. - + - Asserts that the directory is empty. If it is not empty - an is thrown. + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + Flag the constraint to ignore case and return self. - A directory to search - + - Asserts that the directory is not empty. If it is empty - an is thrown. + Test whether the constraint is satisfied by a given value - A directory to search - The message to display if directories are not equal - Arguments to be used in formatting the message + The value to be tested + True for success, false for failure - + - Asserts that the directory is not empty. If it is empty - an is thrown. + Applies a delay to the match so that a match can be evaluated in the future. - 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. + Allows only changing the time dimension of delay interval and setting a polling interval of a DelayedConstraint - A directory to search - + - Asserts that the directory is not empty. If it is empty - an is thrown. + Creates a new DelayedConstraint.WithRawDelayInterval - A directory to search - The message to display if directories are not equal - Arguments to be used in formatting the message + Parent DelayedConstraint on which delay interval dimension is required to be set - + - Asserts that the directory is not empty. If it is empty - an is thrown. + Changes delay interval dimension to minutes - 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. + Changes delay interval dimension to seconds - A directory to search - + - Asserts that path contains actual as a subdirectory or - an is thrown. + Changes delay interval dimension to milliseconds - 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. + Set polling interval, in milliseconds - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path + A time interval, in milliseconds + - + - Asserts that path contains actual as a subdirectory or - an is thrown. + Allows only setting the polling interval of a DelayedConstraint - A directory to search - sub-directory asserted to exist under directory - + - Asserts that path contains actual as a subdirectory or - an is thrown. + Creates a new DelayedConstraint.WithDimensionedDelayInterval - 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 + Parent DelayedConstraint on which polling interval is required to be set - + - Asserts that path contains actual as a subdirectory or - an is thrown. + Set polling interval, in milliseconds - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path + A time interval, in milliseconds + - + - Asserts that path contains actual as a subdirectory or - an is thrown. + Allows only changing the time dimension of the polling interval of a DelayedConstraint - 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. + Creates a new DelayedConstraint.WithRawPollingInterval - 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 + Parent DelayedConstraint on which polling dimension is required to be set - + - Asserts that path does not contain actual as a subdirectory or - an is thrown. + Changes polling interval dimension to minutes - 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. + Changes polling interval dimension to seconds - 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. + Changes polling interval dimension to milliseconds - 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. + Delay value store as an Interval object - 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. + Polling value stored as an Interval object - A directory to search - sub-directory asserted to exist under directory - + - Summary description for FileAssert. + Creates a new DelayedConstraint + The inner constraint to decorate + The time interval after which the match is performed + If the value of is less than 0 - + - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. + Creates a new DelayedConstraint - - + The inner constraint to decorate + The time interval after which the match is performed, in milliseconds + The time interval used for polling, in milliseconds + If the value of is less than 0 - + - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. + Gets text describing a constraint - - - + - 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. + 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 - + - 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. + Test whether the constraint is satisfied by a delegate - The expected Stream - The actual Stream - The message to display if Streams are not equal - Arguments to be used in formatting the message + The delegate whose value is to be tested + A ConstraintResult - + - 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. + 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. - The expected Stream - The actual Stream - The message to display if objects are not equal + A reference to the value to be tested + True for success, false for failure - + - 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. + Returns the string representation of the constraint. - 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. + Adjusts a Timestamp by a given TimeSpan - 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. + Returns the difference between two Timestamps as a TimeSpan - 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. + DictionaryContainsKeyConstraint is used to test whether a dictionary + contains an expected object as a key. - 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. + Construct a DictionaryContainsKeyConstraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. - The 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 Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + Gets the expected object - 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. + Test whether the expected key is contained in the dictionary - 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. + Flag the constraint to use the supplied predicate function - The expected Stream - The actual Stream - The message to be displayed when the Streams are the same. + The comparison function to use. + Self. - + - Asserts that two Streams are not equal. If they are equal - an is thrown. + EmptyCollectionConstraint tests whether a collection is empty. - The expected Stream - The actual Stream - + - Asserts that two files are not equal. If they are equal - an is thrown. + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + Check that the collection is empty - 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. + 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. - 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 Description of what this constraint tests, for + use in messages and in the ConstraintResult. - 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. + Test whether the constraint is satisfied by a given value - 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 + The value to be tested + True for success, false for failure - + - Asserts that two files are not equal. If they are equal - an is thrown. + EmptyDirectoryConstraint is used to test that a directory is empty - 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. + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - + - Default tolerance for floating point equality + Test whether the constraint is satisfied by a given value + The value to be tested + True for success, false for failure - + - Class used to guard against unexpected argument values - by throwing an appropriate exception. + EmptyStringConstraint tests whether a string is empty. - + - Throws an exception if an argument is null + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - The value to be tested - The name of the argument - + - Throws an exception if a string argument is null or empty + Test whether the constraint is satisfied by a given value - The value to be tested - The name of the argument + The value to be tested + True for success, false for failure - + - Helper class with properties and methods that supply - a number of constraints used in Asserts. + EndsWithConstraint can test whether a string ends + with an expected substring. - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. + Initializes a new instance of the class. + The expected string - + - 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. + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + - + - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. + 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. - + - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. + NUnitEqualityComparer used to test equality. - + - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. + Initializes a new instance of the class. + The expected value. - + - Returns a ConstraintExpression that negates any - following constraint. + Gets the tolerance for this comparison. + + The tolerance. + - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. + Gets a value indicating whether to compare case insensitive. + + true if comparing case insensitive; otherwise, false. + - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. + Gets a value indicating whether or not to clip strings. + + true if set to clip strings otherwise, false. + - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. + Gets the failure points. + + The failure points. + - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. + Flag the constraint to ignore case and return self. - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. + Flag the constraint to suppress string clipping + and return self. - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. + Flag the constraint to compare arrays as collections + and return self. - + - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. + Flag the constraint to use a tolerance when determining equality. + Tolerance value to be used + Self. - + - 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. + Flags the constraint to include + property in comparison of two values. + + Using this modifier does not allow to use the + constraint modifier. + - + - Method to handle an expected exception + Switches the .Within() modifier to interpret its tolerance as + a distance in representable values (see remarks). - The exception to be handled + 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. + - + - Helper class with properties and methods that supply - a number of constraints used in Asserts. + Switches the .Within() modifier to interpret its tolerance as + a percentage that the actual values is allowed to deviate from + the expected value. + Self - + - Returns a constraint that tests two items for equality + Causes the tolerance to be interpreted as a TimeSpan in days. + Self - + - Returns a constraint that tests that two references are the same object + Causes the tolerance to be interpreted as a TimeSpan in hours. + Self - + - Returns a constraint that tests whether the - actual value is greater than the suppled argument + Causes the tolerance to be interpreted as a TimeSpan in minutes. + Self - + - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument + Causes the tolerance to be interpreted as a TimeSpan in seconds. + Self - + - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument + Causes the tolerance to be interpreted as a TimeSpan in milliseconds. + Self - + - Returns a constraint that tests whether the - actual value is less than the suppled argument + Causes the tolerance to be interpreted as a TimeSpan in clock ticks. + Self - + - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument + Flag the constraint to use the supplied IComparer object. + The IComparer object to use. + Self. - + - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument + Flag the constraint to use the supplied IComparer object. + The IComparer object to use. + Self. - + - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. + Flag the constraint to use the supplied boolean-returning delegate. + The boolean-returning delegate to use. + Self. - + - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. + Flag the constraint to use the supplied Comparison object. + The IComparer object to use. + Self. - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Flag the constraint to use the supplied IEqualityComparer object. + The IComparer object to use. + Self. - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Flag the constraint to use the supplied IEqualityComparer object. + The IComparer object to use. + Self. - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Flag the constraint to use the supplied predicate function + The comparison function to use. + Self. - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Test whether the constraint is satisfied by a given value + The value to be tested + True for success, false for failure - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + EqualityAdapter class handles all equality comparisons + that use an , + or a . - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Compares two objects, returning true if they are equal - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Returns true if the two objects can be compared by this adapter. + The base adapter cannot handle IEnumerables except for strings. - + - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. + Returns an that wraps an . - + - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. + that wraps an . - + - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. + Returns an that wraps an . - + - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. + Returns an EqualityAdapter that uses a predicate function for items comparison. + + + + - + - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. + Returns true if the two objects can be compared by this adapter. + The base adapter cannot handle IEnumerables except for strings. - + - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. + Compares two objects, returning true if they are equal - + - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. + Returns true if the two objects can be compared by this adapter. + Generic adapter requires objects of the specified type. - + - Returns a constraint that tests whether the path provided - is under an expected path after canonicalization. + Returns an that wraps an . - + - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. + Returns an that wraps an . - + - Returns a constraint that tests whether the actual value falls - within a specified range. + that wraps an . - + - Returns a ConstraintExpression that negates any - following constraint. + Returns an that wraps a . - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. + ExactTypeConstraint is used to test that an object + is of the exact type provided in the constructor - + - Returns a constraint that tests for null + Construct an ExactTypeConstraint for a given Type + The expected Type. - - - Returns a constraint that tests for True + + + 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 constraint that tests for False + Apply the constraint to an actual value, returning true if it succeeds + The actual argument + True if the constraint succeeds, otherwise false. - + - Returns a constraint that tests for a positive value + FalseConstraint tests that the actual value is false - + - Returns a constraint that tests for a negative value + Initializes a new instance of the class. - + - Returns a constraint that tests for NaN + Test whether the constraint is satisfied by a given value + The value to be tested + True for success, false for failure - + + Helper routines for working with floating point numbers + + + The floating point comparison code is based on this excellent article: + http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm + + + "ULP" means Unit in the Last Place and in the context of this library refers to + the distance between two adjacent floating point numbers. IEEE floating point + numbers can only represent a finite subset of natural numbers, with greater + accuracy for smaller numbers and lower accuracy for very large numbers. + + + If a comparison is allowed "2 ulps" of deviation, that means the values are + allowed to deviate by up to 2 adjacent floating point values, which might be + as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. + + + + + Union of a floating point variable and an integer + + + The union's value as a floating point variable + + + The union's value as an integer + + + The union's value as an unsigned integer + + + Union of a double precision floating point variable and a long + + + The union's value as a double precision floating point variable + + + The union's value as a long + + + The union's value as an unsigned long + + + Compares two floating point values for equality + First floating point value to be compared + Second floating point value t be compared + + Maximum number of representable floating point values that are allowed to + be between the left and the right floating point values + + True if both numbers are equal or close to being equal + + + Floating point values can only represent a finite subset of natural numbers. + For example, the values 2.00000000 and 2.00000024 can be stored in a float, + but nothing inbetween them. + + + This comparison will count how many possible floating point values are between + the left and the right number. If the number of possible values between both + numbers is less than or equal to maxUlps, then the numbers are considered as + being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + Compares two double precision floating point values for equality + First double precision floating point value to be compared + Second double precision floating point value t be compared + + Maximum number of representable double precision floating point values that are + allowed to be between the left and the right double precision floating point values + + True if both numbers are equal or close to being equal + + + Double precision floating point values can only represent a limited series of + natural numbers. For example, the values 2.0000000000000000 and 2.0000000000000004 + can be stored in a double, but nothing inbetween them. + + + This comparison will count how many possible double precision floating point + values are between the left and the right number. If the number of possible + values between both numbers is less than or equal to maxUlps, then the numbers + are considered as being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + - Returns a constraint that tests for empty + 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 + - + - Returns a constraint that tests whether a collection - contains all unique items. + 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 + - + - Returns a constraint that tests whether an object graph is serializable in binary format. + 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 + - + - Returns a constraint that tests whether an object graph is serializable in xml format. + 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 + - + - Returns a constraint that tests whether a collection is ordered + Tests whether a value is greater than the value supplied to its constructor - + - 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. + Initializes a new instance of the class. + The expected value. - + - Gets the argument list to be provided to the test + Perform the comparison - + - Gets the expected result + Tests whether a value is greater than or equal to the value supplied to its constructor - + - Indicates whether a result has been specified. - This is necessary because the result may be - null, so it's value cannot be checked. + Initializes a new instance of the class. + The expected value. - + - Gets the expected exception Type + Perform the comparison - + - Gets the FullName of the expected exception + ConstraintStatus represents the status of a ConstraintResult + returned by a Constraint being applied to an actual value. - + - Gets the name to be used for the test + The status has not yet been set - + - Gets the description of the test + The constraint succeeded - + - Gets a value indicating whether this is ignored. + The constraint failed - true if ignored; otherwise, false. - + - Gets a value indicating whether this is explicit. + An error occurred in applying the constraint (reserved for future use) - true if explicit; otherwise, false. - + - Gets the ignore reason. + Contain the result of matching a against an actual value. - The ignore reason. - + - The Iz class is a synonym for Is intended for use in VB, - which regards Is as a keyword. + Constructs a for a particular . + The Constraint to which this result applies. + The actual value to which the Constraint was applied. - + - The List class is a helper class with properties and methods - that supply a number of constraints used with lists and collections. + Constructs a for a particular . + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + The status of the new ConstraintResult. - + - List.Map returns a ListMapper, which can be used to map - the original collection to another collection. + Constructs a for a particular . - - + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + If true, applies a status of Success to the result, otherwise Failure. - + - ListMapper is used to transform a collection used as an actual argument - producing another collection to be used in the assertion. + The actual value that was passed to the method. - + - Construct a ListMapper based on a collection + Gets and sets the ResultStatus for this result. - The collection to be transformed - + - Produces a collection containing all the values of a property + True if actual value meets the Constraint criteria otherwise false. - The collection of property values - - + - Randomizer returns a set of random values in a repeatable - way, to allow re-running of tests if necessary. + Display friendly name of the constraint. - + - 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. + Description of the constraint may be affected by the state the constraint had + when was performed against the actual value. - + - 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. + Write the failure message to the MessageWriter provided + as an argument. The default implementation simply passes + the result and the actual value to the writer, which + then displays the constraint description and the value. + + Constraints that need to provide additional details, + such as where the error occurred, can override this. + The MessageWriter on which to display the message - + - Construct a randomizer using a random seed + 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 - + - Construct a randomizer using a specified seed + InstanceOfTypeConstraint is used to test that an object + is of the same type provided or derived from it. - + - Return an array of random doubles between 0.0 and 1.0. + Construct an InstanceOfTypeConstraint for the type provided - - + The expected Type - - - Return an array of random doubles with values in a specified range. + + + 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. - + - Return an array of random ints with values in a specified range. + Apply the constraint to an actual value, returning true if it succeeds + The actual argument + True if the constraint succeeds, otherwise false. - + - Get a random seed for use in creating a randomizer. + The IResolveConstraint interface is implemented by all + complete and resolvable constraints and expressions. - + - The SpecialValue enum is used to represent TestCase arguments - that cannot be used as arguments to an Attribute. + Return the top-level constraint for this expression + - + - Null represents a null value, which cannot be used as an - argument to an attribute under .NET 1.x + Tests whether a value is less than the value supplied to its constructor - + - Basic Asserts on strings. + Initializes a new instance of the class. + The expected value. - + - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. + Perform the comparison - - - + - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. + Tests whether a value is less than or equal to the value supplied to its constructor - - - + - Asserts that a string is found within another string. + Initializes a new instance of the class. - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message + The expected value. - + - Asserts that a string is found within another string. + Perform the comparison - 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. + 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. - The expected string - The string to be examined - + - Asserts that a string is not found within another string. + Construct a MessageWriter given a culture - 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. + Abstract method to get the max line length - 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. + Method to write single line message with optional args, usually + written to precede the general failure message. - The expected string - The string to be examined + The message to be written + Any arguments used in formatting the message - + - Asserts that a string starts with another string. + Method to write single line message with optional args, usually + written to precede the general failure message, at a given + indentation level. - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message + The indentation level of the message + The message to be written + Any arguments used in formatting the message - + - Asserts that a string starts with another string. + 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 expected string - The string to be examined - The message to display in case of failure + The failing constraint result - + - Asserts that a string starts with another string. + 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 string - The string to be examined + The expected value + The actual value causing the failure - + - Asserts that a string does not start with another string. + Display Expected and Actual lines for given values, including + a tolerance value on the Expected line. - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message + The expected value + The actual value causing the failure + The tolerance within which the test was made - + - Asserts that a string does not start with another string. + 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 - The string to be examined - The message to display in case of failure + 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 - + - Asserts that a string does not start with another string. + Writes the text for an actual value. - The expected string - The string to be examined + The actual value. - + - Asserts that a string ends with another string. + Writes the text for a generalized value. - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message + The value. - + - Asserts that a string ends with another string. + Writes the text for a collection value, + starting at a particular point, to a max length - The expected string - The string to be examined - The message to display in case of failure + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write - + - Asserts that a string ends with another string. + Custom value formatter function - The expected string - The string to be examined + The value + - + - Asserts that a string does not end with another string. + Custom value formatter factory function - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message + The next formatter function + ValueFormatter + If the given formatter is unable to handle a certain format, it must call the next formatter in the chain - + - Asserts that a string does not end with another string. + Static methods used in creating messages - 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. + Static string used when strings are clipped - The expected string - The string to be examined - + - Asserts that two strings are equal, without regard to case. + Formatting strings used for expected and actual values - 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. + Current head of chain of value formatters. Public for testing. - The expected string - The actual string - The message to display in case of failure - + - Asserts that two strings are equal, without regard to case. + Add a formatter to the chain of responsibility. - The expected string - The actual string + - + - Asserts that two strings are not equal, without regard to case. + Formats text to represent a generalized value. - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message + The value + The formatted text - + - Asserts that two strings are Notequal, without regard to case. + Formats text for a collection value, + starting at a particular point, to a max length - The expected string - The actual string - The message to display in case of failure + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write - + - Asserts that two strings are not equal, without regard to case. - - The expected string - The actual string + 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. + + + - + - Asserts that a string matches an expected regular expression pattern. + Converts any control characters in a string + to their escaped representation. - The regex pattern to be matched - The actual string - The message to display in case of failure - Arguments used in formatting the message + The string to be converted + The converted string - + - Asserts that a string matches an expected regular expression pattern. + Converts any null characters in a string + to their escaped representation. - The regex pattern to be matched - The actual string - The message to display in case of failure + The string to be converted + The converted string - + - Asserts that a string matches an expected regular expression pattern. + Return the a string representation for a set of indices into an array - The regex pattern to be matched - The actual string + Array of indices for which a string is needed - + - Asserts that a string does not match an expected regular expression pattern. + Get an array of indices representing the point in a collection or + array corresponding to a single int index into the collection. - The regex pattern to be used - The actual string - The message to display in case of failure - Arguments used in formatting the message + The collection to which the indices apply + Index in the collection + Array of indices - + - Asserts that a string does not match an expected regular expression pattern. + Clip a string to a given length, starting at a particular offset, returning the clipped + string with ellipses representing the removed parts - The regex pattern to be used - The actual string - The message to display in case of failure + The string to be clipped + The maximum permitted length of the result string + The point at which to start clipping + The clipped string - + - Asserts that a string does not match an expected regular expression pattern. + Clip the expected and actual strings in a coordinated fashion, + so that they may be displayed together. - 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. + 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 argument list to be provided to the test + NaNConstraint tests that the actual value is a double or float NaN - + - The expected result to be returned + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - + - Set to true if this has an expected result + Test that the actual value is an NaN + + - + - The expected exception Type + NoItemConstraint applies another constraint to each + item in a collection, failing if any of them succeeds. - + - The FullName of the expected exception + Construct a SomeItemsConstraint on top of an existing constraint + - - - The name to be used for the test + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. - + - The description of the test + Apply the item constraint to each item in the collection, + failing if any item fails. + + - + - A dictionary of properties, used to add information - to tests without requiring the class to change. + NotConstraint negates the effect of some other constraint - + - If true, indicates that the test case is to be ignored + Initializes a new instance of the class. + The base constraint to be negated. - + - If true, indicates that the test case is marked explicit + 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 - + - The reason for ignoring a test case + NullConstraint tests that the actual value is null - + - Initializes a new instance of the class. + Initializes a new instance of the class. - The arguments. - + - Initializes a new instance of the class. + Applies the constraint to an actual value, returning a ConstraintResult. - The argument. + The value to be tested + A ConstraintResult - + - Initializes a new instance of the class. + The Numerics class contains common operations on numeric values. - The first argument. - The second argument. - + - Initializes a new instance of the class. + Checks the type of the object, returning true if + the object is a numeric type. - The first argument. - The second argument. - The third argument. + The object to check + true if the object is a numeric type - + - Sets the expected result for the test + Checks the type of the object, returning true if + the object is a floating point numeric type. - The expected result - A modified TestCaseData + The object to check + true if the object is a floating point numeric type - + - Sets the expected exception type for the test + Checks the type of the object, returning true if + the object is a fixed point numeric type. - Type of the expected exception. - The modified TestCaseData instance + The object to check + true if the object is a fixed point numeric type - + - Sets the expected exception type for the test + 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. - FullName of the expected exception. - The modified TestCaseData instance + The expected value + The actual value + A reference to the tolerance in effect + True if the values are equal - + - Sets the name of the test case + Compare two numeric values, performing the usual numeric conversions. - The modified TestCaseData instance + The expected value + The actual value + The relationship of the values to each other - + - Sets the description for the test case - being constructed. + NUnitComparer encapsulates NUnit's default behavior + in comparing two objects. - The description. - The modified TestCaseData instance. - + - Applies a category to the test + Returns the default NUnitComparer. - - - + - Applies a named property to the test + Compares two objects - - + + - + - Applies a named property to the test + NUnitEqualityComparer encapsulates NUnit's handling of + equality tests between objects. - - - - + - Applies a named property to the test + If true, all string comparisons will ignore case - - - - + - Ignores this TestCase. + If true, arrays will be treated as collections, allowing + those of different dimensions to be compared - - + - Ignores this TestCase, specifying the reason. + Comparison objects used in comparisons for some constraints. - The reason. - - + - Marks this TestCase as Explicit + List of points at which a failure occurred. - - + - Marks this TestCase as Explicit, specifying the reason. + List of comparers used to compare pairs of objects. - The reason. - - + - Gets the argument list to be provided to the test + Returns the default NUnitEqualityComparer - + - Gets the expected result + Gets and sets a flag indicating whether case should + be ignored in determining equality. - + - Returns true if the result has been set + Gets and sets a flag indicating that arrays should be + compared as collections, without regard to their shape. - + - Gets the expected exception Type + Gets the list of external comparers to be used to + test for equality. They are applied to members of + collections, in place of NUnit's own logic. - + - Gets the FullName of the expected exception + Gets the list of failure points for the last Match performed. + The list consists of objects to be interpreted by the caller. + This generally means that the caller may only make use of + objects it has placed on the list at a particular depth. - + - Gets the name to be used for the test + Flags the comparer to include + property in comparison of two values. + + Using this modifier does not allow to use the + modifier. + - + - Gets the description of the test + Compares two objects for equality within a tolerance. - + - Gets a value indicating whether this is ignored. + FailurePoint class represents one point of failure + in an equality test. - true if ignored; otherwise, false. - + - Gets a value indicating whether this is explicit. + The location of the failure - true if explicit; otherwise, false. - + - Gets the ignore reason. + The expected value - The ignore reason. - + - Gets a list of categories associated with this test. + The actual value - + - Gets the property dictionary for this test + Indicates whether the expected value is valid - + - Provide the context information of the current test + Indicates whether the actual value is valid - + - Constructs a TestContext using the provided context dictionary + Operator that requires both it's arguments to succeed - 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. + Construct an AndOperator - + - Gets a TestAdapter representing the currently executing test in this context. + Apply the operator to produce an AndConstraint - + - Gets a ResultAdapter representing the current result for the test - executing in this context. + Operator that tests for the presence of a particular attribute + on a type and optionally applies further tests to the attribute. - + - Gets the directory containing the current test assembly. + Construct an AttributeOperator for a particular Type + The Type of attribute tested - + - Gets the directory to be used for outputing files created - by this test run. + 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. - + - TestAdapter adapts a Test for consumption by - the user test code. + Abstract base class for all binary operators - + - Constructs a TestAdapter for this context + 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 context dictionary + - + - The name of the test. + Gets the left precedence of the operator - + - The FullName of the test + Gets the right precedence of the operator - + - The properties of the test. + Abstract method that produces a constraint by applying + the operator to its left and right constraint arguments. - + - ResultAdapter adapts a TestResult for consumption by - the user test code. + Abstract base for operators that indicate how to + apply a constraint to items in a collection. - + - Construct a ResultAdapter for a context + Constructs a CollectionOperator - 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 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 TestStatus of current test. This enum will be used - in future versions of NUnit and so is to be preferred - to the TestState value. + The precedence value used when the operator + is about to be pushed to the stack. - + - Provides details about a test + The precedence value used when the operator + is on the top of the stack. - + - Creates an instance of TestDetails + The syntax element preceding this operator - 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 syntax element following this operator - + - The method that implements the test, if available. + The precedence value used when the operator + is about to be pushed to the stack. - + - The full name of the test. + The precedence value used when the operator + is on the top of the stack. - + - A string representing the type of test, e.g. "Test Case". + 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. + - + - Indicates if the test represents a suite of tests. + Negates the test of the constraint it wraps. - + - The ResultState enum indicates the result of running a test + Constructs a new NotOperator - + - The result is inconclusive + Returns a NotConstraint applied to its argument. - + - The test was not runnable. + Operator that requires at least one of it's arguments to succeed - + - The test has been skipped. + Construct an OrOperator - + - The test has been ignored. + Apply the operator to produce an OrConstraint - + - The test succeeded + PrefixOperator takes a single constraint and modifies + it's action in some way. - + - The test failed + 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 test encountered an unexpected exception + Returns the constraint created by applying this + prefix to another constraint. + + - + - The test was cancelled by the user + 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. - + - The TestStatus enum indicates the result of running a test + Gets the name of the property to which the operator applies - + - The test was inconclusive + Constructs a PropOperator for a particular named property - + - The test has skipped + 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 test succeeded + Abstract base class for operators that are able to reduce to a + constraint whether or not another syntactic element follows. - + - The test failed + Operator that tests that an exception is thrown and + optionally applies further tests to the exception. - + - Helper class with static methods used to supply constraints - that operate on strings. + Construct a ThrowsOperator - + - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. + 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 a constraint that fails if the actual - value contains the substring supplied as an argument. + Represents a constraint that simply wraps the + constraint provided as an argument, without any + further functionality, but which modifies the + order of evaluation because of its precedence. - + - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. + Constructor for the WithOperator - + - Returns a constraint that fails if the actual - value starts with the substring supplied as an argument. + Returns a constraint that wraps its argument - + - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. + OrConstraint succeeds if either member succeeds - + - Returns a constraint that fails if the actual - value ends with the substring supplied as an argument. + Create an OrConstraint from two other constraints + The first constraint + The second constraint - + - Returns a constraint that succeeds if the actual - value matches the Regex pattern supplied as an argument. + Gets text describing a constraint - + - Returns a constraint that fails if the actual - value matches the pattern supplied as an argument. + 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 - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. + PathConstraint serves as the abstract base of constraints + that operate on paths and provides several helper methods. - + - 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. + Construct a PathConstraint for a give expected path + The expected path - + - 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. + Modifies the current instance to be case-sensitive + and returns it. - + - Construct a MessageWriter given a culture + Returns the string representation of this constraint - + - Method to write single line message with optional args, usually - written to precede the general failure message. + Canonicalize the provided path - The message to be written - Any arguments used in formatting the message + + The path in standardized form - + - Method to write single line message with optional args, usually - written to precede the general failure message, at a givel - indentation level. + Test whether one path in canonical form is a subpath of another path - The indentation level of the message - The message to be written - Any arguments used in formatting the message + The first path - supposed to be the parent path + The second path - supposed to be the child path + - + - 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. + Predicate constraint wraps a Predicate in a constraint, + returning success if the predicate is true. - 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. + Construct a PredicateConstraint from a predicate - 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. + Gets text describing a constraint - 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. + Determines whether the predicate succeeds when applied + to the actual value. - 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. + Abstract base class used for prefixes - The connector. - + - Writes the text for a predicate. + The base constraint - The predicate. - + - Writes the text for an expected value. + Prefix used in forming the constraint description - The expected value. - + - Writes the text for a modifier + Construct given a base constraint - The modifier. + - + - Writes the text for an actual value. + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - The actual value. - + - Writes the text for a generalized value. + Formats a prefix constraint's description. - The value. - + - Writes the text for a collection value, - starting at a particular point, to a max length + PropertyConstraint extracts a named property and uses + its value as the actual value for a chained constraint. - 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 + Initializes a new instance of the class. + The name. + The constraint to apply to the property. - + - Prefix used for the expected value line of a message + Test whether the constraint is satisfied by a given value + The value to be tested - + - Prefix used for the actual value line of a message + Returns the string representation of the constraint. - + - Length of a message prefix + PropertyExistsConstraint tests that a named property + exists on the object provided through Match. + + Originally, PropertyConstraint provided this feature + in addition to making optional tests on the value + of the property. The two constraints are now separate. - + - Construct a TextMessageWriter + Initializes a new instance of the class. + The name of the property. - + - Construct a TextMessageWriter, specifying a user message - and optional formatting arguments. + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - - - + - Method to write single line message with optional args, usually - written to precede the general failure message, at a givel - indentation level. + Test whether the property exists for a given object - The indentation level of the message - The message to be written - Any arguments used in formatting the message + The object to be tested + True for success, false for failure - + - 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. + Returns the string representation of the constraint. - 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. + RangeConstraint tests whether two values are within a + specified range. - 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. + Initializes a new instance of the class. - The expected value - The actual value causing the failure - The tolerance within which the test was made + Inclusive beginning of the range. + Inclusive end of the range. - + - 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. + Gets text describing a constraint - 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. + Test whether the constraint is satisfied by a given value - The connector. + The value to be tested + True for success, false for failure - + - Writes the text for a predicate. + Modifies the constraint to use an and returns self. - The predicate. - + - Write the text for a modifier. + Modifies the constraint to use an and returns self. - The modifier. - + - Writes the text for an expected value. + Modifies the constraint to use a and returns self. - The expected value. - + - Writes the text for an actual value. + RegexConstraint can test whether a string matches + the pattern provided. - The actual value. - + - Writes the text for a generalized value. + Initializes a new instance of the class. - The value. + The pattern. - + - Writes the text for a collection value, - starting at a particular point, to a max length + Test whether the constraint is satisfied by a given value - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write + The value to be tested + True for success, false for failure - + - Write the generic 'Expected' line for a constraint + 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. - The constraint that failed - + - Write the generic 'Expected' line for a given value + Create a new instance of ResolvableConstraintExpression - The expected value - + - Write the generic 'Expected' line for a given value - and tolerance. + Create a new instance of ResolvableConstraintExpression, + passing in a pre-populated ConstraintBuilder. - The expected value - The tolerance within which the test was made - + - Write the generic 'Actual' line for a constraint + Appends an And Operator to the expression - The constraint for which the actual value is to be written - + - Write the generic 'Actual' line for a given value + Appends an Or operator to the expression. - The actual value causing a failure - + - Gets or sets the maximum line length for this writer + Resolve the current expression to a Constraint - + - Helper class with properties and methods that supply - constraints that operate on exceptions. + ReusableConstraint wraps a constraint expression after + resolving it so that it can be reused consistently. - + - Creates a constraint specifying the exact type of exception expected + Construct a ReusableConstraint from a constraint expression + The expression to be resolved and reused - + - Creates a constraint specifying the exact type of exception expected + Converts a constraint to a ReusableConstraint + The constraint to be converted + A ReusableConstraint - + - Creates a constraint specifying the type of exception expected + Returns a that represents this instance. + + A that represents this instance. + - + - Creates a constraint specifying the type of exception expected + Return the top-level constraint for this expression + - + - Creates a constraint specifying an expected exception + SameAsConstraint tests whether an object is identical to + the object passed to its constructor - + - Creates a constraint specifying an exception with a given InnerException + Initializes a new instance of the class. + The expected object. - + - Creates a constraint specifying an expected TargetInvocationException + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - + - Creates a constraint specifying an expected TargetInvocationException + Test whether the constraint is satisfied by a given value + The value to be tested + True for success, false for failure - + - Creates a constraint specifying an expected TargetInvocationException + Summary description for SamePathConstraint. - + - Creates a constraint specifying that no exception is thrown + Initializes a new instance of the class. + The expected path - + - Attribute used to apply a category to a test + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - + - The name of the category + Test whether the constraint is satisfied by a given value + The value to be tested + True for success, false for failure - + - 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. + SamePathOrUnderConstraint tests that one path is under another - The name of the category - + - Protected constructor uses the Type name as the name - of the category. + Initializes a new instance of the class. + The expected path - + - The name of the category + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - + - 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. + Test whether the constraint is satisfied by a given value + The value to be tested + True for success, false for failure - + - 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. + SomeItemsConstraint applies another constraint to each + item in a collection, succeeding if any of them succeeds. - + - Attribute used to provide descriptive text about a - test case or fixture. + Construct a SomeItemsConstraint on top of an existing constraint + - - - Construct the attribute + + + 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. - Text describing the test - + - Gets the test description + Apply the item constraint to each item in the collection, + succeeding if any item succeeds. + + - + - Enumeration indicating how the expected message parameter is to be used + Flag the constraint to use the supplied object. + The type of the elements in the collection. + The type of the member. + The comparison function to use. + Self. - - 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 + Flag the constraint to use the supplied object. - + The IComparer object to use. + Self. - + - Constructor for a non-specific exception + Flag the constraint to use the supplied object. + The IComparer object to use. + Self. - + - Constructor for a given type of exception + Flag the constraint to use the supplied object. - The type of the expected exception + The IComparer object to use. + Self. - + - Constructor for a given exception name + Flag the constraint to use the supplied object. - The full name of the expected exception + The IComparer object to use. + Self. - + - Gets or sets the expected exception type + Flag the constraint to use the supplied object. + The IComparer object to use. + Self. - + - Gets or sets the full Type name of the expected exception + StartsWithConstraint can test whether a string starts + with an expected substring. - + - Gets or sets the expected message text + Initializes a new instance of the class. + The expected string - + - Gets or sets the user message displayed in case of failure + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + - + - Gets or sets the type of match to be performed on the expected message + StringConstraint is the abstract base for constraints + that operate on strings. It supports the IgnoreCase + modifier for string operations. - + - Gets the name of a method to be used as an exception handler + The expected value - + - 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. + Indicates whether tests should be case-insensitive - + - Default constructor + Description of this constraint - + - Constructor with a reason + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - The reason test is marked explicit - + - The reason test is marked explicit + Constructs a StringConstraint without an expected value - + - Attribute used to mark a test that is to be ignored. - Ignored tests result in a warning message when the - tests are run. + Constructs a StringConstraint given an expected value + The expected value - + - Constructs the attribute without giving a reason - for ignoring the test. + Modify the constraint to ignore case in matching. - + - Constructs the attribute giving a reason for ignoring the test + Test whether the constraint is satisfied by a given value - The reason for ignoring the test + The value to be tested + True for success, false for failure - + - The reason for ignoring a test + Test whether the constraint is satisfied by a given string + The string to be tested + True for success, false for failure - + - Abstract base for Attributes that are used to include tests - in the test run based on environmental settings. + SubstringConstraint can test whether a string contains + the expected substring. - + - Constructor with no included items specified, for use - with named property syntax. + Initializes a new instance of the class. + The expected. - + - Constructor taking one or more included items + Modify the constraint to ignore case in matching. + This will call Using(StringComparison.CurrentCultureIgnoreCase). - Comma-delimited list of included items + Thrown when a comparison type different + than was already set. - + - Name of the item that is needed in order for - a test to run. Multiple itemss may be given, - separated by a comma. + Test whether the constraint is satisfied by a given value + The value to be tested + True for success, false for failure - + - Name of the item to be excluded. Multiple items - may be given, separated by a comma. + Modify the constraint to the specified comparison. + Thrown when a comparison type different + than was already set. - + - The reason for including or excluding the test + ThrowsConstraint is used to test the exception thrown by + a delegate by applying a constraint to it. - + - PlatformAttribute is used to mark a test fixture or an - individual method as applying to a particular platform only. + Initializes a new instance of the class, + using a constraint to be applied to the exception. + A constraint to apply to the caught exception. - + - Constructor with no platforms specified, for use - with named property syntax. + Get the actual exception thrown - used by Assert.Throws. - + - Constructor taking one or more platforms + Gets text describing a constraint - Comma-deliminted list of platforms - + - CultureAttribute is used to mark a test fixture or an - individual method as applying to a particular Culture only. + 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 - + - Constructor with no cultures specified, for use - with named property syntax. + Converts an ActualValueDelegate to a TestDelegate + before calling the primary overload. + + - + - Constructor taking one or more cultures + Write the actual value for a failing constraint test to a + MessageWriter. This override only handles the special message + used when an exception is expected but none is thrown. - Comma-deliminted list of cultures + The writer on which the actual value is displayed - + - 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. + ThrowsNothingConstraint tests that a delegate does not + throw an exception. - + - PropertyAttribute is used to attach information to a test as a name/value pair.. + Gets text describing a constraint - + - Construct a PropertyAttribute with a name and string value + Test whether the constraint is satisfied by a given value - The name of the property - The property value + The value to be tested + True if no exception is thrown, otherwise false - + - Construct a PropertyAttribute with a name and int value + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. - The name of the property - The property value + An ActualValueDelegate + A ConstraintResult - + - Construct a PropertyAttribute with a name and double value + 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. - The name of the property - The property value - + - Constructor for derived classes that set the - property dictionary directly. + Returns a default Tolerance object, equivalent to an exact match. - + - 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. + Returns an empty Tolerance object, equivalent to an exact match. - + - Gets the property dictionary for this attribute + Constructs a linear tolerance of a specified amount - + - Default constructor + Constructs a tolerance given an amount and - + - 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. + Returns a new tolerance, using the current amount as a percentage. - + - Default constructor + Returns a new tolerance, using the current amount in Ulps - + - 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. + Returns a new tolerance with a as the amount, using + the current amount as a number of days. - + - Default constructor + Returns a new tolerance with a as the amount, using + the current amount as a number of hours. - + - Summary description for MaxTimeAttribute. + Returns a new tolerance with a as the amount, using + the current amount as a number of minutes. - + - Construct a MaxTimeAttribute, given a time in milliseconds. + Returns a new tolerance with a as the amount, using + the current amount as a number of seconds. - The maximum elapsed time in milliseconds - + - RandomAttribute is used to supply a set of random values - to a single parameter of a parameterized test. + Returns a new tolerance with a as the amount, using + the current amount as a number of milliseconds. - + - ValuesAttribute is used to provide literal arguments for - an individual parameter of a test. + Returns a new tolerance with a as the amount, using + the current amount as a number of clock ticks. - + - Abstract base class for attributes that apply to parameters - and supply data for the parameter. + Gets the for the current Tolerance - + - Gets the data to be provided to the specified parameter + Gets the magnitude of the current Tolerance instance. - + - 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. + Returns true if the current tolerance has not been set or is using the . - + - Construct with one argument + Apply the tolerance to an expected value and return + a Tolerance.Range that represents the acceptable values. - - + - Construct with two arguments + Tests that the current Tolerance is linear with a + numeric value, throwing an exception if it is not. - - - + - Construct with three arguments + Tolerance.Range represents the range of values that match + a specific tolerance, when applied to a specific value. - - - - + - Construct with an array of arguments + The lower bound of the range - - + - Get the collection of values to be used as arguments + The Upper bound of the range - + - Construct a set of doubles from 0.0 to 1.0, - specifying only the count. + Construct a Range - - + - Construct a set of doubles from min to max + Modes in which the tolerance value for a comparison can be interpreted. - - - - + - Construct a set of ints from min to max + 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. - - - - + - Get the collection of values to be used as arguments + The tolerance is used as a numeric range within which + two compared values are considered to be equal. - + - RangeAttribute is used to supply a range of values to an - individual parameter of a parameterized test. + Interprets the tolerance as the percentage by which + the two compared values my deviate from each other. - + - Construct a range of ints using default step of 1 + Compares two values based in their distance in + representable numbers. - - - + - Construct a range of ints specifying the step size + TrueConstraint tests that the actual value is true - - - - + - Construct a range of longs + Initializes a new instance of the class. - - - - + - Construct a range of doubles + Test whether the constraint is satisfied by a given value - - - + The value to be tested + True for success, false for failure - + - Construct a range of floats + TypeConstraint is the abstract base for constraints + that take a Type as their expected value. - - - - + - RepeatAttribute may be applied to test case in order - to run it multiple times. + The expected Type used by the constraint - + - Construct a RepeatAttribute + The type of the actual argument to which the constraint was applied - 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. + Construct a TypeConstraint for a given Type + The expected type for the constraint + Prefix used in forming the constraint description - + - Initializes a new instance of the class. + Applies the constraint to an actual value, returning a ConstraintResult. - The required addin. + The value to be tested + A ConstraintResult - + - Gets the name of required addin. + Apply the constraint to an actual value, returning true if it succeeds - The required addin name. + The actual argument + True if the constraint succeeds, otherwise false. - + - Summary description for SetCultureAttribute. + UniqueItemsConstraint tests whether all the items in a + collection are unique. - + - Construct given the name of a culture + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - - + - Summary description for SetUICultureAttribute. + Check that all items are unique. + + - + - Construct given the name of a culture + XmlSerializableConstraint tests whether + an object is serializable in xml format. - - + - 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. + Gets text describing a constraint - + - 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. + Test whether the constraint is satisfied by a given value + The value to be tested + True for success, false for failure - + - Attribute used to mark a static (shared in VB) property - that returns a list of tests. + Returns the string representation of this constraint - + - 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. + ExactCountConstraint applies another constraint to each + item in a collection, succeeding only if a specified + number of items succeed. - + - Provide actions to execute before and after tests. + Construct a standalone ExactCountConstraint + - + - When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. + Construct an ExactCountConstraint on top of an existing constraint + + - + - Executed before each test is run + Apply the item constraint to each item in the collection, + succeeding only if the expected number of items pass. - Provides details about the test that is going to be run. + + - + - Executed after each test is run + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. - Provides details about the test that has just been run. - + - Provides the target for the action attribute + Represents a constraint that succeeds if the specified + count of members of a collection match a base constraint. - 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. + Construct an ExactCountOperator for a specified count - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - publc void TestDescriptionMethod() - {} - } - - + The expected count - + - Descriptive text for this test + 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. + - + - TestCaseAttribute is used to mark parameterized test cases - and provide them with their arguments. + ExceptionTypeConstraint is a special version of ExactTypeConstraint + used to provided detailed info about the exception thrown in + an error message. - + - Construct a TestCaseAttribute with a list of arguments. - This constructor is not CLS-Compliant + Constructs an ExceptionTypeConstraint - - + - Construct a TestCaseAttribute with a single argument + Applies the constraint to an actual value, returning a ConstraintResult. - + The value to be tested + A ConstraintResult - + - Construct a TestCaseAttribute with a two arguments + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. - - - - - Construct a TestCaseAttribute with a three arguments + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. - - - - + - Gets the list of arguments to a test case + 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 - + - Gets or sets the expected result. Use - ExpectedResult by preference. + Verifies that a delegate throws a particular exception when called. - The result. + A constraint to be satisfied by the exception + A TestSnippet delegate - + - Gets or sets the expected result. + Verifies that a delegate throws a particular exception when called. - The result. + The exception Type expected + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Gets a flag indicating whether an expected - result has been set. + Verifies that a delegate throws a particular exception when called. + The exception Type expected + A TestDelegate - + - Gets a list of categories associated with this test; + Verifies that a delegate throws a particular exception when called. + Type of the expected exception + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Gets or sets the category associated with this test. - May be a single category or a comma-separated list. + Verifies that a delegate throws a particular exception when called. + Type of the expected exception + A TestDelegate - + - Gets or sets the expected exception. + Verifies that a delegate throws an exception when called + and returns it. - The expected exception. + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Gets or sets the name the expected exception. + Verifies that a delegate throws an exception when called + and returns it. - The expected name of the exception. + A TestDelegate - + - Gets or sets the expected message of the expected exception + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. - The expected message of the exception. + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Gets or sets the type of match to be performed on the expected 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 - + - Gets or sets the description. + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. - The description. + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Gets or sets the name of the test. + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. - The name of the test. + A TestDelegate - + - Gets or sets the ignored status of the test + Verifies that a delegate does not throw an exception + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Gets or sets the ignored status of the test + Verifies that a delegate does not throw an exception. + A TestDelegate - + - Gets or sets the explicit status of the test + 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 - + - Gets or sets the reason for not running the test + 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 - + - Gets or sets the reason for not running the test. - Set has the side effect of marking the test as ignored. + 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 ignore reason. + 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 - + - FactoryAttribute indicates the source to be used to - provide test cases for a test method. + 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 - + - Construct with the name of the data source, which must - be a property, field or method of the test class itself. + 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. - An array of the names of the factories that will provide data + 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 - + - Construct with a Type, which must implement IEnumerable + 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 Type that will provide data + The value that is expected + The actual value - + - Construct with a Type and name. - that don't support params arrays. + 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 Type that will provide data - The name of the method, property or field that will provide data + 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 - + - The name of a the method, property or fiend to be used as a source + 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 - + - A Type to be used as a source + 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 - + - Gets or sets the category associated with this test. - May be a single category or a comma-separated list. + Asserts that two objects refer to the same object. If they + are not the same an is thrown. + The expected object + The actual object - - - [TestFixture] - public class ExampleClass - {} - - - + - Default constructor + 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 - + - 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. + 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 - + - Descriptive text for this fixture + 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 - + - Gets and sets the category for this fixture. - May be a comma-separated list of categories. + 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 - + - Gets a list of categories for this fixture + Asserts that an object may be assigned a value of a given Type. + The expected Type. + The object under examination - + - The arguments originally provided to the attribute + 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 - + - Gets or sets a value indicating whether this should be ignored. + Asserts that an object may be assigned a value of a given Type. - true if ignore; otherwise, false. + The expected Type. + The object under examination - + - Gets or sets the ignore reason. May set Ignored as a side effect. + Asserts that an object may not be assigned a value of a given Type. - The ignore reason. + 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 - + - Get or set the type arguments. If not set - explicitly, any leading arguments that are - Types are taken as type arguments. + Asserts that an object may not be assigned a value of a given Type. + The expected Type. + The object under examination - + - Attribute used to identify a method that is - called before any tests in a fixture are run. + 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 - + - 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. + Asserts that an object may not be assigned a value of a given Type. + The expected Type. + The object under examination - + - 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. + Asserts that an object is an instance of a given type. - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - publc void TestDescriptionMethod() - {} - } - - + 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 - + - 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. + Asserts that an object is an instance of a given type. + The expected Type + The object being examined - + - Construct a TimeoutAttribute given a time in milliseconds + Asserts that an object is an instance of a given type. - The timeout value in milliseconds + 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 - + - 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. + Asserts that an object is an instance of a given type. + The expected Type + The object being examined - + - Construct a RequiresSTAAttribute + 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 - + - 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. + Asserts that an object is not an instance of a given type. + The expected Type + The object being examined - + - Construct a RequiresMTAAttribute + 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 - + - Marks a test that must run on a separate thread. + Asserts that an object is not an instance of a given type. + The expected Type + The object being examined - + - Construct a RequiresThreadAttribute - + 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 - + - Construct a RequiresThreadAttribute, specifying the apartment + Asserts that a condition is true. If the condition is false the method throws + an . + The evaluated condition - + - ValueSourceAttribute indicates the source to be used to - provide data for one parameter of a test method. - + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + A function to build the message included with the Exception - + - 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 + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + The message to display if the condition is false + Arguments to be used in formatting the message - + - Construct with a Type and name - for use with languages - that don't support params arrays. + Asserts that a condition is true. If the condition is false the method throws + an . - The Type that will provide data - The name of the method, property or field that will provide data + A lambda that returns a Boolean - + - The name of a the method, property or fiend to be used as a source - + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + A function to build the message included with the Exception - + - A Type to be used as a source + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied - + - AllItemsConstraint applies another constraint to each - item in a collection, succeeding if they all succeed. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + The Type being compared. + 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 - + - Abstract base class used for prefixes + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception - + - The Constraint class is the base of all built-in constraints - within NUnit. It provides the operator overloads used to combine - constraints. + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + A TestDelegate to be executed + A ThrowsConstraint used in the test - + - The IConstraintExpression interface is implemented by all - complete and resolvable constraints and expressions. + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. - - + A TestDelegate to be executed + A ThrowsConstraint used in the test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + 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 function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + The actual value to test + A Constraint to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + The actual value to test + 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 an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + A function to build the message included with the Exception + + + + 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. + + The actual value to test + A Constraint to be applied + + + + 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. + + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that the first int is greater than the second + int. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first int is greater than the second + int. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + + + + Asserts that an int is zero. + + The number to be examined + + + + Asserts that an int is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is zero. + + The number to be examined + + + + Asserts that an unsigned int is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is zero. + + The number to be examined + + + + Asserts that a Long is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is zero. + + The number to be examined + + + + Asserts that an unsigned Long is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is zero. + + The number to be examined + + + + Asserts that a decimal is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is zero. + + The number to be examined + + + + Asserts that a double is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is zero. + + The number to be examined + + + + Asserts that a float is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an int is not zero. + + The number to be examined + + + + Asserts that an int is not zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is not zero. + + The number to be examined + + + + Asserts that an unsigned int is not zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is not zero. + + The number to be examined + + + + Asserts that a Long is not zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is not zero. + + The number to be examined + + + + Asserts that an unsigned Long is not zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is zero. + + The number to be examined + + + + Asserts that a decimal is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is zero. + + The number to be examined + + + + Asserts that a double is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is zero. + + The number to be examined + + + + Asserts that a float is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an int is positive. + + The number to be examined + + + + Asserts that an int is positive. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is positive. + + The number to be examined + + + + Asserts that an unsigned int is positive. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is positive. + + The number to be examined + + + + Asserts that a Long is positive. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is positive. + + The number to be examined + + + + Asserts that an unsigned Long is positive. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is positive. + + The number to be examined + + + + Asserts that a decimal is positive. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is positive. + + The number to be examined + + + + Asserts that a double is positive. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is positive. + + The number to be examined + + + + Asserts that a float is positive. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an int is negative. + + The number to be examined + + + + Asserts that an int is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is negative. + + The number to be examined + + + + Asserts that an unsigned int is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is negative. + + The number to be examined + + + + Asserts that a Long is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is negative. + + The number to be examined + + + + Asserts that an unsigned Long is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is negative. + + The number to be examined + + + + Asserts that a decimal is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is negative. + + The number to be examined + + + + Asserts that a double is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is negative. + + The number to be examined + + + + Asserts that a float is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + 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. + + + + + DO NOT USE! Use Assert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + 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. + + + + + Issues a warning using the message and arguments provided. + + The message to display. + Arguments to be used in formatting the message + + + + Issues a warning using the message provided. + + The message to display. + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as ignored. + + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as Inconclusive. + + + + + Asserts that an object is contained in a collection. + + The expected object + The collection 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 collection. + + The expected object + The collection to be examined + + + + Wraps code containing a series of assertions, which should all + be executed, even if they fail. Failed results are saved and + reported at the end of the code block. + + A TestDelegate to be executed in Multiple Assertion mode. + + + + Thrown when an assertion failed. + + + + + Default Constructor (normally used) + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Class used to guard against unexpected argument values + or operations by throwing an appropriate exception. + + + + + Throws an exception if an argument is null + + The value to be tested + The name of the argument + + + + Throws an exception if a string argument is null or empty + + The value to be tested + The name of the argument + + + + Throws an ArgumentOutOfRangeException if the specified condition is not met. + + The condition that must be met + The exception message to be used + The name of the argument + + + + Throws an ArgumentException if the specified condition is not met. + + The condition that must be met + The exception message to be used + The name of the argument + + + + Throws an InvalidOperationException if the specified condition is not met. + + The condition that must be met + The exception message to be used + + + + The AssertionResult class represents the result of a single assertion. + + + + + Construct an AssertionResult + + + + The pass/fail status of the assertion + + + The message produced by the assertion, or null + + + The stacktrace associated with the assertion, or null + + + + ToString Override + + + + + Override GetHashCode + + + + + Override Equals + + + + + + AssertionStatus enumeration represents the possible outcomes of an assertion. + The order of definition is significant, higher level values override lower + ones in determining the overall result of a test. + + + + + An assumption failed + + + + + The assertion succeeded + + + + + A warning message was issued + + + + + The assertion failed + + + + + An unexpected exception was thrown + + + + + Any ITest that implements this interface is at a level that the implementing + class should be disposed at the end of the test run + + + + + The IMethodInfo class is used to encapsulate information + about a method in a platform-independent manner. + + + + + Gets the Type from which this method was reflected. + + + + + Gets the MethodInfo for this method. + + + + + Gets the name of the method. + + + + + Gets a value indicating whether the method is abstract. + + + + + Gets a value indicating whether the method is public. + + + + + Gets a value indicating whether the method contains unassigned generic type parameters. + + + + + Gets a value indicating whether the method is a generic method. + + + + + Gets a value indicating whether the MethodInfo represents the definition of a generic method. + + + + + Gets the return Type of the method. + + + + + Gets the parameters of the method. + + + + + + Returns the Type arguments of a generic method or the Type parameters of a generic method definition. + + + + + Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. + + The type arguments to be used + A new IMethodInfo with the type arguments replaced + + + + Invokes the method, converting any TargetInvocationException to an NUnitException. + + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + The IParameterInfo interface is an abstraction of a .NET parameter. + + + + + Gets a value indicating whether the parameter is optional + + + + + Gets an IMethodInfo representing the method for which this is a parameter + + + + + Gets the underlying .NET ParameterInfo + + + + + Gets the Type of the parameter + + + + + The IReflectionInfo interface is implemented by NUnit wrapper objects that perform reflection. + + + + + Returns an array of custom attributes of the specified type applied to this object + + + + + Returns a value indicating whether an attribute of the specified type is defined on this object. + + + + + The ITypeInfo interface is an abstraction of a .NET Type + + + + + Gets the underlying Type on which this ITypeInfo is based + + + + + Gets the base type of this type as an ITypeInfo + + + + + Returns true if the Type wrapped is equal to the argument + + + + + Gets the Name of the Type + + + + + Gets the FullName of the Type + + + + + Gets the assembly in which the type is declared + + + + + Gets the Namespace of the Type + + + + + Gets a value indicating whether the type is abstract. + + + + + Gets a value indicating whether the Type is a generic Type + + + + + Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. + + + + + Gets a value indicating whether the Type is a generic Type definition + + + + + Gets a value indicating whether the type is sealed. + + + + + Gets a value indicating whether this type is a static class. + + + + + Get the display name for this typeInfo. + + + + + Get the display name for an object of this type, constructed with specific arguments + + + + + Returns a Type representing a generic type definition from which this Type can be constructed. + + + + + Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments + + + + + Returns a value indicating whether this type has a method with a specified public attribute + + + + + Returns an array of IMethodInfos for methods of this Type + that match the specified flags. + + + + + Gets the public constructor taking the specified argument Types + + + + + Returns a value indicating whether this Type has a public constructor taking the specified argument Types. + + + + + Construct an object of this Type, using the specified arguments. + + + + + The TestAttachment class represents a file attached to a TestResult, + with an optional description. + + + + + Absolute file path to attachment file + + + + + User specifed description of attachment. May be null. + + + + + Creates a TestAttachment class to represent a file attached to a test result. + + Absolute file path to attachment file + User specifed description of attachment. May be null. + + + + The TestOutput class holds a unit of output from + a test to a specific output stream + + + + + Construct with text, output destination type and + the name of the test that produced the output. + + Text to be output + Name of the stream or channel to which the text should be written + Id of the test that produced the output + FullName of test that produced the output + + + + Return string representation of the object for debugging + + + + + + Get the text + + + + + Get the output type + + + + + Get the name of the test that created the output + + + + + Get the id of the test that created the output + + + + + Convert the TestOutput object to an XML string + + + + + CombiningStrategy is the abstract base for classes that + know how to combine values provided for individual test + parameters to create a set of test cases. + + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + The ISimpleTestBuilder interface is exposed by a class that knows how to + build a single TestMethod from a suitable MethodInfo Types. In general, + it is exposed by an attribute, but may be implemented in a helper class + used by the attribute in some cases. + + + + + Build a TestMethod from the provided MethodInfo. + + The method to be used as a test + The TestSuite to which the method will be added + A TestMethod object + + + + The ITestBuilder interface is exposed by a class that knows how to + build one or more TestMethods from a MethodInfo. In general, it is exposed + by an attribute, which has additional information available to provide + the necessary test parameters to distinguish the test cases built. + + + + + Build one or more TestMethods from the provided MethodInfo. + + The method to be used as a test + The TestSuite to which the method will be added + A TestMethod object + + + + The IDataPointProvider interface is used by extensions + that provide data for a single test parameter. + + + + + Determine whether any data is available for a parameter. + + An IParameterInfo representing one + argument to a parameterized test + True if any data is available, otherwise false. + + + + Return an IEnumerable providing data for use with the + supplied parameter. + + An IParameterInfo representing one + argument to a parameterized test + An IEnumerable providing the required data + + + + The IParameterDataSource interface is implemented by types + that can provide data for a test method parameter. + + + + + Gets an enumeration of data items for use as arguments + for a test method parameter. + + The parameter for which data is needed + An enumeration containing individual data items + + + + A PropertyBag represents a collection of name/value pairs + that allows duplicate entries with the same key. Methods + are provided for adding a new pair as well as for setting + a key to a single value. All keys are strings but values + may be of any type. Null values are not permitted, since + a null entry represents the absence of the key. + + The entries in a PropertyBag are of two kinds: those that + take a single value and those that take multiple values. + However, the PropertyBag has no knowledge of which entries + fall into each category and the distinction is entirely + up to the code using the PropertyBag. + + When working with multi-valued properties, client code + should use the Add method to add name/value pairs and + indexing to retrieve a list of all values for a given + key. For example: + + bag.Add("Tag", "one"); + bag.Add("Tag", "two"); + Assert.That(bag["Tag"], + Is.EqualTo(new string[] { "one", "two" })); + + When working with single-valued properties, client code + should use the Set method to set the value and Get to + retrieve the value. The GetSetting methods may also be + used to retrieve the value in a type-safe manner while + also providing default. For example: + + bag.Set("Priority", "low"); + bag.Set("Priority", "high"); // replaces value + Assert.That(bag.Get("Priority"), + Is.EqualTo("high")); + Assert.That(bag.GetSetting("Priority", "low"), + Is.EqualTo("high")); + + + + + Adds a key/value pair to the property bag + + The key + The value + + + + Sets the value for a key, removing any other + values that are already in the property set. + + + + + + + Gets a single value for a key, using the first + one if multiple values are present and returning + null if the value is not found. + + + + + Gets a flag indicating whether the specified key has + any entries in the property set. + + The key to be checked + True if their are values present, otherwise false + + + + Gets or sets the list of values for a particular key + + The key for which the values are to be retrieved or set + + + + Gets a collection containing all the keys in the property set + + + + + Common interface supported by all representations + of a test. Only includes informational fields. + The Run method is specifically excluded to allow + for data-only representations of a test. + + + + + Gets the id of the test + + + + + Gets the name of the test + + + + + Gets the type of the test + + + + + Gets the fully qualified name of the test + + + + + Gets the name of the class containing this test. Returns + null if the test is not associated with a class. + + + + + Gets the name of the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Gets the Type of the test fixture, if applicable, or + null if no fixture type is associated with this test. + + + + + Gets an IMethod for the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Gets the RunState of the test, indicating whether it can be run. + + + + + Count of the test cases ( 1 if this is a test case ) + + + + + Gets the properties of the test + + + + + Gets the parent test, if any. + + The parent test or null if none exists. + + + + Returns true if this is a test suite + + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets this test's child tests + + A list of child tests + + + + Gets a fixture object for running this test. + + + + + The arguments to use in creating the test or empty array if none are required. + + + + + The ITestData interface is implemented by a class that + represents a single instance of a parameterized test. + + + + + Gets the name to be used for the test + + + + + Gets the RunState for this test case. + + + + + Gets the argument list to be provided to the test + + + + + Gets the property dictionary for the test case + + + + + The ITestCaseData interface is implemented by a class + that is able to return the data required to create an + instance of a parameterized test fixture. + + + + + Get the TypeArgs if separately set + + + + + The ITestCaseData interface is implemented by a class + that is able to return complete testcases for use by + a parameterized test method. + + + + + Gets the expected result of the test case + + + + + Returns true if an expected result has been set + + + + + Interface to be implemented by filters applied to tests. + The filter applies when running the test, after it has been + loaded, since this is the only time an ITest exists. + + + + + Determine if a particular test passes the filter criteria. Pass + may examine the parents and/or descendants of a test, depending + on the semantics of the particular filter + + The test to which the filter is applied + True if the test passes the filter, otherwise false + + + + Determine if a test matches the filter explicitly. That is, it must + be a direct match of the test itself or one of it's children. + + The test to which the filter is applied + True if the test matches the filter explicitly, otherwise false + + + + The ITestListener interface is used internally to receive + notifications of significant events while a test is being + run. The events are propagated to clients by means of an + AsyncCallback. NUnit extensions may also monitor these events. + + + + + Called when a test has just started + + The test that is starting + + + + Called when a test has finished + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + The ITestResult interface represents the result of a test. + + + + + Gets the ResultState of the test result, which + indicates the success or failure of the test. + + + + + Gets the name of the test result + + + + + Gets the full name of the test result + + + + + Gets the elapsed time for running the test in seconds + + + + + Gets or sets the time the test started running. + + + + + Gets or sets the time the test finished running. + + + + + Gets the message associated with a test + failure or with not running the test + + + + + Gets any stacktrace associated with an + error or failure. Not available in + the Compact Framework 1.0. + + + + + Gets the number of asserts executed + when running the test and all its children. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + Accessing HasChildren should not force creation of the + Children collection in classes implementing this interface. + + + + + Gets the collection of child results. + + + + + Gets the Test to which this result applies. + + + + + Gets any text output written to this result. + + + + + Gets a list of AssertionResults associated with the test + + + + + Gets the collection of files attached to the test + + + + + An object implementing IXmlNodeBuilder is able to build + an XML representation of itself and any children. + + + + + Returns a TNode representing the current object. + + If true, children are included where applicable + A TNode representing the result + + + + Returns a TNode representing the current object after + adding it as a child of the supplied parent node. + + The parent node. + If true, children are included, where applicable + + + + + The ResultState class represents the outcome of running a test. + It contains two pieces of information. The Status of the test + is an enum indicating whether the test passed, failed, was + skipped or was inconclusive. The Label provides a more + detailed breakdown for use by client runners. + + + + + Initializes a new instance of the class. + + The TestStatus. + + + + Initializes a new instance of the class. + + The TestStatus. + The label. + + + + Initializes a new instance of the class. + + The TestStatus. + The stage at which the result was produced + + + + Initializes a new instance of the class. + + The TestStatus. + The label. + The stage at which the result was produced + + + + The result is inconclusive + + + + + The test has been skipped. + + + + + The test has been ignored. + + + + + The test was skipped because it is explicit + + + + + The test succeeded + + + + + The test issued a warning + + + + + The test failed + + + + + The test encountered an unexpected exception + + + + + The test was cancelled by the user + + + + + The test was not runnable. + + + + + A suite failed because one or more child tests failed or had errors + + + + + A suite failed in its OneTimeSetUp + + + + + A suite had an unexpected exception in its OneTimeSetUp + + + + + A suite had an unexpected exception in its OneTimeDown + + + + + Gets the TestStatus for the test. + + The status. + + + + Gets the label under which this test result is + categorized, if any. + + + + + Gets the stage of test execution in which + the failure or other result took place. + + + + + Get a new ResultState, which is the same as the current + one but with the FailureSite set to the specified value. + + The FailureSite to use + A new ResultState + + + + Test whether this ResultState has the same Status and Label + as another one. In other words, the whether two are equal + ignoring the Site. + + + + + + + Determines whether the specified , is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + The FailureSite enum indicates the stage of a test + in which an error or failure occurred. + + + + + Failure in the test itself + + + + + Failure in the SetUp method + + + + + Failure in the TearDown method + + + + + Failure of a parent test + + + + + Failure of a child test + + + + + The RunState enum indicates whether a test can be executed. + + + + + The test is not runnable. + + + + + The test is runnable. + + + + + The test can only be run explicitly + + + + + The test has been skipped. This value may + appear on a Test when certain attributes + are used to skip the test. + + + + + The test has been ignored. May appear on + a Test, when the IgnoreAttribute is used. + + + + + The TestStatus enum indicates the result of running a test + + + + + The test was inconclusive + + + + + The test has skipped + + + + + The test succeeded + + + + + There was a warning + + + + + The test failed + + + + + TNode represents a single node in the XML representation + of a Test or TestResult. It replaces System.Xml.XmlNode and + System.Xml.Linq.XElement, providing a minimal set of methods + for operating on the XML in a platform-independent manner. + + + + + Constructs a new instance of TNode + + The name of the node + + + + Constructs a new instance of TNode with a value + + The name of the node + The text content of the node + + + + Constructs a new instance of TNode with a value + + The name of the node + The text content of the node + Flag indicating whether to use CDATA when writing the text + + + + Gets the name of the node + + + + + Gets the value of the node + + + + + Gets a flag indicating whether the value should be output using CDATA. + + + + + Gets the dictionary of attributes + + + + + Gets a list of child nodes + + + + + Gets the first ChildNode + + + + + Gets the XML representation of this node. + + + + + Create a TNode from it's XML text representation + + The XML text to be parsed + A TNode + + + + Adds a new element as a child of the current node and returns it. + + The element name. + The newly created child element + + + + Adds a new element with a value as a child of the current node and returns it. + + The element name + The text content of the new element + The newly created child element + + + + Adds a new element with a value as a child of the current node and returns it. + The value will be output using a CDATA section. + + The element name + The text content of the new element + The newly created child element + + + + Adds an attribute with a specified name and value to the XmlNode. + + The name of the attribute. + The value of the attribute. + + + + Finds a single descendant of this node matching an xpath + specification. The format of the specification is + limited to what is needed by NUnit and its tests. + + + + + + + Finds all descendants of this node matching an xpath + specification. The format of the specification is + limited to what is needed by NUnit and its tests. + + + + + Writes the XML representation of the node to an XmlWriter + + + + + + Class used to represent a list of XmlResults + + + + + Class used to represent the attributes of a node + + + + + Gets or sets the value associated with the specified key. + Overridden to return null if attribute is not found. + + The key. + Value of the attribute or null + + + + The IFixtureBuilder interface is exposed by a class that knows how to + build a TestFixture from one or more Types. In general, it is exposed + by an attribute, but may be implemented in a helper class used by the + attribute in some cases. + + + + + Build one or more TestFixtures from type provided. At least one + non-null TestSuite must always be returned, since the method is + generally called because the user has marked the target class as + a fixture. If something prevents the fixture from being used, it + will be returned nonetheless, labelled as non-runnable. + + The type info of the fixture to be used. + A TestSuite object or one derived from TestSuite. + + + + IImplyFixture is an empty marker interface used by attributes like + TestAttribute that cause the class where they are used to be treated + as a TestFixture even without a TestFixtureAttribute. + + Marker interfaces are not usually considered a good practice, but + we use it here to avoid cluttering the attribute hierarchy with + classes that don't contain any extra implementation. + + + + + The IApplyToContext interface is implemented by attributes + that want to make changes to the execution context before + a test is run. + + + + + Apply changes to the execution context + + The execution context + + + + The IApplyToTest interface is implemented by self-applying + attributes that modify the state of a test in some way. + + + + + Modifies a test as defined for the specific attribute. + + The test to modify + + + + The ISuiteBuilder interface is exposed by a class that knows how to + build a suite from one or more Types. + + + + + Examine the type and determine if it is suitable for + this builder to use in building a TestSuite. + + Note that returning false will cause the type to be ignored + in loading the tests. If it is desired to load the suite + but label it as non-runnable, ignored, etc., then this + method must return true. + + The type of the fixture to be used + True if the type can be used to build a TestSuite + + + + Build a TestSuite from type provided. + + The type of the fixture to be used + A TestSuite + + + + The ITestCaseBuilder interface is exposed by a class that knows how to + build a test case from certain methods. + + + This interface is not the same as the ITestCaseBuilder interface in NUnit 2.x. + We have reused the name because the two products don't interoperate at all. + + + + + Examine the method and determine if it is suitable for + this builder to use in building a TestCase to be + included in the suite being populated. + + Note that returning false will cause the method to be ignored + in loading the tests. If it is desired to load the method + but label it as non-runnable, ignored, etc., then this + method must return true. + + The test method to examine + The suite being populated + True is the builder can use this method + + + + Build a TestCase from the provided MethodInfo for + inclusion in the suite being constructed. + + The method to be used as a test case + The test suite being populated, or null + A TestCase or null + + + + ICommandWrapper is implemented by attributes and other + objects able to wrap a TestCommand with another command. + + + Attributes or other objects should implement one of the + derived interfaces, rather than this one, since they + indicate in which part of the command chain the wrapper + should be applied. + + + + + Wrap a command and return the result. + + The command to be wrapped + The wrapped command + + + + Objects implementing this interface are used to wrap + the TestMethodCommand itself. They apply after SetUp + has been run and before TearDown. + + + + + Objects implementing this interface are used to wrap + the entire test, including SetUp and TearDown. + + + + + AssemblyHelper provides static methods for working + with assemblies. + + + + + Gets the path from which an assembly was loaded. + For builds where this is not possible, returns + the name of the assembly. + + The assembly. + The path. + + + + Gets the path to the directory from which an assembly was loaded. + + The assembly. + The path. + + + + Gets the AssemblyName of an assembly. + + The assembly + An AssemblyName + + + + Loads an assembly given a string, which may be the + path to the assembly or the AssemblyName + + + + + + + Gets the assembly path from code base. + + Public for testing purposes + The code base. + + + + + The ParameterDataProvider class implements IParameterDataProvider + and hosts one or more individual providers. + + + + + Construct with a collection of individual providers + + + + + Determine whether any data is available for a parameter. + + An IParameterInfo representing one + argument to a parameterized test + True if any data is available, otherwise false. + + + + Return an IEnumerable providing data for use with the + supplied parameter. + + An IParameterInfo representing one + argument to a parameterized test + An IEnumerable providing the required data + + + + Built-in SuiteBuilder for all types of test classes. + + + + + Checks to see if the provided Type is a fixture. + To be considered a fixture, it must be a non-abstract + class with one or more attributes implementing the + IFixtureBuilder interface or one or more methods + marked as tests. + + The fixture type to check + True if the fixture can be built, false if not + + + + Build a TestSuite from TypeInfo provided. + + The fixture type to build + A TestSuite built from that type + + + + We look for attributes implementing IFixtureBuilder at one level + of inheritance at a time. Attributes on base classes are not used + unless there are no fixture builder attributes at all on the derived + class. This is by design. + + The type being examined for attributes + A list of the attributes found. + + + + NUnitTestCaseBuilder is a utility class used by attributes + that build test cases. + + + + + Constructs an + + + + + Builds a single NUnitTestMethod, either as a child of the fixture + or as one of a set of test cases under a ParameterizedTestMethodSuite. + + The MethodInfo from which to construct the TestMethod + The suite or fixture to which the new test will be added + The ParameterSet to be used, or null + + + + + Helper method that checks the signature of a TestMethod and + any supplied parameters to determine if the test is valid. + + Currently, NUnitTestMethods are required to be public, + non-abstract methods, either static or instance, + returning void. They may take arguments but the values must + be provided or the TestMethod is not considered runnable. + + Methods not meeting these criteria will be marked as + non-runnable and the method will return false in that case. + + The TestMethod to be checked. If it + is found to be non-runnable, it will be modified. + Parameters to be used for this test, or null + True if the method signature is valid, false if not + + The return value is no longer used internally, but is retained + for testing purposes. + + + + + Class that can build a tree of automatic namespace + suites from a group of fixtures. + + + + + NamespaceDictionary of all test suites we have created to represent + namespaces. Used to locate namespace parent suites for fixtures. + + + + + Point in the tree where items in the global namespace are added + + + + + Initializes a new instance of the class. + + The root suite. + + + + Gets the root entry in the tree created by the NamespaceTreeBuilder. + + The root suite. + + + + Adds the specified fixtures to the tree. + + The fixtures to be added. + + + + Adds the specified fixture to the tree. + + The fixture to be added. + + + + CombinatorialStrategy creates test cases by using all possible + combinations of the parameter data. + + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + Provides data from fields marked with the DatapointAttribute or the + DatapointsAttribute. + + + + + Determine whether any data is available for a parameter. + + A ParameterInfo representing one + argument to a parameterized test + + True if any data is available, otherwise false. + + + + + Return an IEnumerable providing data for use with the + supplied parameter. + + A ParameterInfo representing one + argument to a parameterized test + + An IEnumerable providing the required data + + + + + Class to build ether a parameterized or a normal NUnitTestMethod. + There are four cases that the builder must deal with: + 1. The method needs no params and none are provided + 2. The method needs params and they are provided + 3. The method needs no params but they are provided in error + 4. The method needs params but they are not provided + This could have been done using two different builders, but it + turned out to be simpler to have just one. The BuildFrom method + takes a different branch depending on whether any parameters are + provided, but all four cases are dealt with in lower-level methods + + + + + Determines if the method can be used to build an NUnit test + test method of some kind. The method must normally be marked + with an identifying attribute for this to be true. + + Note that this method does not check that the signature + of the method for validity. If we did that here, any + test methods with invalid signatures would be passed + over in silence in the test run. Since we want such + methods to be reported, the check for validity is made + in BuildFrom rather than here. + + An IMethodInfo for the method being used as a test method + True if the builder can create a test case from this method + + + + Build a Test from the provided MethodInfo. Depending on + whether the method takes arguments and on the availability + of test case data, this method may return a single test + or a group of tests contained in a ParameterizedMethodSuite. + + The method for which a test is to be built + A Test representing one or more method invocations + + + + Determines if the method can be used to build an NUnit test + test method of some kind. The method must normally be marked + with an identifying attribute for this to be true. + + Note that this method does not check that the signature + of the method for validity. If we did that here, any + test methods with invalid signatures would be passed + over in silence in the test run. Since we want such + methods to be reported, the check for validity is made + in BuildFrom rather than here. + + An IMethodInfo for the method being used as a test method + The test suite being built, to which the new test would be added + True if the builder can create a test case from this method + + + + Build a Test from the provided MethodInfo. Depending on + whether the method takes arguments and on the availability + of test case data, this method may return a single test + or a group of tests contained in a ParameterizedMethodSuite. + + The method for which a test is to be built + The test fixture being populated, or null + A Test representing one or more method invocations + + + + Builds a ParameterizedMethodSuite containing individual test cases. + + The method for which a test is to be built. + The list of test cases to include. + A ParameterizedMethodSuite populated with test cases + + + + Build a simple, non-parameterized TestMethod for this method. + + The MethodInfo for which a test is to be built + The test suite for which the method is being built + A TestMethod. + + + + NUnitTestFixtureBuilder is able to build a fixture given + a class marked with a TestFixtureAttribute or an unmarked + class containing test methods. In the first case, it is + called by the attribute and in the second directly by + NUnitSuiteBuilder. + + + + + Build a TestFixture from type provided. A non-null TestSuite + must always be returned, since the method is generally called + because the user has marked the target class as a fixture. + If something prevents the fixture from being used, it should + be returned nonetheless, labelled as non-runnable. + + An ITypeInfo for the fixture to be used. + A TestSuite object or one derived from TestSuite. + + + + Overload of BuildFrom called by tests that have arguments. + Builds a fixture using the provided type and information + in the ITestFixtureData object. + + The TypeInfo for which to construct a fixture. + An object implementing ITestFixtureData or null. + + + + + Method to add test cases to the newly constructed fixture. + + The fixture to which cases should be added + + + + Method to create a test case from a MethodInfo and add + it to the fixture being built. It first checks to see if + any global TestCaseBuilder addin wants to build the + test case. If not, it uses the internal builder + collection maintained by this fixture builder. + + The default implementation has no test case builders. + Derived classes should add builders to the collection + in their constructor. + + The method for which a test is to be created + The test suite being built. + A newly constructed Test + + + + PairwiseStrategy creates test cases by combining the parameter + data so that all possible pairs of data items are used. + + + + The number of test cases that cover all possible pairs of test function + parameters values is significantly less than the number of test cases + that cover all possible combination of test function parameters values. + And because different studies show that most of software failures are + caused by combination of no more than two parameters, pairwise testing + can be an effective ways to test the system when it's impossible to test + all combinations of parameters. + + + The PairwiseStrategy code is based on "jenny" tool by Bob Jenkins: + http://burtleburtle.net/bob/math/jenny.html + + + + + + FleaRand is a pseudo-random number generator developed by Bob Jenkins: + http://burtleburtle.net/bob/rand/talksmall.html#flea + + + + + Initializes a new instance of the FleaRand class. + + The seed. + + + + FeatureInfo represents coverage of a single value of test function + parameter, represented as a pair of indices, Dimension and Feature. In + terms of unit testing, Dimension is the index of the test parameter and + Feature is the index of the supplied value in that parameter's list of + sources. + + + + + Initializes a new instance of FeatureInfo class. + + Index of a dimension. + Index of a feature. + + + + A FeatureTuple represents a combination of features, one per test + parameter, which should be covered by a test case. In the + PairwiseStrategy, we are only trying to cover pairs of features, so the + tuples actually may contain only single feature or pair of features, but + the algorithm itself works with triplets, quadruples and so on. + + + + + Initializes a new instance of FeatureTuple class for a single feature. + + Single feature. + + + + Initializes a new instance of FeatureTuple class for a pair of features. + + First feature. + Second feature. + + + + TestCase represents a single test case covering a list of features. + + + + + Initializes a new instance of TestCaseInfo class. + + A number of features in the test case. + + + + PairwiseTestCaseGenerator class implements an algorithm which generates + a set of test cases which covers all pairs of possible values of test + function. + + + + The algorithm starts with creating a set of all feature tuples which we + will try to cover (see method). This set + includes every single feature and all possible pairs of features. We + store feature tuples in the 3-D collection (where axes are "dimension", + "feature", and "all combinations which includes this feature"), and for + every two feature (e.g. "A" and "B") we generate both ("A", "B") and + ("B", "A") pairs. This data structure extremely reduces the amount of + time needed to calculate coverage for a single test case (this + calculation is the most time-consuming part of the algorithm). + + + Then the algorithm picks one tuple from the uncovered tuple, creates a + test case that covers this tuple, and then removes this tuple and all + other tuples covered by this test case from the collection of uncovered + tuples. + + + Picking a tuple to cover + + + There are no any special rules defined for picking tuples to cover. We + just pick them one by one, in the order they were generated. + + + Test generation + + + Test generation starts from creating a completely random test case which + covers, nevertheless, previously selected tuple. Then the algorithm + tries to maximize number of tuples which this test covers. + + + Test generation and maximization process repeats seven times for every + selected tuple and then the algorithm picks the best test case ("seven" + is a magic number which provides good results in acceptable time). + + Maximizing test coverage + + To maximize tests coverage, the algorithm walks thru the list of mutable + dimensions (mutable dimension is a dimension that are not included in + the previously selected tuple). Then for every dimension, the algorithm + walks thru the list of features and checks if this feature provides + better coverage than randomly selected feature, and if yes keeps this + feature. + + + This process repeats while it shows progress. If the last iteration + doesn't improve coverage, the process ends. + + + In addition, for better results, before start every iteration, the + algorithm "scrambles" dimensions - so for every iteration dimension + probes in a different order. + + + + + + Creates a set of test cases for specified dimensions. + + + An array which contains information about dimensions. Each element of + this array represents a number of features in the specific dimension. + + + A set of test cases. + + + + + Gets the test cases generated by this strategy instance. + + A set of test cases. + + + + ParameterDataSourceProvider supplies individual argument values for + single parameters using attributes implementing IParameterDataSource. + + + + + Determine whether any data is available for a parameter. + + A ParameterInfo representing one + argument to a parameterized test + + True if any data is available, otherwise false. + + + + + Return an IEnumerable providing data for use with the + supplied parameter. + + An IParameterInfo representing one + argument to a parameterized test + + An IEnumerable providing the required data + + + + + SequentialStrategy creates test cases by using all of the + parameter data sources in parallel, substituting null + when any of them run out of data. + + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + TestActionAfterCommand handles the AfterTest method of a single + TestActionItem, provided the items BeforeTest has been run. + + + + + Initializes a new instance of the class. + + The inner command. + The TestActionItem to run before the inner command. + + + + AfterCommand is a DelegatingTestCommand that performs some + specific action after the inner command is run. + + + + + Construct an AfterCommand + + + + + Execute the command + + + + + Set this to perform action after the inner command. + + + + + TestActionCommand handles a single ITestAction applied + to a test. It runs the BeforeTest method, then runs the + test and finally runs the AfterTest method. + + + + + Initializes a new instance of the class. + + The inner command. + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + Perform the before test action + + + + + Perform the after test action + + + + + TestActionBeforeCommand handles the BeforeTest method of a single + TestActionItem, relying on the item to remember it has been run. + + + + + Initializes a new instance of the class. + + The inner command. + The TestActionItem to run before the inner command. + + + + BeforeTestCommand is a DelegatingTestCommand that performs some + specific action before the inner command is run. + + + + + Construct a BeforeCommand + + + + + Execute the command + + + + + Action to perform before the inner command. + + + + + ConstructFixtureCommand constructs the user test object if necessary. + + + + + Constructs a OneTimeSetUpCommand for a suite + + The inner command to which the command applies + + + + OneTimeTearDownCommand performs any teardown actions + specified for a suite and calls Dispose on the user + test object, if any. + + + + + Construct a OneTimeTearDownCommand + + The command wrapped by this command + + + + EmptyTestCommand is a TestCommand that does nothing. It simply + returns the current result from the context when executed. We + use it to avoid testing for null when executing a chain of + DelegatingTestCommands. + + + + + Construct a NullCommand for a test + + + + + Execute the command + + + + + TimeoutCommand creates a timer in order to cancel + a test if it exceeds a specified time and adjusts + the test result if it did time out. + + + + + Initializes a new instance of the class. + + The inner command + Timeout value + + + + SetUpTearDownItem holds the setup and teardown methods + for a single level of the inheritance hierarchy. + + + + + Construct a SetUpTearDownNode + + A list of setup methods for this level + A list teardown methods for this level + + + + Returns true if this level has any methods at all. + This flag is used to discard levels that do nothing. + + + + + Run SetUp on this level. + + The execution context to use for running. + + + + Run TearDown for this level. + + + + + + TestActionCommand handles a single ITestAction applied + to a test. It runs the BeforeTest method, then runs the + test and finally runs the AfterTest method. + + + + + Initializes a new instance of the class. + + The inner command. + The TestAction with which to wrap the inner command. + + + + TestActionItem wraps a single execution of an ITestAction. + It's primary purpose is to track whether the BeforeTest + method has been called and suppress calling the + AfterTest method if it has not. This is necessary when + ITestActions are used before and after a CompositeWorkItem, + since the OneTimeSetUpCommand and OneTimeTearDownCommand + are separate command chains. By sharing a TestActionItem + between the setup and teardown chains, the two calls can + be coordinated. + + + + + Construct a TestActionItem + + The ITestAction to be included + + + + Get flag indicating if the BeforeTest entry was already called. + + + + + Run the BeforeTest method of the action and remember that it has been run. + + The test to which the action applies + + + + Run the AfterTest action, but only if the BeforeTest + action was actually run. + + The test to which the action applies + + + + ContextSettingsCommand applies specified changes to the + TestExecutionContext prior to running a test. No special + action is needed after the test runs, since the prior + context will be restored automatically. + + + + + DelegatingTestCommand wraps an inner TestCommand. + Derived classes may do what they like before or + after running the inner command. + + + + TODO: Documentation needed for field + + + + TODO: Documentation needed for constructor + + + + + + TODO: Documentation needed for class + + + + + Initializes a new instance of the class. + + The inner command. + The max time allowed in milliseconds + + + + OneTimeSetUpCommand runs any one-time setup methods for a suite, + constructing the user test object if necessary. + + + + + Constructs a OneTimeSetUpCommand for a suite + + The inner command to which the command applies + A SetUpTearDownList for use by the command + + + + OneTimeTearDownCommand performs any teardown actions + specified for a suite and calls Dispose on the user + test object, if any. + + + + + Construct a OneTimeTearDownCommand + + The command wrapped by this command + A SetUpTearDownList for use by the command + + + + SetUpTearDownCommand runs SetUp methods for a suite, + runs the test and then runs TearDown methods. + + + + + Initializes a new instance of the class. + + The inner command. + List of setup/teardown items + + + + TODO: Documentation needed for class + + + + + Initializes a new instance of the class. + + The test being skipped. + + + + Overridden to simply set the CurrentResult to the + appropriate Skipped state. + + The execution context for the test + A TestResult + + + + TestCommand is the abstract base class for all test commands + in the framework. A TestCommand represents a single stage in + the execution of a test, e.g.: SetUp/TearDown, checking for + Timeout, verifying the returned result from a method, etc. + + TestCommands may decorate other test commands so that the + execution of a lower-level command is nested within that + of a higher level command. All nested commands are executed + synchronously, as a single unit. Scheduling test execution + on separate threads is handled at a higher level, using the + task dispatcher. + + + + + Construct a TestCommand for a test. + + The test to be executed + + + + Gets the test associated with this command. + + + + + Runs the test in a specified context, returning a TestResult. + + The TestExecutionContext to be used for running the test. + A TestResult + + + + TestMethodCommand is the lowest level concrete command + used to run actual test cases. + + + + + Initializes a new instance of the class. + + The test. + + + + Runs the test, saving a TestResult in the execution context, as + well as returning it. If the test has an expected result, it + is asserts on that value. Since failed tests and errors throw + an exception, this command must be wrapped in an outer command, + will handle that exception and records the failure. This role + is usually played by the SetUpTearDown command. + + The execution context + + + + TheoryResultCommand adjusts the result of a Theory so that + it fails if all the results were inconclusive. + + + + + Constructs a TheoryResultCommand + + The command to be wrapped by this one + + + + EventListenerTextWriter sends text output to the currently active + ITestEventListener in the form of a TestOutput object. If no event + listener is active in the context, or if there is no context, + the output is forwarded to the supplied default writer. + + + + + Construct an EventListenerTextWriter + + The name of the stream to use for events + The default writer to use if no listener is available + + + + Get the Encoding for this TextWriter + + + + + Write formatted string + + + + + Write formatted string + + + + + Write formatted string + + + + + Write an object + + + + + Write a string + + + + + Write a decimal + + + + + Write a double + + + + + Write formatted string + + + + + Write a ulong + + + + + Write a long + + + + + Write a uint + + + + + Write an int + + + + + Write a char + + + + + Write a boolean + + + + + Write chars + + + + + Write chars + + + + + Write a float + + + + + Write a string with newline + + + + + Write an object with newline + + + + + Write formatted string with newline + + + + + Write formatted string with newline + + + + + Write formatted string with newline + + + + + Write a decimal with newline + + + + + Write a formatted string with newline + + + + + Write a double with newline + + + + + Write a uint with newline + + + + + Write a ulong with newline + + + + + Write a long with newline + + + + + Write an int with newline + + + + + Write a bool with newline + + + + + Write chars with newline + + + + + Write chars with newline + + + + + Write a char with newline + + + + + Write a float with newline + + + + + Write newline + + + + + Enumeration representing the strategy to follow in executing a work item. + The value is only relevant when running under the parallel dispatcher. + + + + + Run directly on same thread + + + + + Enqueue for parallel execution + + + + + Enqueue for non-parallel execution + + + + + WorkItemBuilder class knows how to build a tree of work items from a tree of tests + + + + + Creates a work item. + + The test for which this WorkItem is being created. + The filter to be used in selecting any child Tests. + True if child work items should be created and added. + + + + + Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other. + + + A signed integer that indicates the relative values of and , as shown in the following table.Value Meaning Less than zero is less than .Zero equals .Greater than zero is greater than . + + The first object to compare.The second object to compare. + + + + An IWorkItemDispatcher handles execution of work items. + + + + + The level of parallelism supported. Zero if not supported. + + + + + Start execution, performing any initialization. Sets + the top level work item and dispatches it. + + + + + Dispatch a single work item for execution. The first + work item dispatched is saved as the top-level + work item and used when stopping the run. + + The item to dispatch + + + + Cancel the ongoing run completely. + If no run is in process, the call has no effect. + + true if the IWorkItemDispatcher should abort all currently running WorkItems, false if it should allow all currently running WorkItems to complete + + + + SimpleWorkItemDispatcher handles execution of WorkItems by + directly executing them. It is provided so that a dispatcher + is always available in the context, thereby simplifying the + code needed to run child tests. + + + + + The level of parallelism supported + + + + + Start execution, creating the execution thread, + setting the top level work and dispatching it. + + + + + Dispatch a single work item for execution by + executing it directly. + The item to dispatch + + + + + Cancel (abort or stop) the ongoing run. + If no run is in process, the call has no effect. + + true if the run should be aborted, false if it should allow its currently running test to complete + + + + The TextCapture class intercepts console output and writes it + to the current execution context, if one is present on the thread. + If no execution context is found, the output is written to a + default destination, normally the original destination of the + intercepted output. + + + + + Construct a TextCapture object + + The default destination for non-intercepted output + + + + Gets the Encoding in use by this TextWriter + + + + + Writes a single character + + The char to write + + + + Writes a string + + The string to write + + + + Writes a string followed by a line terminator + + The string to write + + + + Handler for ShiftChange events. + + The shift that is starting or ending. + + + + The dispatcher needs to do different things at different, + non-overlapped times. For example, non-parallel tests may + not be run at the same time as parallel tests. We model + this using the metaphor of a working shift. The WorkShift + class associates one or more WorkItemQueues with one or + more TestWorkers. + + Work in the queues is processed until all queues are empty + and all workers are idle. Both tests are needed because a + worker that is busy may end up adding more work to one of + the queues. At that point, the shift is over and another + shift may begin. This cycle continues until all the tests + have been run. + + + + + Construct a WorkShift + + + + + Event that fires when the shift has ended + + + + + The Name of this shift + + + + + Gets a flag indicating whether the shift is currently active + + + + + Gets a bool indicating whether this shift has any work to do + + + + + Gets a list of the queues associated with this shift. + + Internal for testing - immutable once initialized + + + + Gets the list of workers associated with this shift. + + Internal for testing - immutable once initialized + + + + Add a WorkItemQueue to the shift, starting it if the + shift is currently active. + + + + + Assign a worker to the shift. + + + + + + Start or restart processing for the shift + + + + + End the shift, pausing all queues and raising + the EndOfShift event. + + + + + Shut down the shift. + + + + + Cancel (abort or stop) the shift without completing all work + + true if the WorkShift should be aborted, false if it should allow its currently running tests to complete + + + + A CompositeWorkItem represents a test suite and + encapsulates the execution of the suite as well + as all its child tests. + + + + + List of Child WorkItems + + + + + Indicates whether this work item should use a separate dispatcher. + + + + + Construct a CompositeWorkItem for executing a test suite + using a filter to select child tests. + + The TestSuite to be executed + A filter used to select child tests + + + + Method that actually performs the work. Overridden + in CompositeWorkItem to do one-time setup, run all child + items and then dispatch the one-time teardown work item. + + + + + + + + + + Cancel (abort or stop) a CompositeWorkItem and all of its children + + true if the CompositeWorkItem and all of its children should be aborted, false if it should allow all currently running tests to complete + + + + OneTimeTearDownWorkItem represents the cleanup + and one-time teardown phase of a CompositeWorkItem + + + + + Construct a OneTimeTearDownWOrkItem wrapping a CompositeWorkItem + + The CompositeWorkItem being wrapped + + + + The WorkItem name, overridden to indicate this is the teardown. + + + + + The ExecutionStrategy for use in running this work item + + + + + + + + + + PerformWork is not used in CompositeWorkItem + + + + + A simplified implementation of .NET 4 CountdownEvent + for use in earlier versions of .NET. Only the methods + used by NUnit are implemented. + + + + + Construct a CountdownEvent + + The initial count + + + + Gets the initial count established for the CountdownEvent + + + + + Gets the current count remaining for the CountdownEvent + + + + + Decrement the count by one + + + + + Decrement the count by the specified amount + + + + + Block the thread until the count reaches zero + + + + + The EventPumpState enum represents the state of an + EventPump. + + + + + The pump is stopped + + + + + The pump is pumping events with no stop requested + + + + + The pump is pumping events but a stop has been requested + + + + + EventPump pulls events out of an EventQueue and sends + them to a listener. It is used to send events back to + the client without using the CallContext of the test + runner thread. + + + + + The downstream listener to which we send events + + + + + The queue that holds our events + + + + + Thread to do the pumping + + + + + The current state of the eventpump + + + + + Constructor + + The EventListener to receive events + The event queue to pull events from + + + + Gets or sets the current state of the pump + + + + + Gets or sets the name of this EventPump + (used only internally and for testing). + + + + + Dispose stops the pump + Disposes the used WaitHandle, too. + + + + + Start the pump + + + + + Tell the pump to stop after emptying the queue. + + + + + Our thread proc for removing items from the event + queue and sending them on. Note that this would + need to do more locking if any other thread were + removing events from the queue. + + + + + NUnit.Core.Event is the abstract base for all stored events. + An Event is the stored representation of a call to the + ITestListener interface and is used to record such calls + or to queue them for forwarding on another thread or at + a later time. + + + + + The Send method is implemented by derived classes to send the event to the specified listener. + + The listener. + + + + TestStartedEvent holds information needed to call the TestStarted method. + + + + + Initializes a new instance of the class. + + The test. + + + + Calls TestStarted on the specified listener. + + The listener. + + + + TestFinishedEvent holds information needed to call the TestFinished method. + + + + + Initializes a new instance of the class. + + The result. + + + + Calls TestFinished on the specified listener. + + The listener. + + + + TestOutputEvent holds information needed to call the TestOutput method. + + + + + Initializes a new instance of the class. + + The output object. + + + + Calls TestOutput on the specified listener. + + The listener. + + + + Implements a queue of work items each of which + is queued as a WaitCallback. + + + + + Gets the count of items in the queue. + + + + + Enqueues the specified event + + The event to enqueue. + + + + Removes the first element from the queue and returns it (or null). + + + If true and the queue is empty, the calling thread is blocked until + either an element is enqueued, or is called. + + + + + If the queue not empty + the first element. + + + otherwise, if ==false + or has been called + null. + + + + + + + Stop processing of the queue + + + + + QueuingEventListener uses an EventQueue to store any + events received on its EventListener interface. + + + + + The EventQueue created and filled by this listener + + + + + Construct a QueuingEventListener + + + + + A test has started + + The test that is starting + + + + A test case finished + + Result of the test case + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + A SimpleWorkItem represents a single test case and is + marked as completed immediately upon execution. This + class is also used for skipped or ignored test suites. + + + + + Construct a simple work item for a test. + + The test to be executed + The filter used to select this test + + + + Method that performs actually performs the work. + + + + + Creates a test command for use in running this test. + + A TestCommand + + + + A TestWorker pulls work items from a queue + and executes them. + + + + + Event handler for TestWorker events + + The TestWorker sending the event + The WorkItem that caused the event + + + + Event signaled immediately before executing a WorkItem + + + + + Event signaled immediately after executing a WorkItem + + + + + Construct a new TestWorker. + + The queue from which to pull work items + The name of this worker + + + + The WorkItemQueue from which this worker pulls WorkItems + + + + + The name of this worker - also used for the thread + + + + + Indicates whether the worker thread is running + + + + + Our ThreadProc, which pulls and runs tests in a loop + + + + + Create thread and start processing work items. + + + + + Stop the thread, either immediately or after finishing the current WorkItem + + true if the thread should be aborted, false if it should allow the currently running test to complete + + + + A WorkItem may be an individual test case, a fixture or + a higher level grouping of tests. All WorkItems inherit + from the abstract WorkItem class, which uses the template + pattern to allow derived classes to perform work in + whatever way is needed. + + A WorkItem is created with a particular TestExecutionContext + and is responsible for re-establishing that context in the + current thread before it begins or resumes execution. + + + + + Construct a WorkItem for a particular test. + + The test that the WorkItem will run + Filter used to include or exclude child items + + + + Construct a work Item that wraps another work Item. + Wrapper items are used to represent independently + dispatched tasks, which form part of the execution + of a single test, such as OneTimeTearDown. + + The WorkItem being wrapped + + + + Initialize the TestExecutionContext. This must be done + before executing the WorkItem. + + + Originally, the context was provided in the constructor + but delaying initialization of the context until the item + is about to be dispatched allows changes in the parent + context during OneTimeSetUp to be reflected in the child. + + The TestExecutionContext to use + + + + Event triggered when the item is complete + + + + + Gets the current state of the WorkItem + + + + + The test being executed by the work item + + + + + The name of the work item - defaults to the Test name. + + + + + Filter used to include or exclude child tests + + + + + The execution context + + + + + The worker executing this item. + + + + + The ParallelExecutionStrategy to use for this work item + + + + + Indicates whether this work item should use a separate dispatcher. + + + + + The test result + + + + + Gets the ParallelScope associated with the test, if any, + otherwise returning ParallelScope.Default; + + + + + Execute the current work item, including any + child work items. + + + + + Wait until the execution of this item is complete + + + + + Marks the WorkItem as NotRunnable. + + Reason for test being NotRunnable. + + + + Cancel (abort or stop) a WorkItem + + true if the WorkItem should be aborted, false if it should run to completion + + + + Standard Dispose + + + + + Method that performs actually performs the work. It should + set the State to WorkItemState.Complete when done. + + + + + Method called by the derived class when all work is complete + + + + + Builds the set up tear down list. + + Unsorted array of setup MethodInfos. + Unsorted array of teardown MethodInfos. + A list of SetUpTearDownItems + + + + Changes the result of the test, logging the old and new states + + The new ResultState + The new message + + + + Recursively walks up the test hierarchy to see if the + has been set on any of the parent tests. + + + + + ParallelWorkItemDispatcher handles execution of work items by + queuing them for worker threads to process. + + + + + Event raised whenever a shift is starting. + + + + + Event raised whenever a shift has ended. + + + + + Construct a ParallelWorkItemDispatcher + + Number of workers to use + + + + Number of parallel worker threads + + + + + Enumerates all the shifts supported by the dispatcher + + + + + Enumerates all the Queues supported by the dispatcher + + + + + Start execution, setting the top level work, + enqueuing it and starting a shift to execute it. + + + + + Dispatch a single work item for execution. The first + work item dispatched is saved as the top-level + work item and used when stopping the run. + + The item to dispatch + + + + Cancel the ongoing run completely. + If no run is in process, the call has no effect. + + + + + Save the state of the queues and create a new isolated set + + + + + Remove isolated queues and restore old ones + + + + + WorkItemQueueState indicates the current state of a WorkItemQueue + + + + + The queue is paused + + + + + The queue is running + + + + + The queue is stopped + + + + + A WorkItemQueue holds work items that are ready to + be run, either initially or after some dependency + has been satisfied. + + + + + Initializes a new instance of the class. + + The name of the queue. + Flag indicating whether this is a parallel queue + ApartmentState to use for items on this queue + + + + Gets the name of the work item queue. + + + + + Gets a flag indicating whether this queue is used for parallel execution + + + + + Gets the target ApartmentState for work items on this queue + + + + + Gets the total number of items processed so far + + + + + Gets the current state of the queue + + + + + Get a bool indicating whether the queue is empty. + + + + + Enqueue a WorkItem to be processed + + The WorkItem to process + + + + Enqueue a WorkItem to be processed - internal for testing + + The WorkItem to process + The priority at which to process the item + + + + Dequeue a WorkItem for processing + + A WorkItem or null if the queue has stopped + + + + Start or restart processing of items from the queue + + + + + Signal the queue to stop + + + + + Pause the queue for restarting later + + + + + Save the current inner queue and create new ones for use by + a non-parallel fixture with parallel children. + + + + + Restore the inner queue that was previously saved + + + + + The current state of a work item + + + + + Ready to run or continue + + + + + Work Item is executing + + + + + Complete + + + + + A base class for multi-part filters + + + + + Constructs an empty CompositeFilter + + + + + Constructs a CompositeFilter from an array of filters + + + + + + Adds a filter to the list of filters + + The filter to be added + + + + Return a list of the composing filters. + + + + + Checks whether the CompositeFilter is matched by a test. + + The test to be matched + + + + Checks whether the CompositeFilter is matched by a test. + + The test to be matched + + + + Checks whether the CompositeFilter is explicit matched by a test. + + The test to be matched + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Gets the element name + + Element name + + + + PropertyFilter is able to select or exclude tests + based on their properties. + + + + + Construct a PropertyFilter using a property name and expected value + + A property name + The expected value of the property + + + + Check whether the filter matches a test + + The test to be matched + + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Gets the element name + + Element name + + + + TestName filter selects tests based on their Name + + + + + Construct a TestNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + ClassName filter selects tests based on the class FullName + + + + + Construct a FullNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + FullName filter selects tests based on their FullName + + + + + Construct a MethodNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + ClassName filter selects tests based on the class FullName + + + + + Construct a NamespaceFilter for a single namespace + + The namespace the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + IdFilter selects tests based on their id + + + + + Construct an IdFilter for a single value + + The id the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + ValueMatchFilter selects tests based on some value, which + is expected to be contained in the test. + + + + + Returns the value matched by the filter - used for testing + + + + + Indicates whether the value is a regular expression + + + + + Construct a ValueMatchFilter for a single value. + + The value to be included. + + + + Match the input provided by the derived class + + The value to be matchedT + True for a match, false otherwise. + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Gets the element name + + Element name + + + + Combines multiple filters so that a test must pass all + of them in order to pass this filter. + + + + + Constructs an empty AndFilter + + + + + Constructs an AndFilter from an array of filters + + + + + + Checks whether the AndFilter is matched by a test + + The test to be matched + True if all the component filters pass, otherwise false + + + + Checks whether the AndFilter is matched by a test + + The test to be matched + True if all the component filters match, otherwise false + + + + Checks whether the AndFilter is explicit matched by a test. + + The test to be matched + True if all the component filters explicit match, otherwise false + + + + Gets the element name + + Element name + + + + CategoryFilter is able to select or exclude tests + based on their categories. + + + + + Construct a CategoryFilter using a single category name + + A category name + + + + Check whether the filter matches a test + + The test to be matched + + + + + Gets the element name + + Element name + + + + NotFilter negates the operation of another filter + + + + + Construct a not filter on another filter + + The filter to be negated + + + + Gets the base filter + + + + + Determine if a particular test passes the filter criteria. The default + implementation checks the test itself, its parents and any descendants. + + Derived classes may override this method or any of the Match methods + to change the behavior of the filter. + + The test to which the filter is applied + True if the test passes the filter, otherwise false + + + + Check whether the filter matches a test + + The test to be matched + True if it matches, otherwise false + + + + Determine if a test matches the filter explicitly. That is, it must + be a direct match of the test itself or one of it's children. + + The test to which the filter is applied + True if the test matches the filter explicitly, otherwise false + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Combines multiple filters so that a test must pass one + of them in order to pass this filter. + + + + + Constructs an empty OrFilter + + + + + Constructs an AndFilter from an array of filters + + + + + + Checks whether the OrFilter is matched by a test + + The test to be matched + True if any of the component filters pass, otherwise false + + + + Checks whether the OrFilter is matched by a test + + The test to be matched + True if any of the component filters match, otherwise false + + + + Checks whether the OrFilter is explicit matched by a test + + The test to be matched + True if any of the component filters explicit match, otherwise false + + + + Gets the element name + + Element name + + + + FullName filter selects tests based on their FullName + + + + + Construct a FullNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + InvalidPlatformException is thrown when the platform name supplied + to a test is not recognized. + + + + + Instantiates a new instance of the class. + + + + + Instantiates a new instance of the class + + The message. + + + + Instantiates a new instance of the class + + The message. + The inner. + + + + Serialization constructor for the class + + + + + Interface for logging within the engine + + + + + Logs the specified message at the error level. + + The message. + + + + Logs the specified message at the error level. + + The message. + The arguments. + + + + Logs the specified message at the warning level. + + The message. + + + + Logs the specified message at the warning level. + + The message. + The arguments. + + + + Logs the specified message at the info level. + + The message. + + + + Logs the specified message at the info level. + + The message. + The arguments. + + + + Logs the specified message at the debug level. + + The message. + + + + Logs the specified message at the debug level. + + The message. + The arguments. + + + + InternalTrace provides facilities for tracing the execution + of the NUnit framework. Tests and classes under test may make use + of Console writes, System.Diagnostics.Trace or various loggers and + NUnit itself traps and processes each of them. For that reason, a + separate internal trace is needed. + + Note: + InternalTrace uses a global lock to allow multiple threads to write + trace messages. This can easily make it a bottleneck so it must be + used sparingly. Keep the trace Level as low as possible and only + insert InternalTrace writes where they are needed. + TODO: add some buffering and a separate writer thread as an option. + TODO: figure out a way to turn on trace in specific classes only. + + + + + Gets a flag indicating whether the InternalTrace is initialized + + + + + Initialize the internal trace facility using the name of the log + to be written to and the trace level. + + The log name + The trace level + + + + Initialize the internal trace using a provided TextWriter and level + + A TextWriter + The InternalTraceLevel + + + + Get a named Logger + + + + + + Get a logger named for a particular Type. + + + + + InternalTraceLevel is an enumeration controlling the + level of detailed presented in the internal log. + + + + + Use the default settings as specified by the user. + + + + + Do not display any trace messages + + + + + Display Error messages only + + + + + Display Warning level and higher messages + + + + + Display informational and higher messages + + + + + Display debug messages and higher - i.e. all messages + + + + + Display debug messages and higher - i.e. all messages + + + + + A trace listener that writes to a separate file per domain + and process using it. + + + + + Construct an InternalTraceWriter that writes to a file. + + Path to the file to use + + + + Construct an InternalTraceWriter that writes to a + TextWriter provided by the caller. + + + + + + Returns the character encoding in which the output is written. + + The character encoding in which the output is written. + + + + Writes a character to the text string or stream. + + The character to write to the text stream. + + + + Writes a string to the text string or stream. + + The string to write. + + + + Writes a string followed by a line terminator to the text string or stream. + + The string to write. If is null, only the line terminator is written. + + + + Releases the unmanaged resources used by the and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Clears all buffers for the current writer and causes any buffered data to be written to the underlying device. + + + + + Provides internal logging to the NUnit framework + + + + + Initializes a new instance of the class. + + The name. + The log level. + The writer where logs are sent. + + + + Logs the message at error level. + + The message. + + + + Logs the message at error level. + + The message. + The message arguments. + + + + Logs the message at warm level. + + The message. + + + + Logs the message at warning level. + + The message. + The message arguments. + + + + Logs the message at info level. + + The message. + + + + Logs the message at info level. + + The message. + The message arguments. + + + + Logs the message at debug level. + + The message. + + + + Logs the message at debug level. + + The message. + The message arguments. + + + + The MethodWrapper class wraps a MethodInfo so that it may + be used in a platform-independent manner. + + + + + Construct a MethodWrapper for a Type and a MethodInfo. + + + + + Construct a MethodInfo for a given Type and method name. + + + + + Gets the Type from which this method was reflected. + + + + + Gets the MethodInfo for this method. + + + + + Gets the name of the method. + + + + + Gets a value indicating whether the method is abstract. + + + + + Gets a value indicating whether the method is public. + + + + + Gets a value indicating whether the method contains unassigned generic type parameters. + + + + + Gets a value indicating whether the method is a generic method. + + + + + Gets a value indicating whether the MethodInfo represents the definition of a generic method. + + + + + Gets the return Type of the method. + + + + + Gets the parameters of the method. + + + + + + Returns the Type arguments of a generic method or the Type parameters of a generic method definition. + + + + + Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. + + The type arguments to be used + A new IMethodInfo with the type arguments replaced + + + + Returns an array of custom attributes of the specified type applied to this method + + + + + Gets a value indicating whether one or more attributes of the specified type are defined on the method. + + + + + Invokes the method, converting any TargetInvocationException to an NUnitException. + + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + Override ToString() so that error messages in NUnit's own tests make sense + + + + + Helper methods for converting parameters to numeric values to supported types + + + + + Converts an array of objects to the , if it is supported. + + + + + The ParameterWrapper class wraps a ParameterInfo so that it may + be used in a platform-independent manner. + + + + + Construct a ParameterWrapper for a given method and parameter + + + + + + + Gets a value indicating whether the parameter is optional + + + + + Gets an IMethodInfo representing the method for which this is a parameter. + + + + + Gets the underlying ParameterInfo + + + + + Gets the Type of the parameter + + + + + Returns an array of custom attributes of the specified type applied to this method + + + + + Gets a value indicating whether one or more attributes of the specified type are defined on the parameter. + + + + + TestCaseTimeoutException is thrown when a test running directly + on a TestWorker thread is cancelled due to timeout. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Serialization Constructor + + + + + TestNameGenerator is able to create test names according to + a coded pattern. + + + + + Default pattern used to generate names + + + + + Construct a TestNameGenerator + + + + + Construct a TestNameGenerator + + The pattern used by this generator. + + + + Get the display name for a TestMethod and it's arguments + + A TestMethod + The display name + + + + Get the display name for a TestMethod and it's arguments + + A TestMethod + Arguments to be used + The display name + + + + Used for resolving the type difference between objects. + + + + + Gets the shortened type name difference between and . + + The expected object. + The actual object. + Output of the unique type name for the expected object. + Output of the unique type name for actual object. + + + + Gets the shortened type name difference between and . + + The expected object . + The actual object . + Output of the unique type name for the expected object. + Output of the unique type name for actual object. + + + + Obtain the shortened generic template parameters of the given and , + if they are generic. + + The expected . + The actual . + Shortened generic parameters of the expected . + Shortened generic parameters of the actual . + + + + Obtain a shortened name of the given . + + + + + Shorten the given names by only including the relevant differing namespaces/types, if they differ. + + The expected . + The actual . + The shortened expected name. + The shortened actual name. + + + + Returns whether or not the is generic. + + + + + Returns the fully qualified generic name of a given . + + + + + Reconstruct a generic type name using the provided generic type name, and a + of the template parameters. + + The name of the generic type, including the number of template parameters expected. + A of names of the template parameters of the provided generic type. + + + + Obtain the shortened generic names of the given expected and actual s. + + The expected . + The actual . + The shortened expected generic name. + The shortened actual generic name. + + + + The TypeWrapper class wraps a Type so it may be used in + a platform-independent manner. + + + + + Construct a TypeWrapper for a specified Type. + + + + + Gets the underlying Type on which this TypeWrapper is based. + + + + + Gets the base type of this type as an ITypeInfo + + + + + Gets the Name of the Type + + + + + Gets the FullName of the Type + + + + + Gets the assembly in which the type is declared + + + + + Gets the namespace of the Type + + + + + Gets a value indicating whether the type is abstract. + + + + + Gets a value indicating whether the Type is a generic Type + + + + + Returns true if the Type wrapped is T + + + + + Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. + + + + + Gets a value indicating whether the Type is a generic Type definition + + + + + Gets a value indicating whether the type is sealed. + + + + + Gets a value indicating whether this type represents a static class. + + + + + Get the display name for this type + + + + + Get the display name for an object of this type, constructed with the specified args. + + + + + Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments + + + + + Returns a Type representing a generic type definition from which this Type can be constructed. + + + + + Returns an array of custom attributes of the specified type applied to this type + + + + + Returns a value indicating whether the type has an attribute of the specified type. + + + + + + + + Returns a flag indicating whether this type has a method with an attribute of the specified type. + + + + + + + Returns an array of IMethodInfos for methods of this Type + that match the specified flags. + + + + + Gets the public constructor taking the specified argument Types + + + + + Returns a value indicating whether this Type has a public constructor taking the specified argument Types. + + + + + Construct an object of this Type, using the specified arguments. + + + + + Override ToString() so that error messages in NUnit's own tests make sense + + + + + TextMessageWriter writes constraint descriptions and messages + in displayable form as a text stream. It tailors the display + of individual message components to form the standard message + format of NUnit assertion failure messages. + + + + + Prefix used for the expected value line of a message + + + + + Prefix used for the actual value line of a message + + + + + Length of a message prefix + + + + + Construct a TextMessageWriter + + + + + Construct a TextMessageWriter, specifying a user message + and optional formatting arguments. + + + + + + + Gets or sets the maximum line length for this writer + + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a given + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The result of the constraint that failed + + + + Gets the unique type name between expected and actual. + + The expected value + The actual value causing the failure + Output of the unique type name for expected + Output of the unique type name for actual + + + + Display Expected and Actual lines for given values. This + method may be called by constraints that need more control over + the display of actual and expected values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given values, including + a tolerance value on the expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in string comparisons + If true, clip the strings to fit the max line length + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Write the generic 'Expected' line for a constraint + + The constraint that failed + + + + Write the generic 'Expected' line for a given value + + The expected value + + + + Write the generic 'Expected' line for a given value + and tolerance. + + The expected value + The tolerance within which the test was made + + + + Write the generic 'Actual' line for a constraint + + The ConstraintResult for which the actual value is to be written + + + + Write the generic 'Actual' line for a given value + + The actual value causing a failure + + + + GenericMethodHelper is able to deduce the Type arguments for + a generic method from the actual arguments provided. + + + + + Construct a GenericMethodHelper for a method + + MethodInfo for the method to examine + + + + Return the type arguments for the method, deducing them + from the arguments actually provided. + + The arguments to the method + An array of type arguments. + + + + InvalidTestFixtureException is thrown when an appropriate test + fixture constructor using the provided arguments cannot be found. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Serialization Constructor + + + + + Randomizer returns a set of random values in a repeatable + way, to allow re-running of tests if necessary. It extends + the .NET Random class, providing random values for a much + wider range of types. + + The class is used internally by the framework to generate + test case data and is also exposed for use by users through + the TestContext.Random property. + + + For consistency with the underlying Random Type, methods + returning a single value use the prefix "Next..." Those + without an argument return a non-negative value up to + the full positive range of the Type. Overloads are provided + for specifying a maximum or a range. Methods that return + arrays or strings use the prefix "Get..." to avoid + confusion with the single-value methods. + + + + + Initial seed used to create randomizers for this run + + + + + Get a Randomizer for a particular member, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. + + + + + Get a randomizer for a particular parameter, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. + + + + + Create a new Randomizer using the next seed + available to ensure that each randomizer gives + a unique sequence of values. + + + + + + Default constructor + + + + + Construct based on seed value + + + + + + Returns a random unsigned int. + + + + + Returns a random unsigned int less than the specified maximum. + + + + + Returns a random unsigned int within a specified range. + + + + + Returns a non-negative random short. + + + + + Returns a non-negative random short less than the specified maximum. + + + + + Returns a non-negative random short within a specified range. + + + + + Returns a random unsigned short. + + + + + Returns a random unsigned short less than the specified maximum. + + + + + Returns a random unsigned short within a specified range. + + + + + Returns a random long. + + + + + Returns a random long less than the specified maximum. + + + + + Returns a non-negative random long within a specified range. + + + + + Returns a random ulong. + + + + + Returns a random ulong less than the specified maximum. + + + + + Returns a non-negative random long within a specified range. + + + + + Returns a random Byte + + + + + Returns a random Byte less than the specified maximum. + + + + + Returns a random Byte within a specified range + + + + + Returns a random SByte + + + + + Returns a random sbyte less than the specified maximum. + + + + + Returns a random sbyte within a specified range + + + + + Returns a random bool + + + + + Returns a random bool based on the probability a true result + + + + + Returns a random double between 0.0 and the specified maximum. + + + + + Returns a random double within a specified range. + + + + + Returns a random float. + + + + + Returns a random float between 0.0 and the specified maximum. + + + + + Returns a random float within a specified range. + + + + + Returns a random enum value of the specified Type as an object. + + + + + Returns a random enum value of the specified Type. + + + + + Default characters for random functions. + + Default characters are the English alphabet (uppercase & lowercase), arabic numerals, and underscore + + + + Generate a random string based on the characters from the input string. + + desired length of output string. + string representing the set of characters from which to construct the resulting string + A random string of arbitrary length + + + + Generate a random string based on the characters from the input string. + + desired length of output string. + A random string of arbitrary length + Uses DefaultStringChars as the input character set + + + + Generate a random string based on the characters from the input string. + + A random string of the default length + Uses DefaultStringChars as the input character set + + + + Returns a random decimal. + + + + + Returns a random decimal between positive zero and the specified maximum. + + + + + Returns a random decimal within a specified range, which is not + permitted to exceed decimal.MaxVal in the current implementation. + + + A limitation of this implementation is that the range from min + to max must not exceed decimal.MaxVal. + + + + + Generates a valid version 4 . + + + + + StackFilter class is used to remove internal NUnit + entries from a stack trace so that the resulting + trace provides better information about the test. + + + + + Single instance of our default filter + + + + + Construct a stack filter instance + + Regex pattern used to delete lines from the top of the stack + Regex pattern used to delete lines from the bottom of the stack + + + + Construct a stack filter instance + + Regex pattern used to delete lines from the top of the stack + + + + Construct a stack filter instance + + + + + Filters a raw stack trace and returns the result. + + The original stack trace + A filtered stack trace + + + + Provides methods to support legacy string comparison methods. + + + + + Compares two strings for equality, ignoring case if requested. + + The first string. + The second string.. + if set to true, the case of the letters in the strings is ignored. + Zero if the strings are equivalent, a negative number if strA is sorted first, a positive number if + strB is sorted first + + + + Compares two strings for equality, ignoring case if requested. + + The first string. + The second string.. + if set to true, the case of the letters in the strings is ignored. + True if the strings are equivalent, false if not. + + + + Provides methods to support consistent checking for constaints methods. + + + + + Requires that the provided object is actually of the type required. + + The object to verify. + Name of the parameter as passed into the checking method. + + If and can be null, returns null rather than throwing when is null. + If cannot be null, this parameter is ignored. + The type to require. + + + + The TestCaseParameters class encapsulates method arguments and + other selected parameters needed for constructing + a parameterized test case. + + + + + Default Constructor creates an empty parameter set + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a ParameterSet from an object implementing ITestCaseData + + + + + + Type arguments used to create a generic fixture instance + + + + + TestParameters is the abstract base class for all classes + that know how to provide data for constructing a test. + + + + + Default Constructor creates an empty parameter set + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a ParameterSet from an object implementing ITestData + + + + + + The RunState for this set of parameters. + + + + + The arguments to be used in running the test, + which must match the method signature. + + + + + A name to be used for this test case in lieu + of the standard generated name containing + the argument list. + + + + + Gets the property dictionary for this test + + + + + Applies ParameterSet values to the test itself. + + A test. + + + + The original arguments provided by the user, + used for display purposes. + + + + + Enumeration indicating whether the tests are + running normally or being cancelled. + + + + + Running normally with no stop requested + + + + + A graceful stop has been requested + + + + + A forced stop has been requested + + + + + The PropertyNames class provides static constants for the + standard property ids that NUnit uses on tests. + + + + + The FriendlyName of the AppDomain in which the assembly is running + + + + + The selected strategy for joining parameter data into test cases + + + + + The process ID of the executing assembly + + + + + The stack trace from any data provider that threw + an exception. + + + + + The reason a test was not run + + + + + The author of the tests + + + + + The ApartmentState required for running the test + + + + + The categories applying to a test + + + + + The Description of a test + + + + + The number of threads to be used in running tests + + + + + The maximum time in ms, above which the test is considered to have failed + + + + + The ParallelScope associated with a test + + + + + The number of times the test should be repeated + + + + + Indicates that the test should be run on a separate thread + + + + + The culture to be set for a test + + + + + The UI culture to be set for a test + + + + + The type that is under test + + + + + The timeout value for the test + + + + + The test will be ignored until the given date + + + + + The optional Order the test will run in + + + + + CultureDetector is a helper class used by NUnit to determine + whether a test should be run based on the current culture. + + + + + Default constructor uses the current culture. + + + + + Construct a CultureDetector for a particular culture for testing. + + The culture to be used + + + + Test to determine if one of a collection of cultures + is being used currently. + + + + + + + Tests to determine if the current culture is supported + based on a culture attribute. + + The attribute to examine + + + + + Test to determine if the a particular culture or comma- + delimited set of cultures is in use. + + Name of the culture or comma-separated list of culture ids + True if the culture is in use on the system + + + + Return the last failure reason. Results are not + defined if called before IsSupported( Attribute ) + is called. + + + + + ExceptionHelper provides static methods for working with exceptions + + + + + Rethrows an exception, preserving its stack trace + + The exception to rethrow + + + + Builds up a message, using the Message field of the specified exception + as well as any InnerExceptions. Optionally excludes exception names, + creating a more readable message. + + The exception. + Flag indicating whether exception names should be excluded. + A combined message string. + + + + Builds up a message, using the Message field of the specified exception + as well as any InnerExceptions. + + The exception. + A combined stack trace. + + + + Gets the stack trace of the exception. If no stack trace + is provided, returns "No stack trace available". + + The exception. + A string representation of the stack trace. + + + + InvalidTestFixtureException is thrown when an appropriate test + fixture constructor using the provided arguments cannot be found. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Serialization Constructor + + + + + Thrown when an assertion failed. Here to preserve the inner + exception and hence its stack trace. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The error message that explains + the reason for the exception + + + + Initializes a new instance of the class. + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + OSPlatform represents a particular operating system platform + + + + + Platform ID for Unix as defined by Microsoft .NET 2.0 and greater + + + + + Platform ID for Unix as defined by Mono + + + + + Platform ID for XBox as defined by .NET and Mono + + + + + Platform ID for MacOSX as defined by .NET and Mono + + + + + Get the OSPlatform under which we are currently running + + + + + Gets the actual OS Version, not the incorrect value that might be + returned for Win 8.1 and Win 10 + + + If an application is not manifested as Windows 8.1 or Windows 10, + the version returned from Environment.OSVersion will not be 6.3 and 10.0 + respectively, but will be 6.2 and 6.3. The correct value can be found in + the registry. + + The original version + The correct OS version + + + + Product Type Enumeration used for Windows + + + + + Product type is unknown or unspecified + + + + + Product type is Workstation + + + + + Product type is Domain Controller + + + + + Product type is Server + + + + + Construct from a platform ID and version + + + + + Construct from a platform ID, version and product type + + + + + Get the platform ID of this instance + + + + + Implemented to use in place of Environment.OSVersion.ToString() + + A representation of the platform ID and version in an approximation of the format used by Environment.OSVersion.ToString() + + + + Get the Version of this instance + + + + + Get the Product Type of this instance + + + + + Return true if this is a windows platform + + + + + Return true if this is a Unix or Linux platform + + + + + Return true if the platform is Win32S + + + + + Return true if the platform is Win32Windows + + + + + Return true if the platform is Win32NT + + + + + Return true if the platform is Windows CE + + + + + Return true if the platform is Xbox + + + + + Return true if the platform is MacOSX + + + + + Return true if the platform is Windows 95 + + + + + Return true if the platform is Windows 98 + + + + + Return true if the platform is Windows ME + + + + + Return true if the platform is NT 3 + + + + + Return true if the platform is NT 4 + + + + + Return true if the platform is NT 5 + + + + + Return true if the platform is Windows 2000 + + + + + Return true if the platform is Windows XP + + + + + Return true if the platform is Windows 2003 Server + + + + + Return true if the platform is NT 6 + + + + + Return true if the platform is NT 6.0 + + + + + Return true if the platform is NT 6.1 + + + + + Return true if the platform is NT 6.2 + + + + + Return true if the platform is NT 6.3 + + + + + Return true if the platform is Vista + + + + + Return true if the platform is Windows 2008 Server (original or R2) + + + + + Return true if the platform is Windows 2008 Server (original) + + + + + Return true if the platform is Windows 2008 Server R2 + + + + + Return true if the platform is Windows 2012 Server (original or R2) + + + + + Return true if the platform is Windows 2012 Server (original) + + + + + Return true if the platform is Windows 2012 Server R2 + + + + + Return true if the platform is Windows 7 + + + + + Return true if the platform is Windows 8 + + + + + Return true if the platform is Windows 8.1 + + + + + Return true if the platform is Windows 10 + + + + + Return true if the platform is Windows Server. This is named Windows + Server 10 to distinguish it from previous versions of Windows Server. + + + + + The TestCaseParameters class encapsulates method arguments and + other selected parameters needed for constructing + a parameterized test case. + + + + + The expected result to be returned + + + + + Default Constructor creates an empty parameter set + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a ParameterSet from an object implementing ITestCaseData + + + + + + The expected result of the test, which + must match the method return type. + + + + + Gets a value indicating whether an expected result was specified. + + + + + PlatformHelper class is used by the PlatformAttribute class to + determine whether a platform is supported. + + + + + Comma-delimited list of all supported OS platform constants + + + + + Comma-delimited list of all supported Runtime platform constants + + + + + Default constructor uses the operating system and + common language runtime of the system. + + + + + Construct a PlatformHelper for a particular operating + system and common language runtime. Used in testing. + + RuntimeFramework to be used + OperatingSystem to be used + + + + Test to determine if one of a collection of platforms + is being used currently. + + + + + + + Tests to determine if the current platform is supported + based on a platform attribute. + + The attribute to examine + + + + + Tests to determine if the current platform is supported + based on a platform attribute. + + The attribute to examine + + + + + Test to determine if a particular platform or comma-delimited set of platforms is in use. + + Name of the platform or comma-separated list of platform ids + True if the platform is in use on the system + + + + Return the last failure reason. Results are not + defined if called before IsSupported( Attribute ) + is called. + + + + + A PropertyBag represents a collection of name value pairs + that allows duplicate entries with the same key. Methods + are provided for adding a new pair as well as for setting + a key to a single value. All keys are strings but values + may be of any type. Null values are not permitted, since + a null entry represents the absence of the key. + + + + + Adds a key/value pair to the property set + + The key + The value + + + + Sets the value for a key, removing any other + values that are already in the property set. + + + + + + + Gets a single value for a key, using the first + one if multiple values are present and returning + null if the value is not found. + + + + + + + Gets a flag indicating whether the specified key has + any entries in the property set. + + The key to be checked + + True if their are values present, otherwise false + + + + + Gets a collection containing all the keys in the property set + + + + + + Gets or sets the list of values for a particular key + + + + + Returns an XmlNode representing the current PropertyBag. + + Not used + An XmlNode representing the PropertyBag + + + + Returns an XmlNode representing the PropertyBag after + adding it as a child of the supplied parent node. + + The parent node. + Not used + + + + + Helper methods for inspecting a type by reflection. + + Many of these methods take ICustomAttributeProvider as an + argument to avoid duplication, even though certain attributes can + only appear on specific types of members, like MethodInfo or Type. + + In the case where a type is being examined for the presence of + an attribute, interface or named member, the Reflect methods + operate with the full name of the member being sought. This + removes the necessity of the caller having a reference to the + assembly that defines the item being sought and allows the + NUnit core to inspect assemblies that reference an older + version of the NUnit framework. + + + + + Examine a fixture type and return an array of methods having a + particular attribute. The array is order with base methods first. + + The type to examine + The attribute Type to look for + Specifies whether to search the fixture type inheritance chain + The array of methods found + + + + Examine a fixture type and return true if it has a method with + a particular attribute. + + The type to examine + The attribute Type to look for + True if found, otherwise false + + + + Invoke the default constructor on a Type + + The Type to be constructed + An instance of the Type + + + + Invoke a constructor on a Type with arguments + + The Type to be constructed + Arguments to the constructor + An instance of the Type + + + + Returns an array of types from an array of objects. + Used because the compact framework doesn't support + Type.GetTypeArray() + + An array of objects + An array of Types + + + + Invoke a parameterless method returning void on an object. + + A MethodInfo for the method to be invoked + The object on which to invoke the method + + + + Invoke a method, converting any TargetInvocationException to an NUnitException. + + A MethodInfo for the method to be invoked + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + + Selects the ultimate shadowing property just like would, + rather than throwing + for properties that shadow properties of a different property type + which is what does. + + + If you request both public and nonpublic properties, every public property is preferred + over every nonpublic property. It would violate the principle of least surprise for a + derived class’s implementation detail to be chosen over the public API for a type. + + + See . + See . + See . + + + + The TestResult class represents the result of a test. + + + + + Error message for when child tests have errors + + + + + Error message for when child tests have warnings + + + + + Error message for when child tests are ignored + + + + + The minimum duration for tests + + + + + Aggregate assertion count + + + + + ReaderWriterLock + + + + + Construct a test result given a Test + + The test to be used + + + + Gets the test with which this result is associated. + + + + + Gets the ResultState of the test result, which + indicates the success or failure of the test. + + + + + Gets the name of the test result + + + + + Gets the full name of the test result + + + + + Gets or sets the elapsed time for running the test in seconds + + + + + Gets or sets the time the test started running. + + + + + Gets or sets the time the test finished running. + + + + + Adds a test attachment to the test result + + The TestAttachment object to attach + + + + Gets the collection of files attached to the test + + + + + Gets the message associated with a test + failure or with not running the test + + + + + Gets any stacktrace associated with an + error or failure. + + + + + Gets or sets the count of asserts executed + when running the test. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + Gets a TextWriter, which will write output to be included in the result. + + + + + Gets any text output written to this result. + + + + + Gets a list of assertion results associated with the test. + + + + + Returns the Xml representation of the result. + + If true, descendant results are included + An XmlNode representing the result + + + + Adds the XML representation of the result as a child of the + supplied parent node.. + + The parent node. + If true, descendant results are included + + + + + Gets a count of pending failures (from Multiple Assert) + + + + + Gets the worst assertion status (highest enum) in all the assertion results + + + + + Set the result of the test + + The ResultState to use in the result + + + + Set the result of the test + + The ResultState to use in the result + A message associated with the result state + + + + Set the result of the test + + The ResultState to use in the result + A message associated with the result state + Stack trace giving the location of the command + + + + Set the test result based on the type of exception thrown + + The exception that was thrown + + + + Set the test result based on the type of exception thrown + + The exception that was thrown + The FailureSite to use in the result + + + + RecordTearDownException appends the message and stacktrace + from an exception arising during teardown of the test + to any previously recorded information, so that any + earlier failure information is not lost. Note that + calling Assert.Ignore, Assert.Inconclusive, etc. during + teardown is treated as an error. If the current result + represents a suite, it may show a teardown error even + though all contained tests passed. + + The Exception to be recorded + + + + Determine result after test has run to completion. + + + + + Record an assertion result + + + + + Record an assertion result + + + + + Record an assertion result + + + + + Adds a reason element to a node and returns it. + + The target node. + The new reason element. + + + + Adds a failure element to a node and returns it. + + The target node. + The new failure element. + + + + Adds an attachments element to a node and returns it. + + The target node. + The new attachments element. + + + + Creates a failure message incorporating failures + from a Multiple Assert block for use by runners + that don't know about AssertionResults. + + Message as a string + + + + Enumeration identifying a common language + runtime implementation. + + + + Any supported runtime framework + + + Microsoft .NET Framework + + + Microsoft Shared Source CLI + + + Mono + + + MonoTouch + + + + RuntimeFramework represents a particular version + of a common language runtime implementation. + + + + + DefaultVersion is an empty Version, used to indicate that + NUnit should select the CLR version to use for the test. + + + + + Construct from a runtime type and version. If the version has + two parts, it is taken as a framework version. If it has three + or more, it is taken as a CLR version. In either case, the other + version is deduced based on the runtime type and provided version. + + The runtime type of the framework + The version of the framework + + + + Static method to return a RuntimeFramework object + for the framework that is currently in use. + + + + + The type of this runtime framework + + + + + The framework version for this runtime framework + + + + + The CLR version for this runtime framework + + + + + Return true if any CLR version may be used in + matching this RuntimeFramework object. + + + + + Returns the Display name for this framework + + + + + Parses a string representing a RuntimeFramework. + The string may be just a RuntimeType name or just + a Version or a hyphenated RuntimeType-Version or + a Version prefixed by 'versionString'. + + + + + + + Overridden to return the short name of the framework + + + + + + Returns true if the current framework matches the + one supplied as an argument. Two frameworks match + if their runtime types are the same or either one + is RuntimeType.Any and all specified version components + are equal. Negative (i.e. unspecified) version + components are ignored. + + The RuntimeFramework to be matched. + True on match, otherwise false + + + + Helper class used to save and restore certain static or + singleton settings in the environment that affect tests + or which might be changed by the user tests. + + + + + Link to a prior saved context + + + + + Indicates that a stop has been requested + + + + + The event listener currently receiving notifications + + + + + The number of assertions for the current test + + + + + The current culture + + + + + The current UI culture + + + + + The current test result + + + + + The current Principal. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + An existing instance of TestExecutionContext. + + + + Gets and sets the current context. + + + + + Gets or sets the current test + + + + + The time the current test started execution + + + + + The time the current test started in Ticks + + + + + Gets or sets the current test result + + + + + Gets a TextWriter that will send output to the current test result. + + + + + The current test object - that is the user fixture + object on which tests are being executed. + + + + + Get or set indicator that run should stop on the first error + + + + + Gets an enum indicating whether a stop has been requested. + + + + + The current test event listener + + + + + The current WorkItemDispatcher. Made public for + use by nunitlite.tests + + + + + The ParallelScope to be used by tests running in this context. + For builds with out the parallel feature, it has no effect. + + + + + Default tolerance value used for floating point equality + when no other tolerance is specified. + + + + + The worker that spawned the context. + For builds without the parallel feature, it is null. + + + + + Gets the RandomGenerator specific to this Test + + + + + Gets the assert count. + + The assert count. + + + + The current nesting level of multiple assert blocks + + + + + Gets or sets the test case timeout value + + + + + Gets a list of ITestActions set by upstream tests + + + + + Saves or restores the CurrentCulture + + + + + Saves or restores the CurrentUICulture + + + + + Gets or sets the current for the Thread. + + + + + The current head of the ValueFormatter chain, copied from MsgUtils.ValueFormatter + + + + + If true, all tests must run on the same thread. No new thread may be spawned. + + + + + Record any changes in the environment made by + the test code in the execution context so it + will be passed on to lower level tests. + + + + + Set up the execution environment to match a context. + Note that we may be running on the same thread where the + context was initially created or on a different thread. + + + + + Increments the assert count by one. + + + + + Increments the assert count by a specified amount. + + + + + Adds a new ValueFormatterFactory to the chain of formatters + + The new factory + + + + Obtain lifetime service object + + + + + + An IsolatedContext is used when running code + that may effect the current result in ways that + should not impact the final result of the test. + A new TestExecutionContext is created with an + initially clear result, which is discarded on + exiting the context. + + + using (new TestExecutionContext.IsolatedContext()) + { + // Code that should not impact the result + } + + + + + Save the original current TestExecutionContext and + make a new isolated context current. + + + + + Restore the original TestExecutionContext. + + + + + An AdhocTestExecutionContext is created whenever a context is needed + but not available in CurrentContext. This happens when tests are run + on an adoc basis or Asserts are used outside of tests. + + + + + Construct an AdhocTestExecutionContext, which is used + whenever the current TestExecutionContext is found to be null. + + + + + Interface to be implemented by filters applied to tests. + The filter applies when running the test, after it has been + loaded, since this is the only time an ITest exists. + + + + + Unique Empty filter. + + + + + Indicates whether this is the EmptyFilter + + + + + Indicates whether this is a top-level filter, + not contained in any other filter. + + + + + Determine if a particular test passes the filter criteria. The default + implementation checks the test itself, its parents and any descendants. + + Derived classes may override this method or any of the Match methods + to change the behavior of the filter. + + The test to which the filter is applied + True if the test passes the filter, otherwise false + + + + Determine if a test matches the filter explicitly. That is, it must + be a direct match of the test itself or one of it's children. + + The test to which the filter is applied + True if the test matches the filter explicitly, otherwise false + + + + Determine whether the test itself matches the filter criteria, without + examining either parents or descendants. This is overridden by each + different type of filter to perform the necessary tests. + + The test to which the filter is applied + True if the filter matches the any parent of the test + + + + Determine whether any ancestor of the test matches the filter criteria + + The test to which the filter is applied + True if the filter matches the an ancestor of the test + + + + Determine whether any descendant of the test matches the filter criteria. + + The test to be matched + True if at least one descendant matches the filter criteria + + + + Create a TestFilter instance from an xml representation. + + + + + Create a TestFilter from it's TNode representation + + + + + Nested class provides an empty filter - one that always + returns true when called. It never matches explicitly. + + + + + Adds an XML node + + True if recursive + The added XML node + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + TestListener provides an implementation of ITestListener that + does nothing. It is used only through its NULL property. + + + + + Called when a test has just started + + The test that is starting + + + + Called when a test case has finished + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + Construct a new TestListener - private so it may not be used. + + + + + Get a listener that does nothing + + + + + TestProgressReporter translates ITestListener events into + the async callbacks that are used to inform the client + software about the progress of a test run. + + + + + Initializes a new instance of the class. + + The callback handler to be used for reporting progress. + + + + Called when a test has just started + + The test that is starting + + + + Called when a test has finished. Sends a result summary to the callback. + to + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + Returns the parent test item for the targer test item if it exists + + + parent test item + + + + Makes a string safe for use as an attribute, replacing + characters characters that can't be used with their + corresponding xml representations. + + The string to be used + A new string with the values replaced + + + + ParameterizedFixtureSuite serves as a container for the set of test + fixtures created from a given Type using various parameters. + + + + + Initializes a new instance of the class. + + The ITypeInfo for the type that represents the suite. + + + + Gets a string representing the type of test + + + + + + ParameterizedMethodSuite holds a collection of individual + TestMethods with their arguments applied. + + + + + Construct from a MethodInfo + + + + + + Gets a string representing the type of test + + + + + + SetUpFixture extends TestSuite and supports + Setup and TearDown methods. + + + + + Initializes a new instance of the class. + + The type. + + + + The Test abstract class represents a test within the framework. + + + + + Static value to seed ids. It's started at 1000 so any + uninitialized ids will stand out. + + + + + Used to cache the declaring type for this MethodInfo + + + + + Method property backing field + + + + + Constructs a test given its name + + The name of the test + + + + Constructs a test given the path through the + test hierarchy to its parent and a name. + + The parent tests full name + The name of the test + + + + TODO: Documentation needed for constructor + + + + + + Construct a test from a MethodInfo + + + + + + Gets or sets the id of the test + + + + + + Gets or sets the name of the test + + + + + Gets or sets the fully qualified name of the test + + + + + + Gets the name of the class where this test was declared. + Returns null if the test is not associated with a class. + + + + + Gets the name of the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + The arguments to use in creating the test or empty array if none required. + + + + + Gets the TypeInfo of the fixture used in running this test + or null if no fixture type is associated with it. + + + + + Gets a MethodInfo for the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Whether or not the test should be run + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Gets a string representing the type of test. Used as an attribute + value in the XML representation of a test and has no other + function in the framework. + + + + + Gets a count of test cases represented by + or contained under this test. + + + + + Gets the properties for this test + + + + + Returns true if this is a TestSuite + + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets the parent as a Test object. + Used by the core to set the parent. + + + + + Gets this test's child tests + + A list of child tests + + + + Gets or sets a fixture object for running this test. + + + + + Static prefix used for ids in this AppDomain. + Set by FrameworkController. + + + + + Gets or Sets the Int value representing the seed for the RandomGenerator + + + + + + The SetUp methods. + + + + + The teardown methods + + + + + Creates a TestResult for this test. + + A TestResult suitable for this type of test. + + + + Modify a newly constructed test by applying any of NUnit's common + attributes, based on a supplied ICustomAttributeProvider, which is + usually the reflection element from which the test was constructed, + but may not be in some instances. The attributes retrieved are + saved for use in subsequent operations. + + An object implementing ICustomAttributeProvider + + + + Mark the test as Invalid (not runnable) specifying a reason + + The reason the test is not runnable + + + + Get custom attributes applied to a test + + + + + Add standard attributes and members to a test node. + + + + + + + Returns the Xml representation of the test + + If true, include child tests recursively + + + + + Returns an XmlNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + + Compares this test to another test for sorting purposes + + The other test + Value of -1, 0 or +1 depending on whether the current test is less than, equal to or greater than the other test + + + + TestAssembly is a TestSuite that represents the execution + of tests in a managed assembly. + + + + + Initializes a new instance of the class + specifying the Assembly and the path from which it was loaded. + + The assembly this test represents. + The path used to load the assembly. + + + + Initializes a new instance of the class + for a path which could not be loaded. + + The path used to load the assembly. + + + + Copy-constructor style to create a filtered copy of the test assemblies + test cases + + + + + + + Gets the Assembly represented by this instance. + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Get custom attributes specified on the assembly + + + + + TestFixture is a surrogate for a user test fixture class, + containing one or more tests. + + + + + Initializes a new instance of the class. + + Type of the fixture. + Arguments used to instantiate the test fixture, or null if none used + + + + The TestMethod class represents a Test implemented as a method. + + + + + The ParameterSet used to create this test method + + + + + Initializes a new instance of the class. + + The method to be used as a test. + + + + Initializes a new instance of the class. + + The method to be used as a test. + The suite or fixture to which the new test will be added + + + + The arguments to use in executing the test method, or empty array if none are provided. + + + + + Overridden to return a TestCaseResult. + + A TestResult for this test. + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Returns a TNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + + Gets this test's child tests + + A list of child tests + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Returns the name of the method + + + + + TestSuite represents a composite test, which contains other tests. + + + + + Our collection of child tests + + + + + Initializes a new instance of the class. + + The name of the suite. + + + + Initializes a new instance of the class. + + Name of the parent suite. + The name of the suite. + + + + Initializes a new instance of the class. + + Type of the fixture. + Arguments used to instantiate the test fixture, or null if none used. + + + + Initializes a new instance of the class. + + Type of the fixture. + + + + Copy constructor style to create a filtered copy of the given test suite + + Test Suite to copy + Filter to be applied + + + + Sorts tests under this suite. + + + + + Adds a test to the suite. + + The test. + + + + Gets this test's child tests + + The list of child tests + + + + Gets a count of test cases represented by + or contained under this test. + + + + + + The arguments to use in creating the fixture, or empty array if none are provided. + + + + + Set to true to suppress sorting this suite's contents + + + + + OneTimeSetUp methods for this suite + + + + + OneTimeTearDown methods for this suite + + + + + Overridden to return a TestSuiteResult. + + A TestResult for this test. + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Returns an XmlNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + + Check that setup and teardown methods marked by certain attributes + meet NUnit's requirements and mark the tests not runnable otherwise. + + A list of methodinfos to check + + + + ThreadUtility provides a set of static methods convenient + for working with threads. + + + + + Pre-Task compatibility + + + + + Abort a thread, helping to dislodging it if it is blocked in native code + + The thread to abort + The native thread id (if known), otherwise 0. + If provided, allows the thread to be killed if it's in a message pump native blocking wait. + This must have previously been captured by calling from the running thread itself. + + + + Do our best to kill a thread + + The thread to kill + The native thread id (if known), otherwise 0. + If provided, allows the thread to be killed if it's in a message pump native blocking wait. + This must have previously been captured by calling from the running thread itself. + + + + Do our best to kill a thread, passing state info + + The thread to kill + Info for the ThreadAbortException handler + The native thread id (if known), otherwise 0. + If provided, allows the thread to be killed if it's in a message pump native blocking wait. + This must have previously been captured by calling from the running thread itself. + + + + Schedule a threadpool thread to check on the aborting thread in case it's in a message pump native blocking wait + + + + + Captures the current thread's native id. If provided to later, allows the thread to be killed if it's in a message pump native blocking wait. + + + + + Sends a message to the thread to dislodge it from native code and allow a return to managed code, where a ThreadAbortException can be generated. + The message is meaningless (WM_CLOSE without a window handle) but it will end any blocking message wait. + + + + + TypeHelper provides static methods that operate on Types. + + + + + A special value, which is used to indicate that BestCommonType() method + was unable to find a common type for the specified arguments. + + + + + Gets the display name for a Type as used by NUnit. + + The Type for which a display name is needed. + The display name for the Type + + + + Gets the display name for a Type as used by NUnit. + + The Type for which a display name is needed. + The arglist provided. + The display name for the Type + + + + Returns the best fit for a common type to be used in + matching actual arguments to a methods Type parameters. + + The first type. + The second type. + Either type1 or type2, depending on which is more general. + + + + Determines whether the specified type is numeric. + + The type to be examined. + + true if the specified type is numeric; otherwise, false. + + + + + Convert an argument list to the required parameter types. + Currently, only widening numeric conversions are performed. + + An array of args to be converted + A ParameterInfo[] whose types will be used as targets + + + + Determines whether this instance can deduce type args for a generic type from the supplied arguments. + + The type to be examined. + The arglist. + The type args to be used. + + true if this the provided args give sufficient information to determine the type args to be used; otherwise, false. + + + + + Return the interfaces implemented by a Type. + + The Type to be examined. + An array of Types for the interfaces. + + + + Represents the result of running a single test case. + + + + + Construct a TestCaseResult based on a TestMethod + + A TestMethod to which the result applies. + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + Represents the result of running a test suite + + + + + Construct a TestSuiteResult base on a TestSuite + + The TestSuite to which the result applies + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + Adds a child result to this result, setting this result's + ResultState to Failure if the child result failed. + + The result to be added + + + + The TestFixtureData class represents a set of arguments + and other parameter info to be used for a parameterized + fixture. It is derived from TestFixtureParameters and adds a + fluent syntax for use in initializing the fixture. + + + + + Initializes a new instance of the class. + + The arguments. + + + + Initializes a new instance of the class. + + The argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + The third argument. + + + + Sets the name of the test fixture + + The modified TestFixtureData instance + + + + Marks the test fixture as explicit. + + + + + Marks the test fixture as explicit, specifying the reason. + + + + + Ignores this TestFixture, specifying the reason. + + The reason. + + + + + Asserts on Directories + + + + + DO NOT USE! Use DirectoryAssert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both point to the same directory. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if the directories are not equal + Arguments to be used in formatting the message + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both point to the same directory. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + A directory containing the actual value + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + The path to a directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + The path to a directory containing the actual value + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + A directory containing the actual value + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + The path to a directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + The path to a directory containing the actual value + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a constraint that succeeds if the value + is a file or directory and it exists. + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + + + Returns a new . This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a new DictionaryContainsKeyConstraint checking for the + presence of a particular key in the Dictionary key collection. + + The key to be matched in the Dictionary key collection + + + + Returns a new DictionaryContainsValueConstraint checking for the + presence of a particular value in the Dictionary value collection. + + The value to be matched in the Dictionary value collection + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + - Return the top-level constraint for this expression + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. - - + - Static UnsetObject used to detect derived constraints - failing to set the actual value. + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. - + - The actual value being tested against a constraint + Abstract base for Exceptions that terminate a test and provide a ResultState. - + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + - The display name of this Constraint for use by ToString() + Serialization Constructor - + - Argument fields used by ToString(); + Gets the ResultState provided by this exception - + - The builder holding this constraint + When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. - + - Construct a constraint with no arguments + Executed before each test is run + The test that is going to be run. - + - Construct a constraint with one argument + Executed after each test is run + The test that has just been run. - + - Construct a constraint with two arguments + Provides the target for the action attribute + The target for the action attribute - + - Sets the ConstraintBuilder holding this constraint + Delegate used by tests that execute code and + capture any thrown exception. - + - 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. + AssertionHelper is an optional base class for user tests, + allowing the use of shorter names in making asserts. - The MessageWriter on which to display the message - + - Test whether the constraint is satisfied by a given value + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to + . - The value to be tested - True for success, false for failure + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message - + - 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. + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to . - An - True for success, false for failure + The evaluated condition - + - 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. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. - A reference to the value to be tested - True for success, false for failure + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Write the constraint description to a MessageWriter + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. - The writer on which the description is displayed + A TestDelegate to be executed + A ThrowsConstraint used in the test - + - 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. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. - The writer on which the actual value is displayed + A Constraint to be applied + The actual value to test - + - Default override of ToString returns the constraint DisplayName - followed by any arguments within angle brackets. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Returns a ListMapper based on a collection. + The original collection - + - Returns the string representation of this constraint + Returns a ConstraintExpression that negates any + following constraint. - + - This operator creates a constraint that is satisfied only if both - argument constraints are satisfied. + Returns a ConstraintExpression that negates any + following constraint. - + - This operator creates a constraint that is satisfied if either - of the argument constraints is satisfied. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. - + - This operator creates a constraint that is satisfied if the - argument constraint is not satisfied. + 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 DelayedConstraint with the specified delay time. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. - The delay in milliseconds. - - + - Returns a DelayedConstraint with the specified delay time - and polling interval. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. - 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 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 ConstraintExpression by appending And - to the current constraint. + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. - + - Returns a ConstraintExpression by appending And - to the current constraint. + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. - + - Returns a ConstraintExpression by appending Or - to the current constraint. + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. - + - Class used to detect any derived constraints - that fail to set the actual value in their - Matches override. + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. - + - The base constraint + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. - + - Construct given a base constraint + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. - - + - Construct an AllItemsConstraint on top of an existing constraint + Returns a constraint that tests for null - - + - Apply the item constraint to each item in the collection, - failing if any item fails. + Returns a constraint that tests for True - - - + - Write a description of this constraint to a MessageWriter + Returns a constraint that tests for False - - + - AndConstraint succeeds only if both members succeed. + Returns a constraint that tests for a positive value - + - BinaryConstraint is the abstract base of all constraints - that combine two other constraints in some fashion. + Returns a constraint that tests for a negative value - + - The first constraint being combined + Returns a constraint that tests for equality with zero - + - The second constraint being combined + Returns a constraint that tests for NaN - + - Construct a BinaryConstraint from two other constraints + Returns a constraint that tests for empty - The first constraint - The second constraint - + - Create an AndConstraint from two other constraints + Returns a constraint that tests whether a collection + contains all unique items. - The first constraint - The second constraint - + - Apply both member constraints to an actual value, succeeding - succeeding only if both of them succeed. + Returns a constraint that tests whether an object graph is serializable in binary format. - The actual value - True if the constraints both succeeded - + - Write a description for this contraint to a MessageWriter + Returns a constraint that tests whether an object graph is serializable in xml format. - 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. + Returns a constraint that tests two items for equality - The writer on which the actual value is displayed - + - AssignableFromConstraint is used to test that an object - can be assigned from a given Type. + Returns a constraint that tests that two references are the same object - + - TypeConstraint is the abstract base for constraints - that take a Type as their expected value. + Returns a constraint that tests whether the + actual value is greater than the supplied argument - + - The expected Type used by the constraint + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument - + - Construct a TypeConstraint for a given Type + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument - - + - Write the actual value for a failing constraint test to a - MessageWriter. TypeConstraints override this method to write - the name of the type. + Returns a constraint that tests whether the + actual value is less than the supplied argument - The writer on which the actual value is displayed - + - Construct an AssignableFromConstraint for the type provided + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument - - + - Test whether an object can be assigned from the specified type + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument - 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 + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. - The MessageWriter to use - + - AssignableToConstraint is used to test that an object - can be assigned to a given Type. + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. - + - Construct an AssignableToConstraint for the type provided + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. - - + - Test whether an object can be assigned to the specified type + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived 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 + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - The MessageWriter to use - + - 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. + 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. - + - Constructs an AttributeConstraint for a specified attriute - Type and base constraint. + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - - - + - Determines whether the Type or other provider has the - expected attribute and if its value matches the - additional constraint specified. + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. - + - Writes a description of the attribute to the specified writer. + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. - + - Writes the actual value supplied to the specified writer. + Returns a constraint that tests whether the actual value + is a superset of the collection supplied as an argument. - + - Returns a string representation of the constraint. + Returns a constraint that tests whether a collection is ordered - + - AttributeExistsConstraint tests for the presence of a - specified attribute on a Type. + Returns a new checking for the + presence of a particular object in the collection. - + - Constructs an AttributeExistsConstraint for a specific attribute Type + Returns a new checking for the + presence of a particular object in the collection. - - + - Tests whether the object provides the expected attribute. + 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. - 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 + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. - + - BasicConstraint is the abstract base for constraints that - perform a simple comparison to a constant value. + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. - + - Initializes a new instance of the class. + Returns a constraint that fails if the actual + value contains the substring supplied as an argument. - The expected. - The description. - + - Test whether the constraint is satisfied by a given value + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. - The writer on which the description is displayed - + - BinarySerializableConstraint tests whether - an object is serializable in binary format. + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. - + - Test whether the constraint is satisfied by a given value + Returns a constraint that fails if the actual + value starts with the substring supplied as an argument. - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. - 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. + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. - The writer on which the actual value is displayed - + - Returns the string representation + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. - + - CollectionConstraint is the abstract base class for - constraints that operate on collections. + Returns a constraint that fails if the actual + value ends with the substring supplied as an argument. - + - Construct an empty CollectionConstraint + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. - + - Construct a CollectionConstraint + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. - - + - Determines whether the specified enumerable is empty. + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. - The enumerable. - - true if the specified enumerable is empty; otherwise, false. - - + - Test whether the constraint is satisfied by a given value + Returns a constraint that fails if the actual + value matches the pattern supplied as an argument. - The value to be tested - True for success, false for failure - + - Protected method to be implemented by derived classes + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. - - - + - CollectionContainsConstraint is used to test whether a collection - contains an expected object as a member. + Returns a constraint that tests whether the path provided + is a subpath of the expected path after canonicalization. - + - CollectionItemsEqualConstraint is the abstract base class for all - collection constraints that apply some notion of item equality - as a part of their operation. + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. - + - Construct an empty CollectionConstraint + Returns a constraint that tests whether the actual value falls + within a specified range. - + - Construct a CollectionConstraint + 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. - - + - Flag the constraint to use the supplied EqualityAdapter. - NOTE: For internal use only. + DO NOT USE! + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. - The EqualityAdapter to use. - Self. + The left object. + The right object. + Not applicable - + - Flag the constraint to use the supplied IComparer object. + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. - The IComparer object to use. - Self. + The left object. + The right object. - + - Flag the constraint to use the supplied IComparer object. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. - The IComparer object to use. - Self. + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied - + - Flag the constraint to use the supplied Comparison object. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. - The IComparer object to use. - Self. + The Type being compared. + 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 - + - Flag the constraint to use the supplied IEqualityComparer object. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. - The IComparer object to use. - Self. + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception - + - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. + 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 - + - Compares two collection members for equality + Asserts that a condition is true. If the condition is false the + method throws an . + The evaluated condition - + - Return a new CollectionTally for use in making tests - - The collection to be included in the tally + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + A function to build the message included with the Exception - + - Flag the constraint to ignore case and return self. - + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + The message to display if the condition is false + Arguments to be used in formatting the message - + - Construct a CollectionContainsConstraint + Asserts that a condition is true. If the condition is false the method throws + an . - + A lambda that returns a Boolean - + - Test whether the expected item is contained in the collection + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + 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 - + - Write a descripton of the constraint to a MessageWriter + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. - + The Type being compared. + The actual value to test + A Constraint to be applied - + - CollectionEquivalentCOnstraint is used to determine whether two - collections are equivalent. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Construct a CollectionEquivalentConstraint + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. - + The Type being compared. + The actual value to test + A Constraint to be applied + A function to build the message included with the Exception - + - Test whether two collections are equivalent + Attribute used to apply a category to a test - - - + - Write a description of this constraint to a MessageWriter + The name of the category - - + - CollectionOrderedConstraint is used to test whether a collection is ordered. + 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 - + - Construct a CollectionOrderedConstraint + Protected constructor uses the Type name as the name + of the category. - + - Modifies the constraint to use an IComparer and returns self. + The name of the category - + - Modifies the constraint to use an IComparer<T> and returns self. + Modifies a test by adding a category to it. + The test to modify - + - Modifies the constraint to use a Comparison<T> and returns self. + Marks a test to use a combinatorial join of any argument + data provided. Since this is the default, the attribute is + optional. - + - Modifies the constraint to test ordering by the value of - a specified property and returns self. + Default constructor - + - Test whether the collection is ordered + CultureAttribute is used to mark a test fixture or an + individual method as applying to a particular Culture only. - - - + - Write a description of the constraint to a MessageWriter + Constructor with no cultures specified, for use + with named property syntax. - - + - Returns the string representation of the constraint. + Constructor taking one or more cultures - + Comma-deliminted list of cultures - + - If used performs a reverse comparison + Causes a test to be skipped if this CultureAttribute is not satisfied. + The test to modify - + - CollectionSubsetConstraint is used to determine whether - one collection is a subset of another + Tests to determine if the current culture is supported + based on the properties of this attribute. + True, if the current culture is supported - + - Construct a CollectionSubsetConstraint + Test to determine if the a particular culture or comma- + delimited set of cultures is in use. - The collection that the actual value is expected to be a subset of + Name of the culture or comma-separated list of culture ids + True if the culture is in use on the system - + - Test whether the actual collection is a subset of - the expected collection provided. + Test to determine if one of a collection of cultures + is being used currently. - + - + - Write a description of this constraint to a MessageWriter + The abstract base class for all data-providing attributes + defined by NUnit. Used to select all data sources for a + method, class or parameter. - - + - CollectionTally counts (tallies) the number of - occurences of each object in one or more enumerations. + Default constructor - + - Construct a CollectionTally object from a comparer and a collection + 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. - + - Try to remove an object from the tally + Used to mark a field, property or method providing a set of datapoints to + be used in executing any theories within the same fixture that require an + argument of the Type provided. The data source may provide an array of + the required Type or an . + Synonymous with DatapointSourceAttribute. - The object to remove - True if successful, false if the object was not found - + - Try to remove a set of objects from the tally + Used to mark a field, property or method providing a set of datapoints to + be used in executing any theories within the same fixture that require an + argument of the Type provided. The data source may provide an array of + the required Type or an . + Synonymous with DatapointsAttribute. - The objects to remove - True if successful, false if any object was not found - + - The number of objects remaining in the tally + Attribute used to provide descriptive text about a + test case or fixture. - + - ComparisonAdapter class centralizes all comparisons of - values in NUnit, adapting to the use of any provided - IComparer, IComparer<T> or Comparison<T> + Construct a description Attribute + The text of the description - + - Returns a ComparisonAdapter that wraps an IComparer + 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. - + - Returns a ComparisonAdapter that wraps an IComparer<T> + Default constructor - + - Returns a ComparisonAdapter that wraps a Comparison<T> + Constructor with a reason + The reason test is marked explicit - + - Compares two objects + Modifies a test by marking it as explicit. + The test to modify - + - Gets the default ComparisonAdapter, which wraps an - NUnitComparer object. + Attribute used to mark a test that is to be ignored. + Ignored tests result in a warning message when the + tests are run. - + - Construct a ComparisonAdapter for an IComparer + Constructs the attribute giving a reason for ignoring the test + The reason for ignoring the test - + - Compares two objects + The date in the future to stop ignoring the test as a string in UTC time. + For example for a date and time, "2014-12-25 08:10:00Z" or for just a date, + "2014-12-25". If just a date is given, the Ignore will expire at midnight UTC. - - - + + Once the ignore until date has passed, the test will be marked + as runnable. Tests with an ignore until date will have an IgnoreUntilDate + property set which will appear in the test results. + + The string does not contain a valid string representation of a date and time. - + - Construct a default ComparisonAdapter + Modifies a test by marking it as Ignored. + The test to modify - + - ComparisonAdapter<T> extends ComparisonAdapter and - allows use of an IComparer<T> or Comparison<T> - to actually perform the comparison. + Abstract base for Attributes that are used to include tests + in the test run based on environmental settings. - + - Construct a ComparisonAdapter for an IComparer<T> + Constructor with no included items specified, for use + with named property syntax. - + - Compare a Type T to an object + Constructor taking one or more included items + Comma-delimited list of included items - + - Construct a ComparisonAdapter for a Comparison<T> + Name of the item that is needed in order for + a test to run. Multiple items may be given, + separated by a comma. - + - Compare a Type T to an object + Name of the item to be excluded. Multiple items + may be given, separated by a comma. - + - 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. + The reason for including or excluding the test - + - ComparisonAdapter to be used in making the comparison + Specifies the maximum time (in milliseconds) for a test case to succeed. - + - Initializes a new instance of the class. + Construct a MaxTimeAttribute, given a time in milliseconds. + The maximum elapsed time in milliseconds - + - Initializes a new instance of the class. + The abstract base class for all custom attributes defined by NUnit. - + - Modifies the constraint to use an IComparer and returns self + Default constructor - + - Modifies the constraint to use an IComparer<T> and returns self + Marks a test to use a pairwise join of any argument + data provided. Arguments will be combined in such a + way that all possible pairs of arguments are used. - + - Modifies the constraint to use a Comparison<T> and returns self + Default constructor - + - Delegate used to delay evaluation of the actual value - to be used in evaluating a constraint + PlatformAttribute is used to mark a test fixture or an + individual method as applying to a particular platform only. - + - 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. + Constructor with no platforms specified, for use + with named property syntax. - + - Initializes a new instance of the class. + Constructor taking one or more platforms + Comma-delimited list of platforms - + - Appends the specified operator to the expression by first - reducing the operator stack and then pushing the new - operator on the stack. + Causes a test to be skipped if this PlatformAttribute is not satisfied. - The operator to push. + The test to modify - + - Appends the specified constraint to the expresson by pushing - it on the constraint stack. + PropertyAttribute is used to attach information to a test as a name/value pair.. - The constraint to push. - + - Sets the top operator right context. + Construct a PropertyAttribute with a name and string value - The right context. + The name of the property + The property value - + - Reduces the operator stack until the topmost item - precedence is greater than or equal to the target precedence. + Construct a PropertyAttribute with a name and int value - The target precedence. + The name of the property + The property value - + - Resolves this instance, returning a Constraint. If the builder - is not currently in a resolvable state, an exception is thrown. + Construct a PropertyAttribute with a name and double value - The resolved constraint + The name of the property + The property value - + - Gets a value indicating whether this instance is resolvable. + Constructor for derived classes that set the + property dictionary directly. - - true if this instance is resolvable; otherwise, false. - - + - OperatorStack is a type-safe stack for holding ConstraintOperators + 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. - + - Initializes a new instance of the class. + Gets the property dictionary for this attribute - The builder. - + - Pushes the specified operator onto the stack. + Modifies a test by adding properties to it. - The op. + The test to modify - + - Pops the topmost operator from the stack. + RandomAttribute is used to supply a set of random values + to a single parameter of a parameterized test. - - + - Gets a value indicating whether this is empty. + If true, no value will be repeated. - true if empty; otherwise, false. - + - Gets the topmost operator without modifying the stack. + Construct a random set of values appropriate for the Type of the + parameter on which the attribute appears, specifying only the count. - The top. + - + - ConstraintStack is a type-safe stack for holding Constraints + Construct a set of ints within a specified range - + - Initializes a new instance of the class. + Construct a set of unsigned ints within a specified range - The builder. - + - Pushes the specified constraint. As a side effect, - the constraint's builder field is set to the - ConstraintBuilder owning this stack. + Construct a set of longs within a specified range - The constraint. - + - Pops this topmost constrait from the stack. - As a side effect, the constraint's builder - field is set to null. + Construct a set of unsigned longs within a specified range - - + - Gets a value indicating whether this is empty. + Construct a set of shorts within a specified range - true if empty; otherwise, false. - + - Gets the topmost constraint without modifying the stack. + Construct a set of unsigned shorts within a specified range - 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. + Construct a set of doubles within a specified range - + - 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. + Construct a set of floats within a specified range - + - The ConstraintBuilder holding the elements recognized so far + Construct a set of bytes within a specified range - + - Initializes a new instance of the class. + Construct a set of sbytes within a specified range - + - Initializes a new instance of the - class passing in a ConstraintBuilder, which may be pre-populated. + Get the collection of values to be used as arguments. - 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. + RangeAttribute is used to supply a range of values to an + individual parameter of a parameterized test. - - + - Appends an operator to the expression and returns the - resulting expression itself. + Construct a range of ints using default step of 1 + + - + - Appends a self-resolving operator to the expression and - returns a new ResolvableConstraintExpression. + Construct a range of ints specifying the step size + + + - + - Appends a constraint to the expression and returns that - constraint, which is associated with the current state - of the expression being built. + Construct a range of unsigned ints using default step of 1 + + - + - Initializes a new instance of the class. + Construct a range of unsigned ints specifying the step size + + + - + - Initializes a new instance of the - class passing in a ConstraintBuilder, which may be pre-populated. + Construct a range of longs using a default step of 1 - 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. + Construct a range of longs + + + - + - 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. + Construct a range of unsigned longs using default step of 1 + + - + - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. + Construct a range of unsigned longs specifying the step size + + + - + - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. + Construct a range of doubles + + + - + - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. + Construct a range of floats + + + - + - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. + Get the range of values to be used as arguments - + - Returns a constraint that tests two items for equality + RepeatAttribute may be applied to test case in order + to run it multiple times. - + - Returns a constraint that tests that two references are the same object + Construct a RepeatAttribute + The number of times to run the test - + - Returns a constraint that tests whether the - actual value is greater than the suppled argument + Wrap a command and return the result. + The command to be wrapped + The wrapped command - + - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument + The test command for the RepeatAttribute - + - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument + Initializes a new instance of the class. + The inner command. + The number of repetitions - + - Returns a constraint that tests whether the - actual value is less than the suppled argument + Runs the test, saving a TestResult in the supplied TestExecutionContext. + The context in which the test should run. + A TestResult - + - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument + Marks a test that must run on a separate thread. - + - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument + Construct a RequiresThreadAttribute - + - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. + Construct a RequiresThreadAttribute, specifying the apartment - + - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. + Marks a test to use a Sequential join of any argument + data provided. Arguments will be combined into test cases, + taking the next value of each argument until all are used. - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Default constructor - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Sets the current Culture for the duration of a test. + + It may be specified at the level of a test or a fixture. + The culture remains set until the test or fixture completes and is then reset to its original value. + + - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Construct given the name of a culture + - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Sets the current UI Culture for the duration of a test. + + It may be specified at the level of a test or a fixture. + The UI culture remains set until the test or fixture completes and is then reset to its original value. + + - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Construct given the name of a culture + - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Attribute used to identify a method that is called + immediately before each test is run. - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Attribute used to identify a class that contains + or + methods for all the test fixtures under a given namespace. - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Build a SetUpFixture from type provided. Normally called for a Type + on which the attribute has been placed. + The type info of the fixture to be used. + A SetUpFixture object as a TestSuite. - + - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. + Attribute used to identify a method that is called + immediately after each test is run. The method is + guaranteed to be called, even if an exception is thrown. - + - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + public void TestDescriptionMethod() + {} + } + + - + - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. + Descriptive text for this test - + - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. + The author of this test - + - 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. + The type that this test is testing - + - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. + Modifies a test by adding a description, if not already set. + The test to modify - + - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. + Gets or sets the expected result. + The result. - + - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. + Returns true if an expected result has been set - + - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. + Construct a TestMethod from a given method. + The method for which a test is to be constructed. + The suite to which the test will be added. + A TestMethod - + - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. + TestCaseAttribute is used to mark parameterized test cases + and provide them with their arguments. - + - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. + Construct a TestCaseAttribute with a list of arguments. + This constructor is not CLS-Compliant + - + - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. + Construct a TestCaseAttribute with a single argument + - + - Returns a constraint that succeeds if the actual - value matches the regular expression supplied as an argument. + Construct a TestCaseAttribute with a two arguments + + - + - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. + Construct a TestCaseAttribute with a three arguments + + + - + - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. + Gets or sets the name of the test. + The name of the test. - + - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. + Gets or sets the RunState of this test case. - + - Returns a constraint that tests whether the actual value falls - within a specified range. + Gets the list of arguments to a test case - + - Returns a ConstraintExpression that negates any - following constraint. + Gets the properties of the test case - + - Returns a ConstraintExpression that negates any - following constraint. + Gets or sets the expected result. + The result. - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. + Returns true if the expected result has been set - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. + Gets or sets the description. + The description. - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. + The author of this test - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. + The type that this test is testing - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. + Gets or sets the reason for ignoring the test - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. + Gets or sets a value indicating whether this is explicit. + + true if explicit; otherwise, false. + - + - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. + Gets or sets the reason for not running the test. + The reason. - + - With is currently a NOP - reserved for future use. + Gets or sets the ignore reason. When set to a non-null + non-empty value, the test is marked as ignored. + The ignore reason. - + - Returns a constraint that tests for null + Comma-delimited list of platforms to run the test for - + - Returns a constraint that tests for True + Comma-delimited list of platforms to not run the test for - + - Returns a constraint that tests for False + Gets and sets the category for this test case. + May be a comma-separated list of categories. - + - Returns a constraint that tests for a positive value + Performs several special conversions allowed by NUnit in order to + permit arguments with types that cannot be used in the constructor + of an Attribute such as TestCaseAttribute or to simplify their use. + The arguments to be converted + The ParameterInfo array for the method - + - Returns a constraint that tests for a negative value + Construct one or more TestMethods from a given MethodInfo, + using available parameter data. + The MethodInfo for which tests are to be constructed. + The suite to which the tests will be added. + One or more TestMethods - + - Returns a constraint that tests for NaN + TestCaseSourceAttribute indicates the source to be used to + provide test cases for a test method. - + - Returns a constraint that tests for empty + Construct with the name of the method, property or field that will provide data + The name of a static method, property or field that will provide data. - + - Returns a constraint that tests whether a collection - contains all unique items. + Construct with a Type and name + The Type that will provide data + The name of a static method, property or field that will provide data. + A set of parameters passed to the method, works only if the Source Name is a method. + If the source name is a field or property has no effect. - + - Returns a constraint that tests whether an object graph is serializable in binary format. + Construct with a Type and name + The Type that will provide data + The name of a static method, property or field that will provide data. - + - Returns a constraint that tests whether an object graph is serializable in xml format. + Construct with a name + The name of a static method, property or field that will provide data. + A set of parameters passed to the method, works only if the Source Name is a method. + If the source name is a field or property has no effect. - + - Returns a constraint that tests whether a collection is ordered + Construct with a Type + The type that will provide data - + - 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. + A set of parameters passed to the method, works only if the Source Name is a method. + If the source name is a field or property has no effect. - + - Initializes a new instance of the class. + The name of a the method, property or fiend to be used as a source - The expected. - + - Test whether the constraint is satisfied by a given value + A Type to be used as a source - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Gets or sets the category associated with every fixture created from + this attribute. May be a single category or a comma-separated list. - The writer on which the description is displayed - + - Flag the constraint to use the supplied IComparer object. + Construct one or more TestMethods from a given MethodInfo, + using available parameter data. - The IComparer object to use. - Self. + The IMethod for which tests are to be constructed. + The suite to which the tests will be added. + One or more TestMethods - + - Flag the constraint to use the supplied IComparer object. + Returns a set of ITestCaseDataItems for use as arguments + to a parameterized test method. - The IComparer object to use. - Self. + The method for which data is needed. + - + - Flag the constraint to use the supplied Comparison object. + TestFixtureAttribute is used to mark a class that represents a TestFixture. - The IComparer object to use. - Self. - + - Flag the constraint to use the supplied IEqualityComparer object. + Default constructor - The IComparer object to use. - Self. - + - Flag the constraint to use the supplied IEqualityComparer object. + 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. - The IComparer object to use. - Self. + - + - Flag the constraint to ignore case and return self. + Gets or sets the name of the test. + The name of the test. - + - Applies a delay to the match so that a match can be evaluated in the future. + Gets or sets the RunState of this test fixture. - + - Creates a new DelayedConstraint + The arguments originally provided to the attribute - 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 + Properties pertaining to this fixture - 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 + Get or set the type arguments. If not set + explicitly, any leading arguments that are + Types are taken as type arguments. - 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 + Descriptive text for this fixture - 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. + The author of this fixture - A reference to the value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + The type that this fixture is testing - The writer on which the description is displayed - + - Write the actual value for a failing constraint test to a MessageWriter. + Gets or sets the ignore reason. May set RunState as a side effect. - The writer on which the actual value is displayed + The ignore reason. - + - Returns the string representation of the constraint. + Gets or sets the reason for not running the fixture. + The reason. - + - EmptyCollectionConstraint tests whether a collection is empty. + Gets or sets the ignore reason. When set to a non-null + non-empty value, the test is marked as ignored. + The ignore reason. - + - Check that the collection is empty + Gets or sets a value indicating whether this is explicit. - - + + true if explicit; otherwise, false. + - + - Write the constraint description to a MessageWriter + Gets and sets the category for this fixture. + May be a comma-separated list of categories. - - + - 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. + Build a fixture from type provided. Normally called for a Type + on which the attribute has been placed. + The type info of the fixture to be used. + A an IEnumerable holding one TestFixture object. - + - Test whether the constraint is satisfied by a given value + 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. - The value to be tested - True for success, false for failure + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + public void TestDescriptionMethod() + {} + } + + - + - Write the constraint description to a MessageWriter + Construct the attribute, specifying a combining strategy and source of parameter data. - The writer on which the description is displayed - + - EmptyDirectoryConstraint is used to test that a directory is empty + Used on a method, marks the test with a timeout value in milliseconds. + The test will be run in a separate thread and is cancelled if the timeout + is exceeded. Used on a class or assembly, sets the default timeout + for all contained test methods. - + - Test whether the constraint is satisfied by a given value + Construct a TimeoutAttribute given a time in milliseconds - The value to be tested - True for success, false for failure + The timeout value in milliseconds - + - Write the constraint description to a MessageWriter + ValuesAttribute is used to provide literal arguments for + an individual parameter of a test. - 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 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 - The writer on which the actual value is displayed - + - EmptyStringConstraint tests whether a string is empty. + Constructs for use with an Enum parameter. Will pass every enum + value in to the test. - + - Test whether the constraint is satisfied by a given value + Construct with one argument - The value to be tested - True for success, false for failure + - + - Write the constraint description to a MessageWriter + Construct with two arguments - The writer on which the description is displayed + + - + - EndsWithConstraint can test whether a string ends - with an expected substring. + Construct with three arguments + + + - + - StringConstraint is the abstract base for constraints - that operate on strings. It supports the IgnoreCase - modifier for string operations. + Construct with an array of arguments + - + - The expected value + Get the collection of values to be used as arguments - + - Indicates whether tests should be case-insensitive + ValueSourceAttribute indicates the source to be used to + provide data for one parameter of a test method. - + - Constructs a StringConstraint given an expected value + Construct with the name of the factory - for use with languages + that don't support params arrays. - The expected value + The name of a static method, property or field that will provide data. - + - Test whether the constraint is satisfied by a given value + Construct with a Type and name - for use with languages + that don't support params arrays. - The value to be tested - True for success, false for failure + The Type that will provide data + The name of a static method, property or field that will provide data. - + - Test whether the constraint is satisfied by a given string + The name of a the method, property or fiend to be used as a source - The string to be tested - True for success, false for failure - + - Modify the constraint to ignore case in matching. + A Type to be used as a source - + - Initializes a new instance of the class. + Gets an enumeration of data items for use as arguments + for a test method parameter. - The expected string + The parameter for which data is needed + + An enumeration containing individual data items + - + - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. + A set of Assert methods operating on one or more collections - - - + - Write the constraint description to a MessageWriter + DO NOT USE! Use CollectionAssert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. - 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. + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + - + - If true, strings in error messages will be clipped + 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 - + - NUnitEqualityComparer used to test equality. + 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 - + - Initializes a new instance of the class. + Asserts that all items contained in collection are not equal to null. - The expected value. + IEnumerable containing objects to be considered - + - Flag the constraint to use a tolerance when determining equality. + Asserts that all items contained in collection are not equal to null. - Tolerance value to be used - Self. + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Flag the constraint to use the supplied IComparer object. + Ensures that every object contained in collection exists within the collection + once and only once. - The IComparer object to use. - Self. + IEnumerable of objects to be considered - + - Flag the constraint to use the supplied IComparer object. + Ensures that every object contained in collection exists within the collection + once and only once. - The IComparer object to use. - Self. + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Flag the constraint to use the supplied IComparer object. + 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 IComparer object to use. - Self. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered - + - Flag the constraint to use the supplied Comparison object. + 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 IComparer object to use. - Self. + 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 - + - Flag the constraint to use the supplied IEqualityComparer object. + 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 IComparer object to use. - Self. + 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 - + - Flag the constraint to use the supplied IEqualityComparer object. + 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 IComparer object to use. - Self. + 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 - + - Test whether the constraint is satisfied by a given value + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - The value to be tested - True for success, false for failure + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered - + - Write a failure message. Overridden to provide custom - failure messages for EqualConstraint. + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - The MessageWriter to write to + 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 - + - Write description of this constraint + Asserts that expected and actual are not exactly equal. - The MessageWriter to write to + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered - + - Display the failure information for two collections that did not match. + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. - The MessageWriter on which to display - The expected collection. - The actual collection - The depth of this failure in a set of nested collections + 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 - + - 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. + Asserts that expected and actual are not exactly equal. - The MessageWriter on which to display - The expected collection or array - The actual collection or array - The indentation level for the message line + 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 - + - 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. + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. - 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 + 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 - + - Display the failure information for two IEnumerables that did not match. + Asserts that expected and actual are not equivalent. - The MessageWriter on which to display - The expected enumeration. - The actual enumeration - The depth of this failure in a set of nested collections + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered - + - Flag the constraint to ignore case and return self. + 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 - + - Flag the constraint to suppress string clipping - and return self. + Asserts that collection contains actual as an item. + IEnumerable of objects to be considered + Object to be found within collection - + - Flag the constraint to compare arrays as collections - and return self. + 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 - + - Switches the .Within() modifier to interpret its tolerance as - a distance in representable values (see remarks). + Asserts that collection does not contain actual as an item. - 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. - + IEnumerable of objects to be considered + Object that cannot exist within collection - + - Switches the .Within() modifier to interpret its tolerance as - a percentage that the actual values is allowed to deviate from - the expected value. + Asserts that collection does not contain actual as an item. - Self + 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 - + - Causes the tolerance to be interpreted as a TimeSpan in days. + Asserts that the superset does not contain the subset - Self + The IEnumerable subset to be considered + The IEnumerable superset to be considered - + - Causes the tolerance to be interpreted as a TimeSpan in hours. + Asserts that the superset does not contain the subset - Self + The IEnumerable subset to be considered + The IEnumerable superset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Causes the tolerance to be interpreted as a TimeSpan in minutes. + Asserts that the superset contains the subset. - Self + The IEnumerable subset to be considered + The IEnumerable superset to be considered - + - Causes the tolerance to be interpreted as a TimeSpan in seconds. + Asserts that the superset contains the subset. - Self + The IEnumerable subset to be considered + The IEnumerable superset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Causes the tolerance to be interpreted as a TimeSpan in milliseconds. + Asserts that the subset does not contain the superset - Self + The IEnumerable superset to be considered + The IEnumerable subset to be considered - + - Causes the tolerance to be interpreted as a TimeSpan in clock ticks. + Asserts that the subset does not contain the superset - Self + 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 - + - EqualityAdapter class handles all equality comparisons - that use an IEqualityComparer, IEqualityComparer<T> - or a ComparisonAdapter. + Asserts that the subset contains the superset. + The IEnumerable superset to be considered + The IEnumerable subset to be considered - + - Compares two objects, returning true if they are equal + Asserts that the subset contains the superset. + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns true if the two objects can be compared by this adapter. - The base adapter cannot handle IEnumerables except for strings. + 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 - + - Returns an EqualityAdapter that wraps an IComparer. + Assert that an array,list or other collection is empty + An array, list or other collection implementing IEnumerable - + - Returns an EqualityAdapter that wraps an IEqualityComparer. + 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 - + - Returns an EqualityAdapter that wraps an IEqualityComparer<T>. + Assert that an array,list or other collection is empty + An array, list or other collection implementing IEnumerable - + - Returns an EqualityAdapter that wraps an IComparer<T>. + 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 - + - Returns an EqualityAdapter that wraps a Comparison<T>. + Assert that an array, list or other collection is ordered + An array, list or other collection implementing IEnumerable - + - EqualityAdapter that wraps an IComparer. + 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 - + - Returns true if the two objects can be compared by this adapter. - Generic adapter requires objects of the specified type. + 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 - + - EqualityAdapter that wraps an IComparer. + Helper class with properties and methods that supply + a number of constraints used in Asserts. - + - EqualityAdapterList represents a list of EqualityAdapters - in a common class across platforms. + Returns a new checking for the + presence of a particular object in the collection. - + - ExactCountConstraint applies another constraint to each - item in a collection, succeeding only if a specified - number of items succeed. + Returns a new DictionaryContainsKeyConstraint checking for the + presence of a particular key in the dictionary. - + - Construct an ExactCountConstraint on top of an existing constraint + Returns a new DictionaryContainsValueConstraint checking for the + presence of a particular value in the dictionary. - - - + - Apply the item constraint to each item in the collection, - succeeding only if the expected number of items pass. + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. - - - + - Write a description of this constraint to a MessageWriter + 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 + + - ExactTypeConstraint is used to test that an object - is of the exact type provided in the constructor + Serialization Constructor - + - Construct an ExactTypeConstraint for a given Type + Gets the ResultState provided by this exception - The expected Type. - + - Test that an object is of the exact type specified + Thrown when an assertion failed. - The actual value. - True if the tested object is of the exact type provided, otherwise false. - + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + - Write the description of this constraint to a MessageWriter + Serialization Constructor - The MessageWriter to use - + - ExceptionTypeConstraint is a special version of ExactTypeConstraint - used to provided detailed info about the exception thrown in - an error message. + Gets the ResultState provided by this exception - + - Constructs an ExceptionTypeConstraint + 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 + + - Write the actual value for a failing constraint test to a - MessageWriter. Overriden to write additional information - in the case of an Exception. + Serialization Constructor - The MessageWriter to use - + - FailurePoint class represents one point of failure - in an equality test. + Gets the ResultState provided by this exception - + - The location of the failure + Thrown when an assertion failed. - + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + - The expected value + Serialization Constructor - + - The actual value + Gets the ResultState provided by this exception - + - Indicates whether the expected value is valid + Asserts on Files - + - Indicates whether the actual value is valid + DO NOT USE! Use FileAssert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + - + - FailurePointList represents a set of FailurePoints - in a cross-platform way. + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + - + - FalseConstraint tests that the actual value is false + 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 - + - Initializes a new instance of the class. + 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 - - 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 + 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. - - Floating point value whose memory contents to reinterpret - - - The memory contents of the floating point value interpreted as an integer - + 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 - + - Reinterprets the memory contents of a double precision floating point - value as an integer 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. - - Double precision floating point value whose memory contents to reinterpret - - - The memory contents of the double precision floating point value - interpreted as an integer - + A file containing the value that is expected + A file containing the actual value - + - Reinterprets the memory contents of an integer as a floating point 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. - Integer value whose memory contents to reinterpret - - The memory contents of the integer value interpreted as a floating point value - + 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 - + - Reinterprets the memory contents of an integer value as a double precision - floating point 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. - 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 + The path to a file containing the value that is expected + The path to a file containing the actual value - + - Tests whether a value is greater than the value supplied to its constructor + 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 - + - The value against which a comparison is to be made + Asserts that two Streams are not equal. If they are equal + an is thrown. + The expected Stream + The actual Stream - + - Initializes a new instance of the class. + Asserts that two files are not equal. If they are equal + an is thrown. - The expected value. + 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 - + - Write the constraint description to a MessageWriter + Asserts that two files are not equal. If they are equal + an is thrown. - The writer on which the description is displayed + A file containing the value that is expected + A file containing the actual value - + - Test whether the constraint is satisfied by a given value + Asserts that two files are not equal. If they are equal + an is thrown. - The value to be tested - True for success, false for failure + 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 - + - Tests whether a value is greater than or equal to the value supplied to its constructor + 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 value against which a comparison is to be made + Asserts that the file exists. If it does not exist + an is thrown. + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message - + - Initializes a new instance of the class. + Asserts that the file exists. If it does not exist + an is thrown. - The expected value. + A file containing the actual value - + - Write the constraint description to a MessageWriter + Asserts that the file exists. If it does not exist + an is thrown. - The writer on which the description is displayed + 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 - + - Test whether the constraint is satisfied by a given value + Asserts that the file exists. If it does not exist + an is thrown. - The value to be tested - True for success, false for failure + The path to a file containing the actual value - + - InstanceOfTypeConstraint is used to test that an object - is of the same type provided or derived from it. + Asserts that the file does not exist. If it does exist + an is thrown. + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message - + - Construct an InstanceOfTypeConstraint for the type provided + Asserts that the file does not exist. If it does exist + an is thrown. - The expected Type + A file containing the actual value - + - Test whether an object is of the specified type or a derived type + Asserts that the file does not exist. If it does exist + an is thrown. - The object to be tested - True if the object is of the provided type or derives from it, otherwise false. + 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 - + - Write a description of this constraint to a MessageWriter + Asserts that the file does not exist. If it does exist + an is thrown. - The MessageWriter to use + The path to a file containing the actual value - + - Tests whether a value is less than the value supplied to its constructor + Helper class with properties and methods that supply + a number of constraints used in Asserts. - + - The value against which a comparison is to be made + Returns a ConstraintExpression that negates any + following constraint. - + - Initializes a new instance of the class. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. - The expected value. - + - Write the constraint description to a MessageWriter + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. - The writer on which the description is displayed - + - Test whether the constraint is satisfied by a given value + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. - 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 + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. - + - The value against which a comparison is to be made + Returns a which will apply + the following constraint to only one member of the collection, + and fail if none or more than one match occurs. - + - Initializes a new instance of the class. + 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. - The expected value. - + - Write the constraint description to a MessageWriter + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. - The writer on which the description is displayed - + - Test whether the constraint is satisfied by a given value + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. - The value to be tested - True for success, false for failure - + - Static methods used in creating messages + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. - + - Static string used when strings are clipped + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. - + - 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. + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. - - - + - Converts any control characters in a string - to their escaped representation. + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. - The string to be converted - The converted string - + - Return the a string representation for a set of indices into an array + Returns a new checking for the + presence of a particular object in the collection. - 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. + Helper class with properties and methods that supply + a number of constraints used in Asserts. - 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 + Returns a ConstraintExpression that negates any + following constraint. - 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. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. - - - - - + - Shows the position two strings start to differ. Comparison - starts at the start index. + Returns a constraint that tests for null - The expected string - The actual string - The index in the strings at which comparison should start - Boolean indicating whether case should be ignored - -1 if no mismatch found, or the index where mismatch found - + - NaNConstraint tests that the actual value is a double or float NaN + Returns a constraint that tests for True - + - Test that the actual value is an NaN + Returns a constraint that tests for False - - - + - Write the constraint description to a specified writer + Returns a constraint that tests for a positive value - - + - NoItemConstraint applies another constraint to each - item in a collection, failing if any of them succeeds. + Returns a constraint that tests for a negative value - + - Construct a NoItemConstraint on top of an existing constraint + Returns a constraint that tests for equality with zero - - + - Apply the item constraint to each item in the collection, - failing if any item fails. + Returns a constraint that tests for NaN - - - + - Write a description of this constraint to a MessageWriter + Returns a constraint that tests for empty - - + - NotConstraint negates the effect of some other constraint + Returns a constraint that tests whether a collection + contains all unique items. - + - Initializes a new instance of the class. + Returns a constraint that tests whether an object graph is serializable in binary format. - The base constraint to be negated. - + - Test whether the constraint is satisfied by a given value + Returns a constraint that tests whether an object graph is serializable in xml format. - The value to be tested - True for if the base constraint fails, false if it succeeds - + - Write the constraint description to a MessageWriter + Returns a constraint that tests two items for equality - The writer on which the description is displayed - + - Write the actual value for a failing constraint test to a MessageWriter. + Returns a constraint that tests that two references are the same object - The writer on which the actual value is displayed - + - NullConstraint tests that the actual value is null + Returns a constraint that tests whether the + actual value is greater than the supplied argument - + - Initializes a new instance of the class. + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument - + - NullEmptyStringConstraint tests whether a string is either null or empty. + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument - + - Constructs a new NullOrEmptyStringConstraint + Returns a constraint that tests whether the + actual value is less than the supplied argument - + - Test whether the constraint is satisfied by a given value + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument - The writer on which the description is displayed - + - The Numerics class contains common operations on numeric values. + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. - + - Checks the type of the object, returning true if - the object is a numeric type. + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. - 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. + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived 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. + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived 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. + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - 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. + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - The expected value - The actual value - The relationship of the values to each other - + - NUnitComparer encapsulates NUnit's default behavior - in comparing two objects. + Returns a constraint that tests whether the actual value + is assignable to the type supplied as an argument. - + - Compares two objects + Returns a constraint that tests whether the actual value + is assignable to the type supplied as an argument. - - - - + - Returns the default NUnitComparer. + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. - + - Generic version of NUnitComparer + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. - - + - Compare two objects of the same type + Returns a constraint that tests whether the actual value + is a superset of the collection supplied as an argument. - + - NUnitEqualityComparer encapsulates NUnit's handling of - equality tests between objects. + Returns a constraint that tests whether a collection is ordered - + - + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. - + - Compares two objects for equality within a tolerance + Returns a constraint that tests whether the path provided + is a subpath of the expected path after canonicalization. - 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 + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. - + - If true, arrays will be treated as collections, allowing - those of different dimensions to be compared + Returns a constraint that tests whether the actual value falls + inclusively within a specified range. + Inclusive beginning of the range. + Inclusive end of the range. + - + - Comparison objects used in comparisons for some constraints. + The Iz class is a synonym for Is intended for use in VB, + which regards Is as a keyword. - + - List of points at which a failure occured. + The List class is a helper class with properties and methods + that supply a number of constraints used with lists and collections. - + - RecursionDetector used to check for recursion when - evaluating self-referencing enumerables. + List.Map returns a ListMapper, which can be used to map + the original collection to another collection. + + - + - Compares two objects for equality within a tolerance, setting - the tolerance to the actual tolerance used if an empty - tolerance is supplied. + ListMapper is used to transform a collection used as an actual argument + producing another collection to be used in the assertion. - + - Helper method to compare two arrays + Construct a ListMapper based on a collection + The collection to be transformed - + - Method to compare two DirectoryInfo objects + Produces a collection containing all the values of a property - first directory to compare - second directory to compare - true if equivalent, false if not + The collection of property values + - + - Returns the default NUnitEqualityComparer + Basic Asserts on strings. - + - Gets and sets a flag indicating whether case should - be ignored in determining equality. + DO NOT USE! Use StringAssert.AreEqualIgnoringCase(...) or Assert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + - + - Gets and sets a flag indicating that arrays should be - compared as collections, without regard to their shape. + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + - + - Gets the list of external comparers to be used to - test for equality. They are applied to members of - collections, in place of NUnit's own logic. + 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 - + - Gets the list of failure points for the last Match performed. - The list consists of objects to be interpreted by the caller. - This generally means that the caller may only make use of - objects it has placed on the list at a particular depthy. + Asserts that a string is found within another string. + The expected string + The string to be examined - + - RecursionDetector detects when a comparison - between two enumerables has reached a point - where the same objects that were previously - compared are again being compared. This allows - the caller to stop the comparison if desired. + 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 - + - Check whether two objects have previously - been compared, returning true if they have. - The two objects are remembered, so that a - second call will always return true. + Asserts that a string is found within another string. + The expected string + The string to be examined - + - OrConstraint succeeds if either member succeeds + 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 - + - Create an OrConstraint from two other constraints + Asserts that a string starts with another string. - The first constraint - The second constraint + The expected string + The string to be examined - + - Apply the member constraints to an actual value, succeeding - succeeding as soon as one of them succeeds. + Asserts that a string does not start with another string. - The actual value - True if either constraint succeeded + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message - + - Write a description for this contraint to a MessageWriter + Asserts that a string does not start with another string. - The MessageWriter to receive the description + The expected string + The string to be examined - + - PathConstraint serves as the abstract base of constraints - that operate on paths and provides several helper methods. + 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 - + - The expected path used in the constraint + Asserts that a string ends with another string. + The expected string + The string to be examined - + - Flag indicating whether a caseInsensitive comparison should be made + 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 - + - Construct a PathConstraint for a give expected path + Asserts that a string does not end with another string. - The expected path + The expected string + The string to be examined - + - Test whether the constraint is satisfied by a given value + Asserts that two strings are equal, without regard to case. - The value to be tested - True for success, false for failure + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message - + - Returns true if the expected path and actual path match + Asserts that two strings are equal, without regard to case. + The expected string + The actual string - + - Returns the string representation of this constraint + 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 - + - Transform the provided path to its canonical form so that it - may be more easily be compared with other paths. + Asserts that two strings are not equal, without regard to case. - The original path - The path in canonical form + The expected string + The actual string - + - Test whether one path in canonical form is under another. + Asserts that a string matches an expected regular expression pattern. - The first path - supposed to be the parent path - The second path - supposed to be the child path - Indicates whether case should be ignored - + The regex pattern to be matched + The actual string + The message to display in case of failure + Arguments used in formatting the message - + - Modifies the current instance to be case-insensitve - and returns it. + Asserts that a string matches an expected regular expression pattern. + The regex pattern to be matched + The actual string - + - Modifies the current instance to be case-sensitve - and returns it. + 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 - + - Predicate constraint wraps a Predicate in a constraint, - returning success if the predicate is true. + Asserts that a string does not match an expected regular expression pattern. + The regex pattern to be used + The actual string - + - Construct a PredicateConstraint from a predicate + The TestCaseData class represents a set of arguments + and other parameter info to be used for a parameterized + test case. It is derived from TestCaseParameters and adds a + fluent syntax for use in initializing the test case. - + - Determines whether the predicate succeeds when applied - to the actual value. + Initializes a new instance of the class. + The arguments. - + - Writes the description to a MessageWriter + Initializes a new instance of the class. + The argument. - + - 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 first argument. + The second argument. - + - Initializes a new instance of the class. + Initializes a new instance of the class. - The name. - The constraint to apply to the property. + The first argument. + The second argument. + The third argument. - + - Test whether the constraint is satisfied by a given value + Sets the expected result for the test - The value to be tested - True for success, false for failure + The expected result + A modified TestCaseData - + - Write the constraint description to a MessageWriter + Sets the name of the test case - The writer on which the description is displayed + The modified TestCaseData instance - + - 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. + Sets the description for the test case + being constructed. - The writer on which the actual value is displayed + The description. + The modified TestCaseData instance. - + - Returns the string representation of the constraint. + Applies a category to the test + - + - 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. + Applies a named property to the test + + + - + - Initializes a new instance of the class. + Applies a named property to the test - The name of the property. + + + - + - Test whether the property exists for a given object + Applies a named property to the test - The object to be tested - True for success, false for failure + + + - + - Write the constraint description to a MessageWriter + Marks the test case as explicit. - The writer on which the description is displayed - + - Write the actual value for a failing constraint test to a - MessageWriter. + Marks the test case as explicit, specifying the reason. - The writer on which the actual value is displayed - + - Returns the string representation of the constraint. + Ignores this TestCase, specifying the reason. + The reason. - + - RangeConstraint tests whether two values are within a - specified range. + Provide the context information of the current test. + This is an adapter for the internal ExecutionContext + class, hiding the internals from the user test. - + - Initializes a new instance of the class. + Construct a TestContext for an ExecutionContext - From. - To. + The ExecutionContext to adapt - + - Test whether the constraint is satisfied by a given value + 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. - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Gets a TextWriter that will send output to the current test result. - The writer on which the description is displayed - + - RegexConstraint can test whether a string matches - the pattern provided. + Gets a TextWriter that will send output directly to Console.Error - + - Initializes a new instance of the class. + Gets a TextWriter for use in displaying immediate progress messages - The pattern. - + - Test whether the constraint is satisfied by a given value + TestParameters object holds parameters for the test run, if any are specified - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Static DefaultWorkDirectory is now used as the source + of the public instance property WorkDirectory. This is + a bit odd but necessary to avoid breaking user tests. - 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. + Get a representation of the current test. - + - Create a new instance of ResolvableConstraintExpression + Gets a Representation of the TestResult for the current test. - + - Create a new instance of ResolvableConstraintExpression, - passing in a pre-populated ConstraintBuilder. + Gets the unique name of the Worker that is executing this test. - + - Resolve the current expression to a Constraint + Gets the directory containing the current test assembly. - + - This operator creates a constraint that is satisfied only if both - argument constraints are satisfied. + Gets the directory to be used for outputting files created + by this test run. - + - This operator creates a constraint that is satisfied only if both - argument constraints are satisfied. + Gets the random generator. + + The random generator. + - + - This operator creates a constraint that is satisfied only if both - argument constraints are satisfied. + Gets the number of assertions executed + up to this point in the test. - - - This operator creates a constraint that is satisfied if either - of the argument constraints is satisfied. - + + Write the string representation of a boolean value to the current result - - - This operator creates a constraint that is satisfied if either - of the argument constraints is satisfied. - + + Write a char to the current result - - - This operator creates a constraint that is satisfied if either - of the argument constraints is satisfied. - + + Write a char array to the current result - - - This operator creates a constraint that is satisfied if the - argument constraint is not satisfied. - + + Write the string representation of a double to the current result - - - Appends an And Operator to the expression - + + Write the string representation of an Int32 value to the current result - + + Write the string representation of an Int64 value to the current result + + + Write the string representation of a decimal value to the current result + + + Write the string representation of an object to the current result + + + Write the string representation of a Single value to the current result + + + Write a string to the current result + + + Write the string representation of a UInt32 value to the current result + + + Write the string representation of a UInt64 value to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a line terminator to the current result + + + Write the string representation of a boolean value to the current result followed by a line terminator + + + Write a char to the current result followed by a line terminator + + + Write a char array to the current result followed by a line terminator + + + Write the string representation of a double to the current result followed by a line terminator + + + Write the string representation of an Int32 value to the current result followed by a line terminator + + + Write the string representation of an Int64 value to the current result followed by a line terminator + + + Write the string representation of a decimal value to the current result followed by a line terminator + + + Write the string representation of an object to the current result followed by a line terminator + + + Write the string representation of a Single value to the current result followed by a line terminator + + + Write a string to the current result followed by a line terminator + + + Write the string representation of a UInt32 value to the current result followed by a line terminator + + + Write the string representation of a UInt64 value to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + - Appends an Or operator to the expression. + This method adds the a new ValueFormatterFactory to the + chain of responsibility used for formatting values in messages. + The scope of the change is the current TestContext. + The factory delegate - + - ReusableConstraint wraps a constraint expression after - resolving it so that it can be reused consistently. + Attach a file to the current test result + Relative or absolute file path to attachment + Optional description of attachment - + - Construct a ReusableConstraint from a constraint expression + This method provides a simplified way to add a ValueFormatter + delegate to the chain of responsibility, creating the factory + delegate internally. It is useful when the Type of the object + is the only criterion for selection of the formatter, since + it can be used without getting involved with a compound function. - The expression to be resolved and reused + The type supported by this formatter + The ValueFormatter delegate - + - Converts a constraint to a ReusableConstraint + TestAdapter adapts a Test for consumption by + the user test code. - The constraint to be converted - A ReusableConstraint - + - Returns the string representation of the constraint. + Construct a TestAdapter for a Test - A string representing the constraint + The Test to be adapted - + - Resolves the ReusableConstraint by returning the constraint - that it originally wrapped. + Gets the unique Id of a test - A resolved constraint - + - SameAsConstraint tests whether an object is identical to - the object passed to its constructor + The name of the test, which may or may not be + the same as the method name. - + - Initializes a new instance of the class. + The name of the method representing the test. - The expected object. - + - Test whether the constraint is satisfied by a given value + The FullName of the test - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + The ClassName of the test - The writer on which the description is displayed - + - Summary description for SamePathConstraint. + The properties of the test. - + - Initializes a new instance of the class. + The arguments to use in creating the test or empty array if none are required. - The expected path - + - Test whether the constraint is satisfied by a given value + ResultAdapter adapts a TestResult for consumption by + the user test code. - The expected path - The actual path - True for success, false for failure - + - Write the constraint description to a MessageWriter + Construct a ResultAdapter for a TestResult - The writer on which the description is displayed + The TestResult to be adapted - + - SamePathOrUnderConstraint tests that one path is under another + Gets a ResultState representing the outcome of the test + up to this point in its execution. - + - Initializes a new instance of the class. + Gets a list of the assertion results generated + up to this point in the test. - The expected path - + - Test whether the constraint is satisfied by a given value + Gets the message associated with a test + failure or with not running the test - The expected path - The actual path - True for success, false for failure - + - Write the constraint description to a MessageWriter + Gets any stacktrace associated with an + error or failure. - The writer on which the description is displayed - + - SomeItemsConstraint applies another constraint to each - item in a collection, succeeding if any of them succeeds. + Gets the number of test cases that failed + when running the test and all its children. - + - Construct a SomeItemsConstraint on top of an existing constraint + Gets the number of test cases that had warnings + when running the test and all its children. - - + - Apply the item constraint to each item in the collection, - succeeding if any item succeeds. + Gets the number of test cases that passed + when running the test and all its children. - - - + - Write a description of this constraint to a MessageWriter + Gets the number of test cases that were skipped + when running the test and all its children. - - + - StartsWithConstraint can test whether a string starts - with an expected substring. + Gets the number of test cases that were inconclusive + when running the test and all its children. - + - Initializes a new instance of the class. + TestParameters class holds any named parameters supplied to the test run - 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. + Gets the number of test parameters - - - + - Write the constraint description to a MessageWriter + Gets a collection of the test parameter names - The writer on which the description is displayed - + - SubPathConstraint tests that the actual path is under the expected path + Gets a flag indicating whether a parameter with the specified name exists. + Name of the parameter + True if it exists, otherwise false - + - Initializes a new instance of the class. + Indexer provides access to the internal dictionary - The expected path + Name of the parameter + Value of the parameter or null if not present - + - Test whether the constraint is satisfied by a given value + Get method is a simple alternative to the indexer - The expected path - The actual path - True for success, false for failure + Name of the parameter + Value of the parameter or null if not present - + - Write the constraint description to a MessageWriter + Get the value of a parameter or a default string - The writer on which the description is displayed + Name of the parameter + Default value of the parameter + Value of the parameter or default value if not present - + - SubstringConstraint can test whether a string contains - the expected substring. + Get the value of a parameter or return a default + The return Type + Name of the parameter + Default value of the parameter + Value of the parameter or default value if not present - + - Initializes a new instance of the class. + Adds a parameter to the list - The expected. + Name of the parameter + Value of the parameter - + - Test whether the constraint is satisfied by a given value + Helper class with properties and methods that supply + constraints that operate on exceptions. - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Creates a constraint specifying an expected exception - 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. + Creates a constraint specifying an exception with a given InnerException - + - Initializes a new instance of the class, - using a constraint to be applied to the exception. + Creates a constraint specifying an expected TargetInvocationException - 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. + Creates a constraint specifying an expected ArgumentException - 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. + Creates a constraint specifying an expected ArgumentNullException - + - Write the constraint description to a MessageWriter + Creates a constraint specifying an expected InvalidOperationException - 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. + Creates a constraint specifying that no exception is thrown - The writer on which the actual value is displayed - + - Returns the string representation of this constraint + Creates a constraint specifying the exact type of exception expected - + - Get the actual exception thrown - used by Assert.Throws. + Creates a constraint specifying the exact type of exception expected - + - ThrowsNothingConstraint tests that a delegate does not - throw an exception. + Creates a constraint specifying the type of exception expected - + - Test whether the constraint is satisfied by a given value + Creates a constraint specifying the type of exception expected - The value to be tested - True if no exception is thrown, otherwise false - + - Write the constraint description to a MessageWriter + Provides static methods to express conditions + that must be met for the test to succeed. If + any test fails, a warning is issued. - The writer on which the description is displayed - + - Write the actual value for a failing constraint test to a - MessageWriter. Overridden in ThrowsNothingConstraint to write - information about the exception that was actually caught. + DO NOT USE! + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. - The writer on which the actual value is displayed + The left object. + The right object. + Not applicable - + - 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. + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + The left object. + The right object. - + - Constructs a linear tolerance of a specdified amount + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied - + - Constructs a tolerance given an amount and ToleranceMode + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + The Type being compared. + 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 - + - Tests that the current Tolerance is linear with a - numeric value, throwing an exception if it is not. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception - + - 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. - + Asserts that a condition is true. If the condition is false a warning is issued. + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message - + - Returns a zero Tolerance object, equivalent to - specifying an exact match. + Asserts that a condition is true. If the condition is false a warning is issued. + The evaluated condition - + - Gets the ToleranceMode for the current Tolerance - + Asserts that a condition is true. If the condition is false a warning is issued. + + The evaluated condition + A function to build the message included with the Exception - + - Gets the value of the current Tolerance instance. - + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + The message to display if the condition is false + Arguments to be used in formatting the message - + - Returns a new tolerance, using the current amount as a percentage. + Asserts that a condition is true. If the condition is false the method throws + an . + A lambda that returns a Boolean - + - Returns a new tolerance, using the current amount in Ulps. - + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + A function to build the message included with the Exception - + - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of days. + 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 new tolerance with a TimeSpan as the amount, using - the current amount as a number of hours. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + The Type being compared. + The actual value to test + A Constraint to be applied - + - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of minutes. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of seconds. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + The Type being compared. + The actual value to test + A Constraint to be applied + A function to build the message included with the Exception - + - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of milliseconds. + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning on success. + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied - + - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of clock ticks. + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning on success. + The Type being compared. + 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 - + - Returns true if the current tolerance is empty. + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning on failure. + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception - + - Modes in which the tolerance value for a comparison can be interpreted. - + Asserts that a condition is true. If the condition is false a warning is issued. + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message - + - 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. + Asserts that a condition is true. If the condition is false a warning is issued. + The evaluated condition - + - The tolerance is used as a numeric range within which - two compared values are considered to be equal. - + Asserts that a condition is true. If the condition is false a warning is issued. + + The evaluated condition + A function to build the message included with the Exception - + - Interprets the tolerance as the percentage by which - the two compared values my deviate from each other. + Asserts that a condition is false. If the condition is true a warning is issued. + + A lambda that returns a Boolean + The message to display if the condition is true + Arguments to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true a warning is issued. + A lambda that returns a Boolean - + - Compares two values based in their distance in - representable numbers. + Asserts that a condition is false. If the condition is true a warning is issued. + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning if it succeeds. + The Type being compared. + The actual value to test + A Constraint to be applied - + - TrueConstraint tests that the actual value is true + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning if it succeeds. + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Initializes a new instance of the class. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + The Type being compared. + The actual value to test + A Constraint to be applied + A function to build the message included with the Exception - + - UniqueItemsConstraint tests whether all the items in a - collection are unique. + FrameworkPackageSettings is a static class containing constant values that + are used as keys in setting up a TestPackage. These values are used in + the framework, and set in the runner. Setting values may be a string, int or bool. - + - Check that all items are unique. + Flag (bool) indicating whether tests are being debugged. - - - + - Write a description of this constraint to a MessageWriter + Flag (bool) indicating whether to pause execution of tests to allow + the user to attach a debugger. - - + - XmlSerializableConstraint tests whether - an object is serializable in XML format. + The InternalTraceLevel for this run. Values are: "Default", + "Off", "Error", "Warning", "Info", "Debug", "Verbose". + Default is "Off". "Debug" and "Verbose" are synonyms. - + - Test whether the constraint is satisfied by a given value + Full path of the directory to be used for work and result files. + This path is provided to tests by the framework TestContext. - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Integer value in milliseconds for the default timeout value + for test cases. If not specified, there is no timeout except + as specified by attributes on the tests themselves. - 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. + A TextWriter to which the internal trace will be sent. - The writer on which the actual value is displayed - + - Returns the string representation of this constraint + A list of tests to be loaded. - + - Represents a constraint that succeeds if all the - members of a collection match a base constraint. + The number of test threads to run for the assembly. If set to + 1, a single queue is used. If set to 0, tests are executed + directly, without queuing. - + - Abstract base for operators that indicate how to - apply a constraint to items in a collection. + The random seed to be used for this assembly. If specified + as the value reported from a prior run, the framework should + generate identical random values for tests as were used for + that run, provided that no change has been made to the test + assembly. Default is a random value itself. - + - PrefixOperator takes a single constraint and modifies - it's action in some way. + If true, execution stops after the first error or failure. - + - 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. + If true, use of the event queue is suppressed and test events are synchronous. - + - The precedence value used when the operator - is about to be pushed to the stack. + The default naming pattern used in generating test names - + - The precedence value used when the operator - is on the top of the stack. + Parameters to be passed on to the tests, serialized to a single string which needs parsing. Obsoleted by ; kept for backward compatibility. - + - 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. + Parameters to be passed on to the tests, already parsed into an IDictionary<string, string>. Replaces . - - + - The syntax element preceding this operator + Provides a platform-independent methods for getting attributes + for use by AttributeConstraint and AttributeExistsConstraint. - + - The syntax element folowing this operator + Gets the custom attributes from the given object. + .NET Standard 1.3 libraries do not have an ICustomAttributeProvider, so we need to cast to each of + it's direct subtypes and try to get attributes off those instead. + The actual. + Type of the attribute. + if set to true [inherit]. + A list of the given attribute on the given object. - + - The precedence value used when the operator - is about to be pushed to the stack. + A MarshalByRefObject that lives forever - + - The precedence value used when the operator - is on the top of the stack. + Obtains a lifetime service object to control the lifetime policy for this instance. - + - 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. + Provides NUnit specific extensions to aid in Reflection + across multiple frameworks - + + This version of the class supplies GetTypeInfo() on platforms + that don't support it. + - + - Returns the constraint created by applying this - prefix to another constraint. + GetTypeInfo gives access to most of the Type information we take for granted + on .NET Core and Windows Runtime. Rather than #ifdef different code for different + platforms, it is easiest to just code all platforms as if they worked this way, + thus the simple passthrough. - + - + - Constructs a CollectionOperator + Extensions for Assembly that are not available in pre-4.5 .NET releases - + - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - they all succeed. + An easy way to get a single custom attribute from an assembly + The attribute Type + The assembly + An attribute of Type T - + - Operator that requires both it's arguments to succeed + Extensions for MethodInfo that are not available in pre-4.5 .NET releases - + - Abstract base class for all binary operators + See . - + - 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. + Type extensions that apply to all target frameworks - - + - Abstract method that produces a constraint by applying - the operator to its left and right constraint arguments. + Determines if the given array is castable/matches the array. + + + - + - Gets the left precedence of the operator + Determines if one type can be implicitly converted from another + + + - + - Gets the right precedence of the operator + This class is used as a flag when we get a parameter list for a method/constructor, but + we do not know one of the types because null was passed in. - + - Construct an AndOperator + Represents a thread-safe first-in, first-out collection of objects. + Specifies the type of elements in the queue. + + All public and protected members of are thread-safe and may be used + concurrently from multiple threads. + - + - Apply the operator to produce an AndConstraint + Initializes a new instance of the class. - + - Operator that tests for the presence of a particular attribute - on a type and optionally applies further tests to the attribute. + Initializes a new instance of the + class that contains elements copied from the specified collection + The collection whose elements are copied to the new . + The argument is + null. - + - Abstract base class for operators that are able to reduce to a - constraint whether or not another syntactic element follows. + Adds an object to the end of the . + The object to add to the end of the . The value can be a null reference + (Nothing in Visual Basic) for reference types. + - + - Construct an AttributeOperator for a particular Type + Attempts to add an object to the . - The Type of attribute tested + The object to add to the . The value can be a null + reference (Nothing in Visual Basic) for reference types. + + true if the object was added successfully; otherwise, false. + For , this operation will always add the object to the + end of the + and return true. - + - 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. + Attempts to remove and return the object at the beginning of the . + + When this method returns, if the operation was successful, contains the + object removed. If no object was available to be removed, the value is unspecified. + + true if an element was removed and returned from the beginning of the + successfully; otherwise, false. - + - Represents a constraint that succeeds if the specified - count of members of a collection match a base constraint. + Attempts to return an object from the beginning of the + without removing it. + When this method returns, contains an object from + the beginning of the or an + unspecified value if the operation failed. + true if and object was returned successfully; otherwise, false. - + - Construct an ExactCountOperator for a specified count + Returns an enumerator that iterates through a collection. - The expected count + An that can be used to iterate through the collection. - + - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. + Returns an enumerator that iterates through the . + An enumerator for the contents of the . + + The enumeration represents a moment-in-time snapshot of the contents + of the queue. It does not reflect any updates to the collection after + was called. The enumerator is safe to use + concurrently with reads from and writes to the queue. + - + + + Copies the elements of the to an , starting at a particular + index. + + The one-dimensional Array that is the + destination of the elements copied from the + . The Array must have zero-based indexing. + The zero-based index in at which copying + begins. + is a null reference (Nothing in + Visual Basic). + is less than + zero. + + is multidimensional. -or- + does not have zero-based indexing. -or- + is equal to or greater than the length of the + -or- The number of elements in the source is + greater than the available space from to the end of the destination + . -or- The type of the source cannot be cast automatically to the type of the + destination . + + + + + Copies the elements to an existing one-dimensional Array, starting at the specified array index. + + The one-dimensional Array that is the + destination of the elements copied from the + . The Array must have zero-based + indexing. + The zero-based index in at which copying + begins. + is a null reference (Nothing in + Visual Basic). + is less than + zero. + is equal to or greater than the + length of the + -or- The number of elements in the source is greater than the + available space from to the end of the destination . + + + + + Copies the elements stored in the to a new array. + + A new array containing a snapshot of elements copied from the . + + + + Gets a value indicating whether access to the is + synchronized with the SyncRoot. + + true if access to the is synchronized + with the SyncRoot; otherwise, false. For , this property always + returns false. + + + + Attempts to remove and return an object from the . + + + When this method returns, if the operation was successful, contains the + object removed. If no object was available to be removed, the value is unspecified. + + true if an element was removed and returned successfully; otherwise, false. + For , this operation will attempt to remove the object + from the beginning of the . + + + - Represents a constraint that succeeds if none of the - members of a collection match a base constraint. + Gets an object that can be used to synchronize access to the . This property is not supported. + The SyncRoot property is not supported. - + - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. + Gets the number of elements contained in the . + The number of elements contained in the . + + For determining whether the collection contains any items, use of the + property is recommended rather than retrieving the number of items from the + property and comparing it to 0. + - + - Negates the test of the constraint it wraps. + Gets a value that indicates whether the is empty. + true if the is empty; otherwise, false. + + For determining whether the collection contains any items, use of this property is recommended + rather than retrieving the number of items from the property and comparing it + to 0. However, as this collection is intended to be accessed concurrently, it may be the case + that another thread will modify the collection after returns, thus invalidating + the result. + - + - Constructs a new NotOperator + Defines methods to manipulate thread-safe collections intended for producer/consumer usage. + Specifies the type of elements in the collection. + + All implementations of this interface must enable all members of this interface + to be used concurrently from multiple threads. + - + - Returns a NotConstraint applied to its argument. + Attempts to add an object to the . + The object to add to the . + true if the object was added successfully; otherwise, false. + The was invalid for this collection. - + - Operator that requires at least one of it's arguments to succeed + Attempts to remove and return an object from the . + + When this method returns, if the object was removed and returned successfully, contains the removed object. If no object was available to be removed, the value is + unspecified. + + true if an object was removed and returned successfully; otherwise, false. - + - Construct an OrOperator + Copies the elements contained in the to a new array. + A new array containing the elements copied from the . - + - Apply the operator to produce an OrConstraint + Copies the elements of the to + an + , starting at a specified index. + The one-dimensional that is the destination of + the elements copied from the . + The array must have zero-based indexing. + The zero-based index in at which copying + begins. + is a null reference (Nothing in + Visual Basic). + is less than + zero. + is equal to or greater than the + length of the + -or- The number of elements in the source is greater than the + available space from to the end of the destination . + - + - 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 + - + - Represents a constraint that succeeds if any of the - members of a collection match a base constraint. + - + - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - any of them succeed. + - + - Operator that tests that an exception is thrown and - optionally applies further tests to the exception. + + - + - Construct a ThrowsOperator + + + + - + - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. + + + + - + - Represents a constraint that simply wraps the - constraint provided as an argument, without any - further functionality, but which modifes the - order of evaluation because of its precedence. + - + - Constructor for the WithOperator + - + - Returns a constraint that wraps its argument + - + - Thrown when an assertion failed. + + - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - + - Serialization Constructor + - + - 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 diff --git a/project/UnitTests/Core/Config/PreprocessorTest.cs b/project/UnitTests/Core/Config/PreprocessorTest.cs index 76f27d565..8cd978b23 100644 --- a/project/UnitTests/Core/Config/PreprocessorTest.cs +++ b/project/UnitTests/Core/Config/PreprocessorTest.cs @@ -32,10 +32,13 @@ public void TestAttrNodesetDefine() AssertNodeExists(nav, "/root/test-two/outer-content/nodeset-content"); } - [Test, ExpectedException(typeof(InvalidMarkupException))] + [Test] public void TestAttributeWithNoName() { - _Preprocess("TestInvalidAttribute2.xml"); + Assert.Throws(() => + { + _Preprocess("TestInvalidAttribute2.xml"); + }); } [Test] @@ -110,20 +113,23 @@ public void TestExplicitDefine1() AssertNodeValue(nav, "/root/@foo", "foo_val"); } - [Test, ExpectedException(typeof(ExplicitDefinitionRequiredException))] + [Test] public void TestExplicitDefine2() { - var settings = new PreprocessorSettings(); - try + Assert.Throws(() => { - Environment.SetEnvironmentVariable("foo", "foo_val"); - settings.ExplicitDeclarationRequired = true; - _Preprocess("TestExplicitDefine.xml", settings); - } - finally - { - Environment.SetEnvironmentVariable("foo", null); - } + var settings = new PreprocessorSettings(); + try + { + Environment.SetEnvironmentVariable("foo", "foo_val"); + settings.ExplicitDeclarationRequired = true; + _Preprocess("TestExplicitDefine.xml", settings); + } + finally + { + Environment.SetEnvironmentVariable("foo", null); + } + }); } [Test] @@ -204,23 +210,29 @@ public void TestInitialDefine() AssertNodeValue(nav, "/root/@foo", "foo_val"); } - [Test, ExpectedException(typeof(ExplicitDefinitionRequiredException))] + [Test] public void TestInitialDefine2() { - var settings = new PreprocessorSettings(); - var defs = new Dictionary(); - defs["foo"] = "foo_val"; - settings.InitialDefinitions = defs; - settings.ExplicitDeclarationRequired = true; - XmlDocument doc = _Preprocess("TestExplicitDefine.xml", settings); - XPathNavigator nav = doc.CreateNavigator(); - AssertNodeValue(nav, "/root/@foo", "foo_val"); + Assert.Throws(() => + { + var settings = new PreprocessorSettings(); + var defs = new Dictionary(); + defs["foo"] = "foo_val"; + settings.InitialDefinitions = defs; + settings.ExplicitDeclarationRequired = true; + XmlDocument doc = _Preprocess("TestExplicitDefine.xml", settings); + XPathNavigator nav = doc.CreateNavigator(); + AssertNodeValue(nav, "/root/@foo", "foo_val"); + }); } - [Test, ExpectedException(typeof(InvalidMarkupException))] + [Test] public void TestMisplacedAttribute() { - _Preprocess("TestInvalidAttribute.xml"); + Assert.Throws(() => + { + _Preprocess("TestInvalidAttribute.xml"); + }); } [Test] @@ -347,24 +359,27 @@ public void TestIncludeStack() } } - [Test, ExpectedException(typeof(MissingIncludeException))] + [Test] public void TestMissingIncludeFile() { - string filename = "TestMissingIncludeFile.xml"; - - using (XmlReader input = GetInput(filename)) + Assert.Throws(() => { - using (XmlWriter output = GetOutput()) + string filename = "TestMissingIncludeFile.xml"; + + using (XmlReader input = GetInput(filename)) { - ConfigPreprocessor preprocessor = new ConfigPreprocessor(); - preprocessor.PreProcess( - input, output, - new FileNotFoundTestResolver(FAKE_ROOT + filename), - new Uri(FAKE_ROOT + filename)); + using (XmlWriter output = GetOutput()) + { + ConfigPreprocessor preprocessor = new ConfigPreprocessor(); + preprocessor.PreProcess( + input, output, + new FileNotFoundTestResolver(FAKE_ROOT + filename), + new Uri(FAKE_ROOT + filename)); + } } - } + }); } - + [Test] public void TestScope() { @@ -375,10 +390,13 @@ public void TestScope() AssertNodeValue( doc, "/root/inner/test[2]", "val2_redef" ); } - [Test,ExpectedException(typeof(CyclicalEvaluationException))] + [Test] public void TestCycle() - { - _Preprocess( "TestCycle.xml" ); + { + Assert.Throws(() => + { + _Preprocess("TestCycle.xml"); + }); } [Test] diff --git a/project/UnitTests/Core/Label/DefaultLabellerTest.cs b/project/UnitTests/Core/Label/DefaultLabellerTest.cs index 29c600bd5..acc7d1070 100644 --- a/project/UnitTests/Core/Label/DefaultLabellerTest.cs +++ b/project/UnitTests/Core/Label/DefaultLabellerTest.cs @@ -261,29 +261,35 @@ public void GeneratePrefixedLabelFromLabelPrefixFileAndLabelPrefixsFileSearchPat [Test] - [ExpectedException(ExpectedMessage = "File DummyFile.txt does not exist")] public void MustThrowExceptionWhenSpecifyingNonExistentFile() { - string lblFile = "DummyFile.txt"; + var ex = Assert.Throws(() => + { + string lblFile = "DummyFile.txt"; - labeller.LabelPrefixFile = lblFile; + labeller.LabelPrefixFile = lblFile; - labeller.Generate(SuccessfulResult("1.3.4.35")); + labeller.Generate(SuccessfulResult("1.3.4.35")); + }); + Assert.That(ex.Message, Is.EqualTo("File DummyFile.txt does not exist")); } [Test] - [ExpectedException(ExpectedMessage = "No valid prefix data found in file : thelabelprefix.txt")] public void MustThrowExceptionWhenContentsOfLabelPrefixFileDoesNotMatchLabelPrefixsFileSearchPattern() { - string lblFile = "thelabelprefix.txt"; - System.IO.File.WriteAllText(lblFile, "ho ho ho"); + var ex = Assert.Throws(() => + { + string lblFile = "thelabelprefix.txt"; + System.IO.File.WriteAllText(lblFile, "ho ho ho"); - labeller.LabelPrefixFile = lblFile; - labeller.LabelPrefixsFileSearchPattern = @"\d+\.\d+\.\d+\."; + labeller.LabelPrefixFile = lblFile; + labeller.LabelPrefixsFileSearchPattern = @"\d+\.\d+\.\d+\."; - labeller.Generate(SuccessfulResult("1.3.4.35")); + labeller.Generate(SuccessfulResult("1.3.4.35")); + }); + Assert.That(ex.Message, Is.EqualTo("No valid prefix data found in file : thelabelprefix.txt")); } - } + } } diff --git a/project/UnitTests/Core/Publishers/PackagePublisherTests.cs b/project/UnitTests/Core/Publishers/PackagePublisherTests.cs index e286c7f3a..84c06a466 100644 --- a/project/UnitTests/Core/Publishers/PackagePublisherTests.cs +++ b/project/UnitTests/Core/Publishers/PackagePublisherTests.cs @@ -18,7 +18,7 @@ public class PackagePublisherTests #endregion #region Setup - [TestFixtureSetUp] + [OneTimeSetUp] public void Setup() { // Delete any outputs from the last build @@ -33,7 +33,7 @@ public void Setup() #endregion #region CleanUp - [TestFixtureTearDown] + [OneTimeTearDown] public void CleanUp() { if (File.Exists(dataFilePath)) File.Delete(dataFilePath); diff --git a/project/UnitTests/Core/Publishers/Statistics/StatisticsBuilderTest.cs b/project/UnitTests/Core/Publishers/Statistics/StatisticsBuilderTest.cs index 94b7ac2d2..d28d4d4d6 100644 --- a/project/UnitTests/Core/Publishers/Statistics/StatisticsBuilderTest.cs +++ b/project/UnitTests/Core/Publishers/Statistics/StatisticsBuilderTest.cs @@ -29,7 +29,7 @@ public void SetUp() private string failedBuildLog; private StatisticsResults results; - [TestFixtureSetUp] + [OneTimeSetUp] public void LoadXML() { StreamReader reader = File.OpenText("buildlog.xml"); diff --git a/project/UnitTests/Core/SourceControl/GitHistoryParserTest.cs b/project/UnitTests/Core/SourceControl/GitHistoryParserTest.cs index aba01f2b7..6f9e81893 100644 --- a/project/UnitTests/Core/SourceControl/GitHistoryParserTest.cs +++ b/project/UnitTests/Core/SourceControl/GitHistoryParserTest.cs @@ -43,7 +43,7 @@ public void ParsingSingleLogMessageProducesOneModification() } [Test] - [Ignore] + [Ignore("TODO: provide a reason")] public void ParsingLogWithLF() { Modification[] modifications = git.Parse(File.OpenText("CCNet.git.log.txt"), new DateTime(2009, 01, 01, 10, 00, 00, DateTimeKind.Utc), new DateTime(2009, 01, 31, 10, 00, 00, DateTimeKind.Utc)); @@ -78,7 +78,7 @@ public void ParsingLogWithLF() } [Test] - [Ignore] + [Ignore("TODO: provide a reason")] public void ParsingLargeGitLog() { Modification[] modifications = git.Parse(File.OpenText("CCNet.git.log.txt"), DateTime.MinValue, DateTime.MaxValue); diff --git a/project/UnitTests/Core/SourceControl/MksHistoryParserTest.cs b/project/UnitTests/Core/SourceControl/MksHistoryParserTest.cs index c033b4472..2bbdc2a68 100644 --- a/project/UnitTests/Core/SourceControl/MksHistoryParserTest.cs +++ b/project/UnitTests/Core/SourceControl/MksHistoryParserTest.cs @@ -14,7 +14,7 @@ public class MksHistoryParserTest private string TEST_DATA = String.Empty; private string MEMBER_INFO = String.Empty; - [TestFixtureSetUp] + [OneTimeSetUp] public void SetUp() { // Transform xml output diff --git a/project/UnitTests/Core/SourceControl/Telelogic/SynergyCommandBuilderTest.cs b/project/UnitTests/Core/SourceControl/Telelogic/SynergyCommandBuilderTest.cs index bc40c4f81..bcdebdda3 100644 --- a/project/UnitTests/Core/SourceControl/Telelogic/SynergyCommandBuilderTest.cs +++ b/project/UnitTests/Core/SourceControl/Telelogic/SynergyCommandBuilderTest.cs @@ -14,7 +14,7 @@ public sealed class SynergyCommandBuilderTest : IntegrationFixture private SynergyProjectInfo project; private IIntegrationResult result; - [TestFixtureSetUp] + [OneTimeSetUp] public void TestFixtureSetUp() { Synergy synergy = (Synergy) NetReflector.Read(SynergyMother.ConfigValues); diff --git a/project/UnitTests/Core/SourceControl/Telelogic/SynergyParserTest.cs b/project/UnitTests/Core/SourceControl/Telelogic/SynergyParserTest.cs index f4327c617..9c44381d1 100644 --- a/project/UnitTests/Core/SourceControl/Telelogic/SynergyParserTest.cs +++ b/project/UnitTests/Core/SourceControl/Telelogic/SynergyParserTest.cs @@ -12,7 +12,7 @@ public sealed class SynergyParserTest private SynergyConnectionInfo connection; private SynergyProjectInfo project; - [TestFixtureSetUp] + [OneTimeSetUp] public void TestFixtureSetUp() { connection = new SynergyConnectionInfo(); diff --git a/project/UnitTests/Core/Tasks/AntsPerformanceProfilerTaskTests.cs b/project/UnitTests/Core/Tasks/AntsPerformanceProfilerTaskTests.cs index 103dcf34c..7b6e674c0 100644 --- a/project/UnitTests/Core/Tasks/AntsPerformanceProfilerTaskTests.cs +++ b/project/UnitTests/Core/Tasks/AntsPerformanceProfilerTaskTests.cs @@ -420,7 +420,7 @@ public void ShouldFailIfProcessTimesOut() mocks.Verify(); Assert.That(result.Status, Is.EqualTo(IntegrationStatus.Failure)); - Assert.That(result.TaskOutput, Is.StringMatching("Command line '.*' timed out after \\d+ seconds")); + Assert.That(result.TaskOutput, Does.Match("Command line '.*' timed out after \\d+ seconds")); } #endregion diff --git a/project/UnitTests/Core/Tasks/DumpValueTaskTest.cs b/project/UnitTests/Core/Tasks/DumpValueTaskTest.cs index ef3cf2e83..cd1299f0a 100644 --- a/project/UnitTests/Core/Tasks/DumpValueTaskTest.cs +++ b/project/UnitTests/Core/Tasks/DumpValueTaskTest.cs @@ -20,7 +20,7 @@ class DumpValueTaskTest #endregion #region Setup - [TestFixtureSetUp] + [OneTimeSetUp] public void TestFixtureSetUp() { // Delete any outputs from the last build diff --git a/project/UnitTests/Core/Tasks/ExecutableTaskTest.cs b/project/UnitTests/Core/Tasks/ExecutableTaskTest.cs index 3cf9c830c..d444e04f0 100644 --- a/project/UnitTests/Core/Tasks/ExecutableTaskTest.cs +++ b/project/UnitTests/Core/Tasks/ExecutableTaskTest.cs @@ -291,7 +291,7 @@ public void ShouldFailIfProcessTimesOut() task.Run(result); Assert.That(result.Status, Is.EqualTo(IntegrationStatus.Failure)); - Assert.That(result.TaskOutput, Is.StringMatching("Command line '.*' timed out after \\d+ seconds")); + Assert.That(result.TaskOutput, Does.Match("Command line '.*' timed out after \\d+ seconds")); Verify(); } diff --git a/project/UnitTests/Core/Tasks/FakeTaskTest.cs b/project/UnitTests/Core/Tasks/FakeTaskTest.cs index edff8ea7f..3f17fe4e7 100644 --- a/project/UnitTests/Core/Tasks/FakeTaskTest.cs +++ b/project/UnitTests/Core/Tasks/FakeTaskTest.cs @@ -91,7 +91,7 @@ public void ShouldFailIfProcessTimesOut() mocks.VerifyAll(); Assert.That(result.Status, Is.EqualTo(IntegrationStatus.Failure)); - Assert.That(result.TaskOutput, Is.StringMatching("Command line '.*' timed out after \\d+ seconds")); + Assert.That(result.TaskOutput, Does.Match("Command line '.*' timed out after \\d+ seconds")); } private IIntegrationResult GenerateResultMock(string workingDir, string artefactDir) diff --git a/project/UnitTests/Core/Tasks/GendarmeTaskTest.cs b/project/UnitTests/Core/Tasks/GendarmeTaskTest.cs index 001c633d2..47330d8af 100644 --- a/project/UnitTests/Core/Tasks/GendarmeTaskTest.cs +++ b/project/UnitTests/Core/Tasks/GendarmeTaskTest.cs @@ -195,7 +195,7 @@ public void TimedOutExecutionShouldFailBuild() task.Run(result); Assert.That(result.Status, Is.EqualTo(IntegrationStatus.Failure)); - Assert.That(result.TaskOutput, Is.StringMatching("Command line '.*' timed out after \\d+ seconds")); + Assert.That(result.TaskOutput, Does.Match("Command line '.*' timed out after \\d+ seconds")); } [Test] diff --git a/project/UnitTests/Core/Tasks/MsBuildTaskTest.cs b/project/UnitTests/Core/Tasks/MsBuildTaskTest.cs index 2137c2fb7..aaf33e4b0 100644 --- a/project/UnitTests/Core/Tasks/MsBuildTaskTest.cs +++ b/project/UnitTests/Core/Tasks/MsBuildTaskTest.cs @@ -123,7 +123,7 @@ public void TimedOutExecutionShouldFailBuild() task.Run(result); Assert.That(result.Status, Is.EqualTo(IntegrationStatus.Failure)); - Assert.That(result.TaskOutput, Is.StringMatching("Command line '.*' timed out after \\d+ seconds")); + Assert.That(result.TaskOutput, Does.Match("Command line '.*' timed out after \\d+ seconds")); } [Test] diff --git a/project/UnitTests/Core/Tasks/NAntTaskTest.cs b/project/UnitTests/Core/Tasks/NAntTaskTest.cs index 1267fa9dc..462433384 100644 --- a/project/UnitTests/Core/Tasks/NAntTaskTest.cs +++ b/project/UnitTests/Core/Tasks/NAntTaskTest.cs @@ -107,7 +107,7 @@ public void ShouldFailBuildIfProcessTimesOut() builder.Run(result); Assert.That(result.Status, Is.EqualTo(IntegrationStatus.Failure)); - Assert.That(result.TaskOutput, Is.StringMatching("Command line '.*' timed out after \\d+ seconds")); + Assert.That(result.TaskOutput, Does.Match("Command line '.*' timed out after \\d+ seconds")); } [Test] diff --git a/project/UnitTests/Core/Tasks/PowerShellTaskTest.cs b/project/UnitTests/Core/Tasks/PowerShellTaskTest.cs index e248fae50..9e8dd6167 100644 --- a/project/UnitTests/Core/Tasks/PowerShellTaskTest.cs +++ b/project/UnitTests/Core/Tasks/PowerShellTaskTest.cs @@ -241,7 +241,7 @@ public void ShouldFailBuildIfProcessTimesOut() mytask.Run(result); Assert.That(result.Status, Is.EqualTo(IntegrationStatus.Failure)); - Assert.That(result.TaskOutput, Is.StringMatching("Command line '.*' timed out after \\d+ seconds")); + Assert.That(result.TaskOutput, Does.Match("Command line '.*' timed out after \\d+ seconds")); } [Test] diff --git a/project/UnitTests/Core/Tasks/RakeTaskTest.cs b/project/UnitTests/Core/Tasks/RakeTaskTest.cs index 2acb0fa60..08ad0279c 100644 --- a/project/UnitTests/Core/Tasks/RakeTaskTest.cs +++ b/project/UnitTests/Core/Tasks/RakeTaskTest.cs @@ -105,7 +105,7 @@ public void TimedOutExecutionShouldFailBuild() builder.Run(result); Assert.That(result.Status, Is.EqualTo(IntegrationStatus.Failure)); - Assert.That(result.TaskOutput, Is.StringMatching("Command line '.*' timed out after \\d+ seconds")); + Assert.That(result.TaskOutput, Does.Match("Command line '.*' timed out after \\d+ seconds")); } [Test] diff --git a/project/UnitTests/IntegrationTests/CCNet_1835.cs b/project/UnitTests/IntegrationTests/CCNet_1835.cs index b0f5165fc..5600bd7cc 100644 --- a/project/UnitTests/IntegrationTests/CCNet_1835.cs +++ b/project/UnitTests/IntegrationTests/CCNet_1835.cs @@ -29,7 +29,7 @@ namespace ThoughtWorks.CruiseControl.UnitTests.IntegrationTests public class CCNet_1835 { - [TestFixtureSetUp] + [OneTimeSetUp] public void fixLog4Net() { log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("test.config")); diff --git a/project/UnitTests/IntegrationTests/CCNet_1902.cs b/project/UnitTests/IntegrationTests/CCNet_1902.cs index a6048c8c6..9def6873e 100644 --- a/project/UnitTests/IntegrationTests/CCNet_1902.cs +++ b/project/UnitTests/IntegrationTests/CCNet_1902.cs @@ -15,7 +15,7 @@ namespace ThoughtWorks.CruiseControl.UnitTests.IntegrationTests [Category("Integration")] public class CCNet_1902 { - [TestFixtureSetUp] + [OneTimeSetUp] public void fixLog4Net() { log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("test.config")); diff --git a/project/UnitTests/IntegrationTests/PublisherTests.cs b/project/UnitTests/IntegrationTests/PublisherTests.cs index 5e8a1e7df..bc78b947a 100644 --- a/project/UnitTests/IntegrationTests/PublisherTests.cs +++ b/project/UnitTests/IntegrationTests/PublisherTests.cs @@ -7,7 +7,7 @@ namespace ThoughtWorks.CruiseControl.UnitTests.IntegrationTests { public class PublisherTests { - [TestFixtureSetUp] + [OneTimeSetUp] public void fixLog4Net() { log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("test.config")); diff --git a/project/UnitTests/IntegrationTests/SimpleScenarioTests.cs b/project/UnitTests/IntegrationTests/SimpleScenarioTests.cs index 0ba32fc3a..119745e23 100644 --- a/project/UnitTests/IntegrationTests/SimpleScenarioTests.cs +++ b/project/UnitTests/IntegrationTests/SimpleScenarioTests.cs @@ -15,7 +15,7 @@ public class SimpleScenarioTests { System.Collections.Generic.Dictionary IntegrationCompleted = new System.Collections.Generic.Dictionary(); - [TestFixtureSetUp] + [OneTimeSetUp] public void fixLog4Net() { log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("test.config")); diff --git a/project/UnitTests/IntegrationTests/SpacesInBuildArgsOfTask.cs b/project/UnitTests/IntegrationTests/SpacesInBuildArgsOfTask.cs index d49c0736f..bf10b52a9 100644 --- a/project/UnitTests/IntegrationTests/SpacesInBuildArgsOfTask.cs +++ b/project/UnitTests/IntegrationTests/SpacesInBuildArgsOfTask.cs @@ -8,7 +8,7 @@ namespace ThoughtWorks.CruiseControl.UnitTests.IntegrationTests [Category("Integration")] public class SpacesInBuildArgsOfTask { - [TestFixtureSetUp] + [OneTimeSetUp] public void fixLog4Net() { log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("test.config")); diff --git a/project/UnitTests/IntegrationTests/TaskTests.cs b/project/UnitTests/IntegrationTests/TaskTests.cs index ea01c6435..e176fd198 100644 --- a/project/UnitTests/IntegrationTests/TaskTests.cs +++ b/project/UnitTests/IntegrationTests/TaskTests.cs @@ -15,7 +15,7 @@ namespace ThoughtWorks.CruiseControl.UnitTests.IntegrationTests public class TaskTests { - [TestFixtureSetUp] + [OneTimeSetUp] public void fixLog4Net() { log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("test.config")); diff --git a/project/UnitTests/UnitTests.csproj b/project/UnitTests/UnitTests.csproj index 8ff94b7a1..bdfcbb183 100644 --- a/project/UnitTests/UnitTests.csproj +++ b/project/UnitTests/UnitTests.csproj @@ -151,7 +151,7 @@ NPlot ..\..\lib\NPlot.dll - + False ..\..\Tools\nunit\nunit.framework.dll diff --git a/project/UnitTests/Xsl/StylesheetTestFixture.cs b/project/UnitTests/Xsl/StylesheetTestFixture.cs index 57fe6cbcb..6d6239f2e 100644 --- a/project/UnitTests/Xsl/StylesheetTestFixture.cs +++ b/project/UnitTests/Xsl/StylesheetTestFixture.cs @@ -31,7 +31,7 @@ protected static string WrapInBuildResultsElement(string xml) return string.Format(@"{0}", xml); } - [TestFixtureSetUp] + [OneTimeSetUp] public void LoadStyleSheet() { transform = new XslCompiledTransform(true);