public void ConstructorRegistersWithTheControl()
        {
            var control = PipelineTestHelper.TransactionControlMock();
            var sut     = new DeferredPipelineTransaction(control.Object);

            control.Verify(mock => mock.Register(It.Is <DeferredPipelineTransaction>(a => a == sut)), Times.Once);
        }
        public void InitialNodeHasTheInputAsOutput()
        {
            var stage = PipelineTestHelper.Assignable(PipelineSuspensionState.Resume);
            var sut   = new HierarchicalSuspenderNode(stage);

            Assert.AreSame(stage, sut.Output);
        }
        public void TransactionCannotBeUsedAfterBeingCommitted()
        {
            var control = PipelineTestHelper.TransactionControlMock();
            var sut     = new DeferredPipelineTransaction(control.Object);

            sut.Commit();

            Assert.Throws <InvalidOperationException>(() => sut.Update(1.AsPipelineConstant(), () => true));
            Assert.Throws <InvalidOperationException>(() => sut.Commit());
            Assert.Throws <InvalidOperationException>(() => sut.Cancel());
        }
        public void ControlIsCalledOnCommitWithTheExpectedStage()
        {
            var value   = PipelineTestHelper.Assignable(1);
            var control = PipelineTestHelper.TransactionControlMock();
            var sut     = new DeferredPipelineTransaction(control.Object)
                          .Update(value, 2);

            control.Setup(mock => mock.Commit(
                              It.IsAny <DeferredPipelineTransaction>(),
                              It.IsAny <IEnumerable <DeferredTransactionPart> >()))
            .Callback <DeferredPipelineTransaction, IEnumerable <DeferredTransactionPart> >((a, b) => Assert.IsTrue(a == sut && b.Count() == 1 && b.First().Stage == value));

            sut.Commit();
        }
        public void CreatingSuspenderStageFromHierarchyWillGetHierarchySuspensionState(PipelineSuspensionState state, bool expectInvalidation)
        {
            var hierarchy = new HierarchicalSuspenderNode(state.AsPipelineConstant());

            var input = PipelineTestHelper.Assignable(1);
            var sut   = hierarchy.WithSuspender(input);
            var test  = sut.AttachTestStage();

            input.SetValue(10);

            if (expectInvalidation)
            {
                test.AssertInvalidations(1);
            }
            else
            {
                test.AssertInvalidations(0);
            }
        }
        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);
        }
예제 #8
0
        public void ConcurrentTransactionsWhichCollideCausesTheLastOneToRollback(int[] totalOrder, int[] transaction1, int[] transaction2)
        {
            var stages = Enumerable.Repeat(1, totalOrder.Length).Select(_ => PipelineTestHelper.Assignable(1)).ToList();
            var tests  = stages.Select(stage => stage.AttachTestStage()).ToList();

            var control = new AggregatingTransactionControl();
            var t1      = control.CreateTransaction();
            var t2      = control.CreateTransaction();

            foreach (var i in totalOrder)
            {
                if (transaction1.Contains(i))
                {
                    t1.Update(stages[i], 2);
                }
                if (transaction2.Contains(i))
                {
                    t2.Update(stages[i], 2);
                }
            }

            AssertExpectedTransactionOutcome(t1, t2, stages, tests, transaction1, PipelineTransactionResult.PendingSuccess, PipelineTransactionResult.Failed);
        }
        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);
            }
        }