public void TestTransactionDiscardPurgeAll() { var stack = TransactionStackFactory.Create(5); var raiseCount = 0; var expectedRaiseCount = 0; var transactions = new ITransaction[5]; stack.TransactionDiscarded += (sender, e) => { Assert.Equal(expectedRaiseCount, ++raiseCount); Assert.Equal(DiscardReason.StackPurged, e.Reason); Assert.Equal(5, e.Transactions.Count); for (int i = 0; i < 5; ++i) { Assert.NotNull(e.Transactions[i]); Assert.Equal((object)transactions[i], e.Transactions[i]); Assert.True(((Operation)e.Transactions[i]).IsFrozen); } ++expectedRaiseCount; }; for (var j = 0; j < stack.Capacity; ++j) { using (var transaction = stack.CreateTransaction()) { for (var i = 0; i < 3; ++i) { var operation = new SimpleOperation(); stack.PushOperation(operation); } transactions[j] = transaction; } } for (var j = 0; j < stack.Capacity; ++j) { stack.Rollback(); } stack.TransactionCompleted += (sender, e) => Assert.Equal(expectedRaiseCount, ++raiseCount); using (stack.CreateTransaction()) { for (var i = 0; i < 3; ++i) { var operation = new SimpleOperation(); stack.PushOperation(operation); expectedRaiseCount = 1; } } Assert.Equal(2, expectedRaiseCount); Assert.Equal(2, raiseCount); Assert.Equal(5, stack.Capacity); }
public void TestSingleOperationTransaction() { var stack = TransactionStackFactory.Create(5); SimpleOperation operation; using (stack.CreateTransaction()) { operation = new SimpleOperation(); stack.PushOperation(new SimpleOperation()); } Assert.False(stack.IsEmpty); Assert.True(stack.CanRollback); Assert.False(stack.CanRollforward); Assert.True(operation.IsDone); Assert.Equal(0, operation.RollbackCount); Assert.Equal(0, operation.RollforwardCount); }
public void TestInterleavedTransactionThrows() { var stack = (TransactionStack)TransactionStackFactory.Create(5); SimpleOperation operation; // Root transaction var transaction1 = stack.CreateTransaction(); operation = new SimpleOperation(); stack.PushOperation(operation); // Nested transaction stack.CreateTransaction(); operation = new SimpleOperation(); stack.PushOperation(operation); // Complete root transaction Assert.Throws <TransactionException>(() => transaction1.Complete()); }
public void TestSingleOperationTransactionRollforward() { var stack = TransactionStackFactory.Create(5); SimpleOperation operation; using (stack.CreateTransaction()) { operation = new SimpleOperation(); stack.PushOperation(operation); } stack.Rollback(); // Above code must be similar to TestSingleOperationTransactionRollback stack.Rollforward(); Assert.False(stack.IsEmpty); Assert.True(stack.CanRollback); Assert.False(stack.CanRollforward); Assert.True(operation.IsDone); Assert.Equal(1, operation.RollbackCount); Assert.Equal(1, operation.RollforwardCount); }
public void TestDiscardStackFull() { var stack = TransactionStackFactory.Create(5); var operations = new SimpleOperation[6]; for (var i = 0; i < operations.Length; ++i) { using (stack.CreateTransaction()) { operations[i] = new SimpleOperation(); stack.PushOperation(operations[i]); } } Assert.True(operations[0].IsFrozen); for (var i = 1; i < operations.Length; ++i) { Assert.False(operations[i].IsFrozen); Assert.Equal(operations[i], ((TransactionStack)stack).Transactions[i - 1].Operations[0]); } }
public void TestTransactionCompleted() { var stack = TransactionStackFactory.Create(5); var raiseCount = 0; var expectedRaiseCount = 0; stack.TransactionCompleted += (sender, e) => Assert.Equal(expectedRaiseCount, ++raiseCount); for (var j = 0; j < 8; ++j) { using (stack.CreateTransaction()) { for (var i = 0; i < 5; ++i) { var operation = new SimpleOperation(); stack.PushOperation(operation); } ++expectedRaiseCount; } } Assert.Equal(8, expectedRaiseCount); Assert.Equal(8, raiseCount); }
public void TestClear() { var stack = TransactionStackFactory.Create(5); var operations = new SimpleOperation[4]; for (var i = 0; i < operations.Length; ++i) { using (stack.CreateTransaction()) { operations[i] = new SimpleOperation(); stack.PushOperation(operations[i]); } } stack.Clear(); Assert.False(stack.CanRollback); Assert.False(stack.CanRollforward); Assert.Equal(5, stack.Capacity); Assert.True(stack.IsEmpty); Assert.False(stack.IsFull); foreach (var operation in operations) { Assert.True(operation.IsFrozen); } }