Esempio n. 1
0
            public ParallelPipeline Build()
            {
                var stages = CoffmanGrahamOrderer.DivideIntoStages(this.SystemSpecs);

                var pipelineStages = new List <PipelineStage>();

                for (var i = 0; i < stages.Count; i++)
                {
                    var systemBindings = new List <ISystemBinding>();
                    var stage          = stages[i];
                    for (var j = 0; j < stage.Count; j++)
                    {
                        var systemSpec = stage[j];
                        var system     = (ISystem)this.ResolveDelegate(systemSpec.SystemType);
                        systemBindings.Add(system.Bind(this.ContainerStore));
                    }

                    pipelineStages.Add(new PipelineStage(systemBindings));
                }

                var text = new StringBuilder();

                text.AppendLine("Parallel Pipeline:");
                PrintPipeline(text, pipelineStages);

                this.Logger.Information(text.ToString());

                return(new ParallelPipeline(pipelineStages));
            }
Esempio n. 2
0
        public void ParallelSystemSpecs()
        {
            var specA = Spec().Produces("Product", "New");
            var specB = Spec().Requires("Product", "New")
                        .Parallel();
            var specC = Spec().Requires("Product", "New")
                        .Parallel();
            var specD = Spec().Requires("Product", "New")
                        .Parallel();

            var specs = new List <SystemSpec>()
            {
                specD, specC, specB, specA
            };

            specs.Shuffle();

            var ordered = CoffmanGrahamOrderer.Order(specs);
            var stages  = CoffmanGrahamOrderer.DivideIntoStages(ordered);

            Assert.That(stages.Count, Is.EqualTo(2));

            Assert.That(stages[0].Count, Is.EqualTo(1));
            Assert.That(stages[0][0], Is.EqualTo(specA));

            Assert.That(stages[1].Count, Is.EqualTo(3));
        }
Esempio n. 3
0
        public void SequentialSystemSpecs()
        {
            var specA = Spec().Produces("Product", "New");
            var specB = Spec().Requires("Product", "New")
                        .Produces("Product", "Improved")
                        .InSequence();

            var specC = Spec().Requires("Product", "New")
                        .Requires("Product", "Improved")
                        .InSequence();


            var specs = new List <SystemSpec>()
            {
                specC, specB, specA
            };

            specs.Shuffle();

            var ordered = CoffmanGrahamOrderer.Order(specs);

            Assert.That(ordered[0], Is.EqualTo(specA));
            Assert.That(ordered[1], Is.EqualTo(specB));
            Assert.That(ordered[2], Is.EqualTo(specC));

            var stages = CoffmanGrahamOrderer.DivideIntoStages(ordered);

            Assert.That(stages.Count, Is.EqualTo(3));
        }
Esempio n. 4
0
        public void MixedSystemSpecs()
        {
            var specA = Spec().Produces("Product", "New");

            var specB = Spec().Requires("Product", "New")
                        .Produces("Parallel", "1")
                        .Parallel();

            var specC = Spec().Requires("Product", "New")
                        .Produces("Sequential", "1")
                        .InSequence();

            var specD = Spec().Requires("Product", "New")
                        .Produces("Parallel", "2")
                        .Parallel();

            var specE = Spec().Requires("Product", "New")
                        .Produces("Sequential", "2")
                        .InSequence();

            var specF = Spec().Requires("Sequential", "1")
                        .Requires("Parallel", "1")
                        .Requires("Parallel", "2")
                        .Parallel();

            var specs = new List <SystemSpec>()
            {
                specF, specE, specD, specC, specB, specA
            };

            specs.Shuffle();

            var ordered = CoffmanGrahamOrderer.Order(specs);
            var stages  = CoffmanGrahamOrderer.DivideIntoStages(ordered);

            Assert.That(stages.Count, Is.EqualTo(4));

            Assert.That(stages[0].Count, Is.EqualTo(1));
            Assert.That(stages[0][0], Is.EqualTo(specA));

            Assert.That(stages[1].Count, Is.EqualTo(2));
            Assert.That(stages[1].All(s => s.AllowParallelism), Is.EqualTo(true));

            Assert.That(stages[2].Count, Is.EqualTo(2));
            Assert.That(stages[2].All(s => s.AllowParallelism), Is.EqualTo(false));

            Assert.That(stages[3].Count, Is.EqualTo(1));
            Assert.That(stages[3][0], Is.EqualTo(specF));
        }