Author: sclassen
Date: Mon Jun  2 15:01:16 2014
New Revision: 1599234

URL: http://svn.apache.org/r1599234
Log:
onami-persist: code cleanup of NestedTransactionTest

Modified:
    
onami/trunk/persist/src/test/java/org/apache/onami/persist/test/transaction/NestedTransactionTest.java

Modified: 
onami/trunk/persist/src/test/java/org/apache/onami/persist/test/transaction/NestedTransactionTest.java
URL: 
http://svn.apache.org/viewvc/onami/trunk/persist/src/test/java/org/apache/onami/persist/test/transaction/NestedTransactionTest.java?rev=1599234&r1=1599233&r2=1599234&view=diff
==============================================================================
--- 
onami/trunk/persist/src/test/java/org/apache/onami/persist/test/transaction/NestedTransactionTest.java
 (original)
+++ 
onami/trunk/persist/src/test/java/org/apache/onami/persist/test/transaction/NestedTransactionTest.java
 Mon Jun  2 15:01:16 2014
@@ -39,12 +39,20 @@ import org.apache.onami.persist.test.tra
 import 
org.apache.onami.persist.test.transaction.testframework.tasks.TaskRollingBackOnTestExceptionThrowingTestException;
 import org.junit.Test;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
 
 /**
  * Tests running nested transactions.
- * The test make us of the testframework.
- * Since the test is running a loop only the injector is created directly in 
the test to ensure
+ * The test makes use of the test framework.
+ * Since the test is running a loop the injector is created directly in the 
test to ensure
  * that for every {@link TestVector} a new injector instance is used.
  */
 public class NestedTransactionTest
@@ -54,294 +62,189 @@ public class NestedTransactionTest
      * All possible combination of {@link 
org.apache.onami.persist.test.transaction.testframework.TransactionalTask}s
      * and if they should have been rolled back.
      */
