Пример #1
0
        private static void AssertExpectedTransactionOutcome(
            IPipelineTransaction t1,
            IPipelineTransaction t2,
            List <AssignablePipelineStage <int> > stages,
            List <TestPipelineStage <int> > tests,
            IEnumerable <int> transaction,
            PipelineTransactionResult expectedFirstResult,
            PipelineTransactionResult expectedSecondResult)
        {
            var stagesInTransaction = transaction.Select(i => stages[i]).ToList();
            var testsInTransaction  = transaction.Select(i => tests[i]).ToList();

            var nonTransactionIndices  = Enumerable.Range(0, stages.Count).Except(transaction).ToList();
            var stagesNotInTransaction = nonTransactionIndices.Select(i => stages[i]).ToList();
            var testsNotInTransaction  = nonTransactionIndices.Select(i => tests[i]).ToList();

            Assert.AreEqual(expectedFirstResult, t1.Commit());
            stages.ForEach(a => PipelineAssert.Value(a, 1));
            tests.ForEach(t => t.AssertNotInvalidatedNorRetrieved());

            Assert.AreEqual(expectedSecondResult, t2.Commit());
            stagesInTransaction.ForEach(a => PipelineAssert.Value(a, 2));
            testsInTransaction.ForEach(t => t.AssertInvalidations(1));

            stagesNotInTransaction.ForEach(a => PipelineAssert.Value(a, 1));
            testsNotInTransaction.ForEach(t => t.AssertNotInvalidatedNorRetrieved());
        }
        public void InvalidationPropagatesThroughEntireHierarchy(int size)
        {
            var inputs = Enumerable.Repeat(PipelineSuspensionState.Resume, size + 1).Select(r => PipelineTestHelper.Assignable(r)).ToList();

            var stages = new List <HierarchicalSuspenderNode> {
                new HierarchicalSuspenderNode(inputs[0])
            };

            for (int i = 0; i < size; ++i)
            {
                stages.Add(stages[i].CreateChild(inputs[i + 1], HierarchicalBehavior.WeakenSuspensionState));
            }

            var tests = stages.Select(s => s.Output.AttachTestStage()).ToList();

            for (int i = 0; i < size; ++i)
            {
                inputs[i].SetValue(PipelineSuspensionState.Suspend);
                foreach (var test in tests.Skip(i))
                {
                    test.AssertInvalidations(i + 1);
                }
                PipelineAssert.Value(stages.Last().Output, PipelineSuspensionState.Suspend);
            }
        }
        public void HierarchyPropagateSuspensionStateAsExpected(
            PipelineSuspensionState root,
            PipelineSuspensionState[] hierarchy,
            HierarchicalBehavior[] behaviors,
            PipelineSuspensionState expectedFinalState)
        {
            var parent    = new HierarchicalSuspenderNode(root.AsPipelineConstant());
            var lastStage = hierarchy.Zip(behaviors, (a, b) => (input: a, behavior: b)).Aggregate(parent, (acc, next) => acc.CreateChild(next.input.AsPipelineConstant(), next.behavior));

            PipelineAssert.Value(lastStage.Output, expectedFinalState);
        }
Пример #4
0
        public void MultipleUpdatesToSameStageCausesOnlyLastToBeUsed()
        {
            var value = Assignable(1);
            var test  = value.AttachTestStage();

            new PipelineTransaction()
            .Update(value, 2)
            .Update(value, 3)
            .Update(value, 4)
            .Commit();

            PipelineAssert.Value(value, 4);
            test.AssertInvalidations(1);
        }
Пример #5
0
        public void CanceledTransactionDoesNotInvokeAnyOfTheUpdates()
        {
            var value = Assignable(1);
            var other = Assignable("hello");

            var test1 = value.AttachTestStage();
            var test2 = other.AttachTestStage();

            var sut = new PipelineTransaction()
                      .Update(value, 2)
                      .Update(other, "hello 2");

            sut.Cancel();

            test1.AssertNotInvalidatedNorRetrieved();
            test2.AssertNotInvalidatedNorRetrieved();
            PipelineAssert.Value(value, 1);
            PipelineAssert.Value(other, "hello");
        }
        public void CanceledTransactionDoesNotInvokeAnyOfTheUpdates()
        {
            var value = PipelineTestHelper.Assignable(1);
            var other = PipelineTestHelper.Assignable("hello");

            var test1 = value.AttachTestStage();
            var test2 = other.AttachTestStage();

            var control = PipelineTestHelper.TransactionControlMock();
            var sut     = new DeferredPipelineTransaction(control.Object)
                          .Update(value, 2)
                          .Update(other, "hello 2");

            sut.Cancel();

            test1.AssertNotInvalidatedNorRetrieved();
            test2.AssertNotInvalidatedNorRetrieved();
            PipelineAssert.Value(value, 1);
            PipelineAssert.Value(other, "hello");
        }
        public void TransactionDoesNothingBeforeCommit()
        {
            var value   = PipelineTestHelper.Assignable(1);
            var test    = value.AttachTestStage();
            var control = PipelineTestHelper.TransactionControlMock();

            control.Setup(mock => mock.Commit(It.IsAny <DeferredPipelineTransaction>(), It.IsAny <IEnumerable <DeferredTransactionPart> >()))
            .Callback(new Action <DeferredPipelineTransaction, IEnumerable <DeferredTransactionPart> >((a, b) => { var c = new AggregatingTransactionControl(); c.Register(a); c.Commit(a, b); }));

            var sut = new DeferredPipelineTransaction(control.Object)
                      .Update(value, 2);

            control.Verify(mock => mock.Commit(It.IsAny <DeferredPipelineTransaction>(), It.IsAny <IEnumerable <DeferredTransactionPart> >()), Times.Never);
            PipelineAssert.Value(value, 1);
            test.AssertNotInvalidatedNorRetrieved();

            sut.Commit();
            control.Verify(mock => mock.Commit(It.IsAny <DeferredPipelineTransaction>(), It.IsAny <IEnumerable <DeferredTransactionPart> >()), Times.Once);
            PipelineAssert.Value(value, 2);
            test.AssertInvalidations(1);
        }