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); }
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); }
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); }