-    private static final TestVector[] TEST_VECTORS =
-        { new TestVector( TaskRollingBackOnAnyThrowingNone.class, 
TaskRollingBackOnAnyThrowingNone.class, false ),
-            new TestVector( TaskRollingBackOnAnyThrowingNone.class,
-                            
TaskRollingBackOnAnyThrowingRuntimeTestException.class, true ),
-            new TestVector( TaskRollingBackOnAnyThrowingNone.class, 
TaskRollingBackOnAnyThrowingTestException.class,
-                            true ),
-            new TestVector( TaskRollingBackOnAnyThrowingNone.class, 
TaskRollingBackOnNoneThrowingNone.class, false ),
-            new TestVector( TaskRollingBackOnAnyThrowingNone.class,
-                            
TaskRollingBackOnNoneThrowingRuntimeTestException.class, true ),
-            new TestVector( TaskRollingBackOnAnyThrowingNone.class, 
TaskRollingBackOnNoneThrowingTestException.class,
-                            true ), new TestVector( 
TaskRollingBackOnAnyThrowingNone.class,
-                                                    
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class, false ),
-            new TestVector( TaskRollingBackOnAnyThrowingNone.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( TaskRollingBackOnAnyThrowingNone.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class, true ),
-            new TestVector( TaskRollingBackOnAnyThrowingNone.class, 
TaskRollingBackOnTestExceptionThrowingNone.class,
-                            false ), new TestVector( 
TaskRollingBackOnAnyThrowingNone.class,
-                                                     
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class,
-                                                     true ), new TestVector( 
TaskRollingBackOnAnyThrowingNone.class,
-                                                                             
TaskRollingBackOnTestExceptionThrowingTestException.class,
-                                                                             
true ),
-
-            new TestVector( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class,
-                            TaskRollingBackOnAnyThrowingNone.class, true ),
-            new TestVector( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnAnyThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class,
-                            TaskRollingBackOnAnyThrowingTestException.class, 
true ),
-            new TestVector( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class,
-                            TaskRollingBackOnNoneThrowingNone.class, true ),
-            new TestVector( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnNoneThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class,
-                            TaskRollingBackOnNoneThrowingTestException.class, 
true ),
-            new TestVector( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class, true ),
-            new TestVector( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class,
-                            TaskRollingBackOnTestExceptionThrowingNone.class, 
true ),
-            new TestVector( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingTestException.class, true ),
-
-            new TestVector( TaskRollingBackOnAnyThrowingTestException.class, 
TaskRollingBackOnAnyThrowingNone.class,
-                            true ), new TestVector( 
TaskRollingBackOnAnyThrowingTestException.class,
-                                                    
TaskRollingBackOnAnyThrowingRuntimeTestException.class, true ),
-            new TestVector( TaskRollingBackOnAnyThrowingTestException.class,
-                            TaskRollingBackOnAnyThrowingTestException.class, 
true ),
-            new TestVector( TaskRollingBackOnAnyThrowingTestException.class, 
TaskRollingBackOnNoneThrowingNone.class,
-                            true ), new TestVector( 
TaskRollingBackOnAnyThrowingTestException.class,
-                                                    
TaskRollingBackOnNoneThrowingRuntimeTestException.class, true ),
-            new TestVector( TaskRollingBackOnAnyThrowingTestException.class,
-                            TaskRollingBackOnNoneThrowingTestException.class, 
true ),
-            new TestVector( TaskRollingBackOnAnyThrowingTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class, true ),
-            new TestVector( TaskRollingBackOnAnyThrowingTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( TaskRollingBackOnAnyThrowingTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class, true ),
-            new TestVector( TaskRollingBackOnAnyThrowingTestException.class,
-                            TaskRollingBackOnTestExceptionThrowingNone.class, 
true ),
-            new TestVector( TaskRollingBackOnAnyThrowingTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( TaskRollingBackOnAnyThrowingTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingTestException.class, true ),
-
-            new TestVector( TaskRollingBackOnNoneThrowingNone.class, 
TaskRollingBackOnAnyThrowingNone.class, false ),
-            new TestVector( TaskRollingBackOnNoneThrowingNone.class,
-                            
TaskRollingBackOnAnyThrowingRuntimeTestException.class, true ),
-            new TestVector( TaskRollingBackOnNoneThrowingNone.class, 
TaskRollingBackOnAnyThrowingTestException.class,
-                            true ),
-            new TestVector( TaskRollingBackOnNoneThrowingNone.class, 
TaskRollingBackOnNoneThrowingNone.class, false ),
-            new TestVector( TaskRollingBackOnNoneThrowingNone.class,
-                            
TaskRollingBackOnNoneThrowingRuntimeTestException.class, false ),
-            new TestVector( TaskRollingBackOnNoneThrowingNone.class, 
TaskRollingBackOnNoneThrowingTestException.class,
-                            false ), new TestVector( 
TaskRollingBackOnNoneThrowingNone.class,
-                                                     
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class, false ),
-            new TestVector( TaskRollingBackOnNoneThrowingNone.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( TaskRollingBackOnNoneThrowingNone.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class, false ),
-            new TestVector( TaskRollingBackOnNoneThrowingNone.class, 
TaskRollingBackOnTestExceptionThrowingNone.class,
-                            false ), new TestVector( 
TaskRollingBackOnNoneThrowingNone.class,
-                                                     
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class,
-                                                     false ), new TestVector( 
TaskRollingBackOnNoneThrowingNone.class,
-                                                                              
TaskRollingBackOnTestExceptionThrowingTestException.class,
-                                                                              
true ),
-
-            new TestVector( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class,
-                            TaskRollingBackOnAnyThrowingNone.class, false ),
-            new TestVector( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnAnyThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class,
-                            TaskRollingBackOnAnyThrowingTestException.class, 
true ),
-            new TestVector( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class,
-                            TaskRollingBackOnNoneThrowingNone.class, false ),
-            new TestVector( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnNoneThrowingRuntimeTestException.class, false ),
-            new TestVector( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class,
-                            TaskRollingBackOnNoneThrowingTestException.class, 
false ),
-            new TestVector( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class, false ),
-            new TestVector( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class, false ),
-            new TestVector( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class,
-                            TaskRollingBackOnTestExceptionThrowingNone.class, 
false ),
-            new TestVector( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class, false ),
-            new TestVector( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingTestException.class, true ),
-
-            new TestVector( TaskRollingBackOnNoneThrowingTestException.class, 
TaskRollingBackOnAnyThrowingNone.class,
-                            false ), new TestVector( 
TaskRollingBackOnNoneThrowingTestException.class,
-                                                     
TaskRollingBackOnAnyThrowingRuntimeTestException.class, true ),
-            new TestVector( TaskRollingBackOnNoneThrowingTestException.class,
-                            TaskRollingBackOnAnyThrowingTestException.class, 
true ),
-            new TestVector( TaskRollingBackOnNoneThrowingTestException.class, 
TaskRollingBackOnNoneThrowingNone.class,
-                            false ), new TestVector( 
TaskRollingBackOnNoneThrowingTestException.class,
-                                                     
TaskRollingBackOnNoneThrowingRuntimeTestException.class, false ),
-            new TestVector( TaskRollingBackOnNoneThrowingTestException.class,
-                            TaskRollingBackOnNoneThrowingTestException.class, 
false ),
-            new TestVector( TaskRollingBackOnNoneThrowingTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class, false ),
-            new TestVector( TaskRollingBackOnNoneThrowingTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( TaskRollingBackOnNoneThrowingTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class, false ),
-            new TestVector( TaskRollingBackOnNoneThrowingTestException.class,
-                            TaskRollingBackOnTestExceptionThrowingNone.class, 
false ),
-            new TestVector( TaskRollingBackOnNoneThrowingTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class, false ),
-            new TestVector( TaskRollingBackOnNoneThrowingTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingTestException.class, true ),
-
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class,
-                            TaskRollingBackOnAnyThrowingNone.class, false ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class,
-                            
TaskRollingBackOnAnyThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class,
-                            TaskRollingBackOnAnyThrowingTestException.class, 
true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class,
-                            TaskRollingBackOnNoneThrowingNone.class, false ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class,
-                            
TaskRollingBackOnNoneThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class,
-                            TaskRollingBackOnNoneThrowingTestException.class, 
false ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class, false ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class, false ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class,
-                            TaskRollingBackOnTestExceptionThrowingNone.class, 
false ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class,
-                            
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class,
-                            
TaskRollingBackOnTestExceptionThrowingTestException.class, true ),
-
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class,
-                            TaskRollingBackOnAnyThrowingNone.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnAnyThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class,
-                            TaskRollingBackOnAnyThrowingTestException.class, 
true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class,
-                            TaskRollingBackOnNoneThrowingNone.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnNoneThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class,
-                            TaskRollingBackOnNoneThrowingTestException.class, 
false ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class, false ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class,
-                            TaskRollingBackOnTestExceptionThrowingNone.class, 
true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingTestException.class, true ),
-
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class,
-                            TaskRollingBackOnAnyThrowingNone.class, false ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class,
-                            
TaskRollingBackOnAnyThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class,
-                            TaskRollingBackOnAnyThrowingTestException.class, 
true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class,
-                            TaskRollingBackOnNoneThrowingNone.class, false ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class,
-                            
TaskRollingBackOnNoneThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class,
-                            TaskRollingBackOnNoneThrowingTestException.class, 
false ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class, false ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class, false ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class,
-                            TaskRollingBackOnTestExceptionThrowingNone.class, 
false ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingTestException.class, true ),
-
-            new TestVector( TaskRollingBackOnTestExceptionThrowingNone.class, 
TaskRollingBackOnAnyThrowingNone.class,
-                            false ), new TestVector( 
TaskRollingBackOnTestExceptionThrowingNone.class,
-                                                     
TaskRollingBackOnAnyThrowingRuntimeTestException.class, true ),
-            new TestVector( TaskRollingBackOnTestExceptionThrowingNone.class,
-                            TaskRollingBackOnAnyThrowingTestException.class, 
true ),
-            new TestVector( TaskRollingBackOnTestExceptionThrowingNone.class, 
TaskRollingBackOnNoneThrowingNone.class,
-                            false ), new TestVector( 
TaskRollingBackOnTestExceptionThrowingNone.class,
-                                                     
TaskRollingBackOnNoneThrowingRuntimeTestException.class, false ),
-            new TestVector( TaskRollingBackOnTestExceptionThrowingNone.class,
-                            TaskRollingBackOnNoneThrowingTestException.class, 
true ),
-            new TestVector( TaskRollingBackOnTestExceptionThrowingNone.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class, false ),
-            new TestVector( TaskRollingBackOnTestExceptionThrowingNone.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( TaskRollingBackOnTestExceptionThrowingNone.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class, true ),
-            new TestVector( TaskRollingBackOnTestExceptionThrowingNone.class,
-                            TaskRollingBackOnTestExceptionThrowingNone.class, 
false ),
-            new TestVector( TaskRollingBackOnTestExceptionThrowingNone.class,
-                            
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class, false ),
-            new TestVector( TaskRollingBackOnTestExceptionThrowingNone.class,
-                            
TaskRollingBackOnTestExceptionThrowingTestException.class, true ),
-
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class,
-                            TaskRollingBackOnAnyThrowingNone.class, false ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnAnyThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class,
-                            TaskRollingBackOnAnyThrowingTestException.class, 
true ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class,
-                            TaskRollingBackOnNoneThrowingNone.class, false ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnNoneThrowingRuntimeTestException.class, false ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class,
-                            TaskRollingBackOnNoneThrowingTestException.class, 
true ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class, false ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class,
-                            TaskRollingBackOnTestExceptionThrowingNone.class, 
false ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class, false ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingTestException.class, true ),
-
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingTestException.class,
-                            TaskRollingBackOnAnyThrowingNone.class, true ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingTestException.class,
-                            
TaskRollingBackOnAnyThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingTestException.class,
-                            TaskRollingBackOnAnyThrowingTestException.class, 
true ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingTestException.class,
-                            TaskRollingBackOnNoneThrowingNone.class, true ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingTestException.class,
-                            
TaskRollingBackOnNoneThrowingRuntimeTestException.class, false ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingTestException.class,
-                            TaskRollingBackOnNoneThrowingTestException.class, 
true ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class, true ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingTestException.class,
-                            
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class, true ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingTestException.class,
-                            TaskRollingBackOnTestExceptionThrowingNone.class, 
true ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class, false ),
-            new TestVector( 
TaskRollingBackOnTestExceptionThrowingTestException.class,
-                            
TaskRollingBackOnTestExceptionThrowingTestException.class, true ), };
+    private static final Collection<TestVector> TEST_VECTORS = 
buildTestVectors(
+        whenFirstTaskIs( TaskRollingBackOnAnyThrowingNone.class ) //           
                                       //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class )//
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingTestException.class ), //
+
+        whenFirstTaskIs( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class ) //                     
             //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class )//
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingTestException.class ), //
+
+        whenFirstTaskIs( TaskRollingBackOnAnyThrowingTestException.class ) //  
                                       //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class )//
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingTestException.class ), //
+
+        whenFirstTaskIs( TaskRollingBackOnNoneThrowingNone.class ) //          
                                       //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingNone.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class )//
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingNone.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingTestException.class ), //
+
+        whenFirstTaskIs( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class ) //                    
             //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingNone.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class )//
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingNone.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingTestException.class ), //
+
+        whenFirstTaskIs( TaskRollingBackOnNoneThrowingTestException.class ) // 
                                       //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingNone.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class )//
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingNone.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingTestException.class ), //
+
+        whenFirstTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class ) //                    
             //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class )//
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingTestException.class ), //
+
+        whenFirstTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class ) //    
             //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class )//
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingTestException.class ), //
+
+        whenFirstTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class ) //           
             //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class )//
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingTestException.class ), //
+
+        whenFirstTaskIs( TaskRollingBackOnTestExceptionThrowingNone.class ) // 
                                       //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingNone.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class )//
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingNone.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingTestException.class ), //
+
+        whenFirstTaskIs( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class ) //           
             //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingNone.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class )//
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingNone.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingTestException.class ), //
+
+        whenFirstTaskIs( 
TaskRollingBackOnTestExceptionThrowingTestException.class ) //                  
             //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnAnyThrowingTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingNone.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnNoneThrowingTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingNone.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingRuntimeTestException.class )//
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnRuntimeTestExceptionThrowingTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingNone.class ) //
+            .expectCommitWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingRuntimeTestException.class ) //
+            .expectRollbackWhenSecondTaskIs( 
TaskRollingBackOnTestExceptionThrowingTestException.class ) //
+    );
+
+
+    /**
+     * Test which ensures that all combinations of tasks are present.
+     */
+    @Test
+    public void testVectorShouldContainAllCombinations()
+    {
+        Set<TestVector> s = new HashSet<TestVector>();
+
+        s.addAll( TEST_VECTORS );
+
+        assertThat( s.size(), is( 12 * 12 ) );
+    }
 
     /**
      * Test which iterates over ALL possible combinations of inner and outer 
tasks.
@@ -376,23 +279,7 @@ public class NestedTransactionTest
         persistService.start();
         try
         {
-            // given
-            final TransactionalWorker worker = injector.getInstance( 
TransactionalWorker.class );
-            worker.scheduleTask( testVector.getOuterTask() );
-            worker.scheduleTask( testVector.getInnerTask() );
-
-            // when
-            worker.doTasks();
-
-            // then
-            if ( testVector.shouldRollBack() )
-            {
-                worker.assertNoEntityHasBeenPersisted();
-            }
-            else
-            {
-                worker.assertAllEntitiesHaveBeenPersisted();
-            }
+            doTestNestedTransaction( testVector, injector.getInstance( 
TransactionalWorker.class ) );
         }
         finally
         {
@@ -413,36 +300,139 @@ public class NestedTransactionTest
         };
     }
 
-    private static class TestVector
+    private void doTestNestedTransaction( TestVector testVector, 
TransactionalWorker worker )
+    {
+        // given
+        testVector.scheduleOuterTaskOn( worker );
+        testVector.scheduleInnerTaskOn( worker );
+
+        // when
+        worker.doTasks();
+
+        // then
+        testVector.assertExpectedOutcomeFor( worker );
+    }
+
+
+    private static Collection<TestVector> buildTestVectors( 
TestVectorsBuilder... factories )
+    {
+        final List<TestVector> result = new ArrayList<TestVector>();
+        for ( TestVectorsBuilder factory : factories )
+        {
+            result.addAll( factory.buildTestVectors() );
+        }
+        return result;
+    }
+
+    private static TestVectorsBuilder whenFirstTaskIs( Class<? extends 
TransactionalTask> firstTask )
+    {
+        return new TestVectorsBuilder( firstTask );
+    }
+
+    private abstract static class TestVector
     {
         private final Class<? extends TransactionalTask> outerTask;
 
         private final Class<? extends TransactionalTask> innerTask;
 
-        private final boolean shouldRollBack;
-
-        public TestVector( Class<? extends TransactionalTask> outerTask, 
Class<? extends TransactionalTask> innerTask,
-                           boolean shouldRollBack )
+        public TestVector( Class<? extends TransactionalTask> outerTask, 
Class<? extends TransactionalTask> innerTask )
         {
             this.outerTask = outerTask;
             this.innerTask = innerTask;
-            this.shouldRollBack = shouldRollBack;
         }
 
-        public Class<? extends TransactionalTask> getOuterTask()
+        public void scheduleOuterTaskOn( TransactionalWorker worker )
+        {
+            worker.scheduleTask( outerTask );
+        }
+
+        public void scheduleInnerTaskOn( TransactionalWorker worker )
+        {
+            worker.scheduleTask( innerTask );
+        }
+
+        public abstract void assertExpectedOutcomeFor( TransactionalWorker 
worker );
+
+        @Override
+        public boolean equals( Object obj )
+        {
+            return obj instanceof TestVector && equalsTestVector( (TestVector) 
obj );
+        }
+
+        private boolean equalsTestVector( TestVector other )
+        {
+            return innerTask.equals( other.innerTask ) && outerTask.equals( 
other.outerTask );
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return 31 * outerTask.hashCode() + innerTask.hashCode();
+        }
+    }
+
+    private static class RollingBackTestVector
+        extends TestVector
+    {
+
+        public RollingBackTestVector( Class<? extends TransactionalTask> 
outerTask,
+                                      Class<? extends TransactionalTask> 
innerTask )
         {
-            return outerTask;
+            super( outerTask, innerTask );
         }
 
-        public Class<? extends TransactionalTask> getInnerTask()
+        @Override
+        public void assertExpectedOutcomeFor( TransactionalWorker worker )
+        {
+            worker.assertNoEntityHasBeenPersisted();
+        }
+    }
+
+    private static class CommittingTestVector
+        extends TestVector
+    {
+
+        public CommittingTestVector( Class<? extends TransactionalTask> 
outerTask,
+                                     Class<? extends TransactionalTask> 
innerTask )
         {
-            return innerTask;
+            super( outerTask, innerTask );
         }
 
-        public boolean shouldRollBack()
+        @Override
+        public void assertExpectedOutcomeFor( TransactionalWorker worker )
         {
-            return shouldRollBack;
+            worker.assertAllEntitiesHaveBeenPersisted();
         }
     }
 
+    private static class TestVectorsBuilder
+    {
+
+        private final Class<? extends TransactionalTask> firstTask;
+
+        private final List<TestVector> result;
+
+        public TestVectorsBuilder( Class<? extends TransactionalTask> 
firstTask )
+        {
+            this.firstTask = firstTask;
+            this.result = new ArrayList<TestVector>();
+        }
+
+        public TestVectorsBuilder expectCommitWhenSecondTaskIs( Class<? 
extends TransactionalTask> secondTask )
+        {
+            result.add( new CommittingTestVector( firstTask, secondTask ) );
+            return this;
+        }
+
+        public TestVectorsBuilder expectRollbackWhenSecondTaskIs( Class<? 
extends TransactionalTask> secondTask )
+        {
+            result.add( new RollingBackTestVector( firstTask, secondTask ) );
+            return this;
+        }
+
+        public Collection<TestVector> buildTestVectors()
+        {
+            return result;
+        }
+    }
 }


Reply via email to