public void PipelineContext_Ctor_Internal_Null_ContextInfo_Creates()
 {
     Processor processor = new MockProcessor1();
     Pipeline pipeline = new Pipeline(new[] { processor }, Enumerable.Empty<ProcessorArgument>(), Enumerable.Empty<ProcessorArgument>());
     PipelineContext context = new PipelineContext(pipeline, null);
     Assert.IsNotNull(context.ContextInfo, "Null contextInfo to ctor should have created one");
 }
 public void PipelineContext_Ctor_Internal_Accepts_ContextInfo()
 {
     Processor processor = new MockProcessor1();
     Pipeline pipeline = new Pipeline(new[] { processor }, Enumerable.Empty<ProcessorArgument>(), Enumerable.Empty<ProcessorArgument>());
     PipelineContextInfo info = new PipelineContextInfo(pipeline);
     PipelineContext context = new PipelineContext(pipeline, info);
     Assert.AreSame(info, context.ContextInfo, "Ctor should have used the ContextInfo we passed int.");
 }
 public void PipelineContext_Ctor_Null_Pipeline_Throws()
 {
     PipelineContext context;
     ExceptionAssert.ThrowsArgumentNull(
         "A null pipeline argument to the PipelineContext ctor should throw",
         "pipeline",
         () => context = new PipelineContext(null)
         );
 }
        public void PipelineContext_Ctor_Internal_Reuses_Pipeline_ContextInfo()
        {
            Processor processor = new MockProcessor1();
            Pipeline pipeline = new Pipeline(new[] { processor }, Enumerable.Empty<ProcessorArgument>(), Enumerable.Empty<ProcessorArgument>());
            PipelineContext context1 = new PipelineContext(pipeline);
            Assert.IsNotNull(context1.ContextInfo, "ContextInfo should have been created");

            PipelineContext context2 = new PipelineContext(pipeline);
            Assert.AreSame(context1.ContextInfo, context2.ContextInfo, "Expected 2nd context to reuse same ContextInfo");
        }
        /// <summary>
        /// Virtual method called from <see cref="OnExecute"/> to set the pipeline 
        /// input values on the <see cref="PipelineContext"/>.
        /// </summary>
        /// <param name="context">The <see cref="PipelineContext"/> for the current execution of the pipeline.</param>
        /// <param name="inputs">The inputs provided to the pipeline for the current execution.</param>
        protected virtual void OnSetPipelineInputs(PipelineContext context, object[] inputs)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            context.SetProcessorOutputs(this.EntryProcessor, inputs);
        }
        /// <summary>
        /// Virtual method called from <see cref="OnExecute"/> to get the pipeline 
        /// output values from the <see cref="PipelineContext"/>.
        /// </summary>
        /// <param name="context">The <see cref="PipelineContext"/> for the current execution of the pipeline.</param>
        /// <returns>The outputs that the pipeline will return for the current execution.</returns>
        protected virtual object[] OnGetPipelineOutputs(PipelineContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            return context.ReadAllInputs(this.ExitProcessor);
        }
        /// <summary>
        /// Virtual method called to execute the <paramref name="context"/>'s currently active <see cref="Processor"/>.
        /// </summary>
        /// <param name="context">The <see cref="PipelineContext"/> managing execution state.</param>
        /// <returns>The <see cref="ProcessorResult"/> returned by that <see cref="Processor"/>.</returns>
        protected virtual ProcessorResult OnExecuteProcessor(PipelineContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            Processor currentProcessor = context.CurrentProcessor;

             // The entry processor has no inputs and its "outputs" were already
             // set via OnSetPipelineInputs, so we can bypass its execution.
             // The exit processor's inputs have already been set by all the other
             // processors' execution, and it has no outputs of its own, so it can
             // be bypassed as well.
             if (currentProcessor == this.EntryProcessor || currentProcessor == this.ExitProcessor)
             {
                 return new ProcessorResult();
             }

            object[] input = context.ReadAllInputs(currentProcessor);
            ProcessorResult result = currentProcessor.Execute(input);
            switch (result.Status)
            {
                case ProcessorStatus.Error:
                    break;

                case ProcessorStatus.Ok:
                    context.SetProcessorOutputs(currentProcessor, result.Output);
                    break;
            }

            return result;
        }
        public void PipelineContext_CurrentProcessor_Property()
        {
            Pipeline pipeline = TestPipelines.CreateMockProcessor1Pipeline();
            PipelineContext context = new PipelineContext(pipeline);

            Assert.IsNull(context.CurrentProcessor, "CurrentProcessor should be null before advance to first");

            Assert.IsTrue(context.AdvanceToNextProcessor(), "Failed to advance to first");
            Assert.AreSame(pipeline.Processors[0], context.CurrentProcessor, "First processor incorrect");

            Assert.IsTrue(context.AdvanceToNextProcessor(), "Failed to advance to second");
            Assert.AreSame(pipeline.Processors[1], context.CurrentProcessor, "Second processor incorrect");

            Assert.IsTrue(context.AdvanceToNextProcessor(), "Failed to advance to third");
            Assert.AreSame(pipeline.Processors[2], context.CurrentProcessor, "Third processor incorrect");

            Assert.IsFalse(context.AdvanceToNextProcessor(), "Moving off end should have returned false");
            Assert.IsNull(context.CurrentProcessor, "CurrentProcessor should be null after final advance");
        }
 public void PipelineContext_WriteInput_Throws_If_External_ProcessorArgument()
 {
     Processor processor = new MockProcessor1();
     MockPipeline pipeline = TestPipelines.CreateMockProcessor1Pipeline();
     PipelineContext context = new PipelineContext(pipeline);
     ExceptionAssert.Throws(
         typeof(ArgumentException),
         "PipelineContext should throw if processor argument belongs to different pipeline",
         () => context.WriteInput(processor.InArguments[0], new object()),
         "inArgument"
         );
 }
 public void PipelineContext_WriteInput_Throws_If_Null_ProcessorArgument()
 {
     MockPipeline pipeline = TestPipelines.CreateMockProcessor1Pipeline();
     PipelineContext context = new PipelineContext(pipeline);
     ExceptionAssert.ThrowsArgumentNull(
         "PipelineContext should throw if null processor argument specified",
         "inArgument",
         () => context.WriteInput(null, new object())
         );
 }
 public void PipelineContext_WriteInput_Throws_If_Containerless_ProcessorArgument()
 {
     MockPipeline pipeline = TestPipelines.CreateMockProcessor1Pipeline();
     PipelineContext context = new PipelineContext(pipeline);
     ExceptionAssert.Throws(
         typeof(ArgumentException),
         "PipelineContext should throw if processor argument belongs to no collection",
         () => context.WriteInput(new ProcessorArgument("foo", typeof(string)), new object()),
         "inArgument"
         );
 }
        public void PipelineContext_SetProcessorOutput_Fanout_2_Processors()
        {
            Pipeline pipeline = TestPipelines.CreateDoubleMockProcessor1Pipeline();
            PipelineContext context = new PipelineContext(pipeline);

            Assert.IsTrue(context.AdvanceToNextProcessor(), "Failed to advance to first");

            // Mimic entry processor producing its output of an intValue=5
            context.SetProcessorOutputs(context.CurrentProcessor, new object[] { 5 });

            // This should have been copied to the input slots for second processor
            Assert.IsTrue(context.AdvanceToNextProcessor(), "Failed to advance to second");
            object[] input = context.ReadAllInputs(context.CurrentProcessor);
            Assert.IsNotNull(input, "Input cannot be null");
            Assert.AreEqual(1, input.Length, "Expected 1 element in input");
            Assert.AreEqual(5, input[0], "Input should have contained a 5");

            // Mimic second processor setting its output to "aString1"
            context.SetProcessorOutputs(context.CurrentProcessor, new object[] { "aString1" });

            // Move to 3rd processor and ensure it got the same inputs as 2nd
            Assert.IsTrue(context.AdvanceToNextProcessor(), "Failed to advance to third");
            input = context.ReadAllInputs(context.CurrentProcessor);
            Assert.IsNotNull(input, "Input cannot be null");
            Assert.AreEqual(1, input.Length, "Expected 1 element in input");
            Assert.AreEqual(5, input[0], "Input should have contained a 5");

            // Mimic third processor setting its output to "aString2"
            context.SetProcessorOutputs(context.CurrentProcessor, new object[] { "aString2" });

            // This should have been copied to the input slots for final processor
            Assert.IsTrue(context.AdvanceToNextProcessor(), "Failed to advance to third");
            input = context.ReadAllInputs(context.CurrentProcessor);
            Assert.IsNotNull(input, "Input cannot be null");
            Assert.AreEqual(2, input.Length, "Expected 2 elements in input");
            Assert.AreEqual("aString1", input[0], "Input[0] should have contained this string");
            Assert.AreEqual("aString2", input[1], "Input[1] should have contained this string");
        }
        public void PipelineContext_SetProcessorOutput()
        {
            Pipeline pipeline = TestPipelines.CreateMockProcessor1Pipeline();
            PipelineContext context = new PipelineContext(pipeline);

            Assert.IsTrue(context.AdvanceToNextProcessor(), "Failed to advance to first");

            // Mimic entry processor producing its output of an intValue=5
            context.SetProcessorOutputs(context.CurrentProcessor, new object[] { 5 });

            // This should have been copied to the input slots for second processor
            Assert.IsTrue(context.AdvanceToNextProcessor(), "Failed to advance to second");
            object[] input = context.ReadAllInputs(context.CurrentProcessor);
            Assert.IsNotNull(input, "Input cannot be null");
            Assert.AreEqual(1, input.Length, "Expected 1 element in input");
            Assert.AreEqual(5, input[0], "Input should have contained a 5");

            // Mimic processor 1 producing an output of theResult="aString"
            context.SetProcessorOutputs(context.CurrentProcessor, new object[] { "aString" });

            // This should have been copied to the input slots for third processor
            Assert.IsTrue(context.AdvanceToNextProcessor(), "Failed to advance to third");
            input = context.ReadAllInputs(context.CurrentProcessor);
            Assert.IsNotNull(input, "Input cannot be null");
            Assert.AreEqual(1, input.Length, "Expected 1 element in input");
            Assert.AreEqual("aString", input[0], "Input should have contained this string");
        }
 public void PipelineContext_ReadAllInputs_Throws_If_Processor_Not_In_Pipeline()
 {
     Processor processor = new MockProcessor1();
     MockPipeline pipeline = TestPipelines.CreateMockProcessor1Pipeline();
     PipelineContext context = new PipelineContext(pipeline);
     ExceptionAssert.Throws(
         typeof(ArgumentException),
         "PipelineContext should throw if processor from different pipeline specified",
         () => context.ReadAllInputs(processor),
         "processor"
         );
 }
 public void PipelineContext_ReadAllInputs_Throws_If_Null_Processor()
 {
     MockPipeline pipeline = TestPipelines.CreateMockProcessor1Pipeline();
     PipelineContext context = new PipelineContext(pipeline);
     ExceptionAssert.ThrowsArgumentNull(
         "PipelineContext should throw if null processor specified",
         "processor",
         () => context.ReadAllInputs(null)
         );
 }