/// <summary>
 /// Creates a copy of the test instance actions.
 /// </summary>
 /// <returns>The new copy.</returns>
 public PatternTestInstanceActions Copy()
 {
     var copy = new PatternTestInstanceActions();
     copy.beforeTestInstanceChain.Action = beforeTestInstanceChain.Action;
     copy.initializeTestInstanceChain.Action = initializeTestInstanceChain.Action;
     copy.setUpTestInstanceChain.Action = setUpTestInstanceChain.Action;
     copy.executeTestInstanceChain.Action = executeTestInstanceChain.Action;
     copy.tearDownTestInstanceChain.Action = tearDownTestInstanceChain.Action;
     copy.disposeTestInstanceChain.Action = disposeTestInstanceChain.Action;
     copy.afterTestInstanceChain.Action = afterTestInstanceChain.Action;
     copy.decorateChildTestChain.Action = decorateChildTestChain.Action;
     copy.runTestInstanceBodyChain.Func = runTestInstanceBodyChain.Func;
     return copy;
 }
 public DecorateTestInstanceAction(PatternTestState testState, PatternTestInstanceActions decoratedTestInstanceActions)
 {
     this.testState = testState;
     this.decoratedTestInstanceActions = decoratedTestInstanceActions;
 }
        /// <summary>
        /// Creates an initial test instance state object.
        /// </summary>
        /// <param name="testStep">The test step used to execute the test instance.</param>
        /// <param name="testInstanceActions">The test instance actions.</param>
        /// <param name="testState">The test state.</param>
        /// <param name="bindingItem">The data item.</param>
        /// <param name="body">The body of the test instance.</param>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="testStep"/>,
        /// <paramref name="testInstanceActions"/> or <paramref name="testState"/> or <paramref name="bindingItem"/> is null.</exception>
        /// <exception cref="ArgumentException">Thrown if <paramref name="testState"/> belongs to a
        /// different test from the <paramref name="testStep"/>.</exception>
        internal PatternTestInstanceState(PatternTestStep testStep, 
            PatternTestInstanceActions testInstanceActions,
            PatternTestState testState, IDataItem bindingItem, TestAction body)
        {
            if (testStep == null)
                throw new ArgumentNullException("testStep");
            if (testInstanceActions == null)
                throw new ArgumentNullException("testInstanceActions");
            if (testState == null)
                throw new ArgumentNullException("testState");
            if (testStep.Test != testState.Test)
                throw new ArgumentException("The test state belongs to a different test from the test step.", "testState");
            if (bindingItem == null)
                throw new ArgumentNullException("bindingItem");
            if (body == null)
                throw new ArgumentNullException("body");

            this.testStep = testStep;
            this.testInstanceActions = testInstanceActions;
            this.testState = testState;
            this.bindingItem = bindingItem;
            this.body = body;

            testParameterValues = new Dictionary<PatternTestParameter, object>();
            slotValues = new Dictionary<ISlotInfo, object>();
            data = new UserDataCollection();
            nameBase = testStep.Name;
            nameSuffixes = string.Empty;
        }