public void Should_be_able_to_register_basic_and_raise_event()
        {
            var pipeline = CorePipeline.Create(c => c
                                               .Name("TestPipeline")
                                               .UseData(new PipelineData())
                                               .Stages()
                                               .RegisterStage("Stage 1")
                                               .ForEvent(new OnParseEvent {
                Text = "Please parse me"
            })
                                               .Observers()
                                               .RegisterObserver <ParserObserver>()
                                               .RegisterObserver <DebugObserver>());

            var debugObserver = (DebugObserver)(pipeline.Configuration as IPipelineConfigAccess).Observers[1];

            debugObserver.OnDebugEvent += e =>
            {
                Assert.AreEqual(e.GetType(), typeof(OnParseEvent));
                Assert.AreEqual(((OnParseEvent)e).Text, "Please parse me");
            };

            pipeline.Run();

            Assert.AreEqual(pipeline.Name, "TestPipeline");
        }
        public void Should_be_able_to_connect_pipelines()
        {
            var pipelineA = CorePipeline.Create(c => c
                                                .Name("Pipeline A")
                                                .AutoRaiseEvents(false)
                                                .Stages()
                                                .RegisterStage("Stage 1")
                                                .ForEvent <OnParseEvent>());

            var observer = new ReverseParserObserver();

            var pipelineB = CorePipeline.Create(c => c
                                                .Name("Pipeline B")
                                                .Observers()
                                                .RegisterObserver(observer));

            pipelineA.Connect(pipelineB)
            .ForStages("Stage 1")
            .ForEvent <OnParseEvent>();

            pipelineA.RunAsync();
            pipelineA.RaiseEvent <OnParseEvent>("Stage 1");

            while (pipelineA.State == PipelineState.Running)
            {
                Thread.Sleep(1000);

                Assert.True(observer.IsSyncParseCompleted, "The second sync event was not observed after async event.");
                pipelineA.Abort();
            }
        }
        public void Should_be_able_to_register_basic_and_raise_async_event()
        {
            // expected fist event to fire async, and immediate the next one
            // a 1sec wait is put in async to see if 2nd event is raised, async will be on its own thread

            var observer = new ParserObserver();


            var pipeline = CorePipeline.Create(c => c
                                               .Name("TestPipeline")
                                               .UseData(new PipelineData())
                                               .Stages()
                                               .RegisterStage("Stage 1")
                                               .ForEvent(new OnParseAsyncEvent {
                Text = "Please parse me async"
            })
                                               .ForEvent(new OnParseEvent {
                Text = "Please parse me"
            })
                                               .Observers()
                                               .RegisterObserver(observer)
                                               .RegisterObserver <DebugObserver>());

            pipeline.RunAsync();


            while (pipeline.State == PipelineState.Running)
            {
                Thread.Sleep(1000);
                if (observer.IsAsyncParseReceived && !observer.IsAsyncParseCompleted)
                {
                    Assert.True(observer.IsSyncParseCompleted, "The second sync event was not observed after async event.");
                    pipeline.Abort();
                }
            }
        }
        public void Should_be_able_to_connect_pipelines_for_one_stage()
        {
            var pipelineA = CorePipeline.Create(c => c
                                                .Name("Pipeline A")
                                                .AutoRaiseEvents(true)
                                                .Stages()
                                                .RegisterStage("Stage 1")
                                                .ForEvent <OnParseEvent>()
                                                .RegisterStage("Stage 2")
                                                .ForEvent <OnSomeEvent>());

            var observer = new ReverseParserObserver();

            var pipelineB = CorePipeline.Create(c => c
                                                .Name("Pipeline B")
                                                .Observers()
                                                .RegisterObserver(observer));

            pipelineA.Connect(pipelineB)
            .ForStages("Stage 2")
            .ForEvent <OnSomeEvent>();

            pipelineA.Run();
        }