Added tests for failing a section within a generator
- small fixes to implementation to make it work
diff --git a/projects/SelfTest/PartTrackerTests.cpp b/projects/SelfTest/PartTrackerTests.cpp
index 74dd3ac..b33084d 100644
--- a/projects/SelfTest/PartTrackerTests.cpp
+++ b/projects/SelfTest/PartTrackerTests.cpp
@@ -187,9 +187,10 @@
             switch( m_runState ) {
                 case CompletedSuccessfully:
                 case Failed:
-                    assert(false); // Shouldn't really get here
+                    throw std::logic_error( "Illogical state" );
+
                 case NeedsAnotherRun:
-                    return;
+                    break;;
 
                 case Executing:
                     m_runState = CompletedSuccessfully;
@@ -277,7 +278,7 @@
             }
             
             if( !ctx.completedCycle() && !tracker->isComplete() ) {
-                if( tracker->m_runState != ExecutingChildren )
+                if( tracker->m_runState != ExecutingChildren && tracker->m_runState != NeedsAnotherRun )
                     tracker->moveNext();
                 tracker->open();
             }
@@ -462,15 +463,15 @@
         REQUIRE( s2.isOpen() );
 
         s2.close();
-        REQUIRE( s2.isSuccessfullyCompleted() );
-        REQUIRE( s1.isSuccessfullyCompleted() == false );
+        REQUIRE( s2.isComplete() );
+        REQUIRE( s1.isComplete() == false );
         
         s1.close();
-        REQUIRE( s1.isSuccessfullyCompleted() );
-        REQUIRE( testCase.isSuccessfullyCompleted() == false );
+        REQUIRE( s1.isComplete() );
+        REQUIRE( testCase.isComplete() == false );
         
         testCase.close();
-        REQUIRE( testCase.isSuccessfullyCompleted() );
+        REQUIRE( testCase.isComplete() );
     }
     
     SECTION( "start a generator" ) {
@@ -478,13 +479,13 @@
         REQUIRE( g1.isOpen() );
         REQUIRE( g1.index() == 0 );
 
-        REQUIRE( g1.isSuccessfullyCompleted() == false );
-        REQUIRE( s1.isSuccessfullyCompleted() == false );
+        REQUIRE( g1.isComplete() == false );
+        REQUIRE( s1.isComplete() == false );
 
         SECTION( "close outer section" )
         {
             s1.close();
-            REQUIRE( s1.isSuccessfullyCompleted() == false );
+            REQUIRE( s1.isComplete() == false );
             testCase.close();
             REQUIRE( testCase.isSuccessfullyCompleted() == false );
 
@@ -501,13 +502,13 @@
                 REQUIRE( g1b.isOpen() );
                 REQUIRE( g1b.index() == 1 );
                 
-                REQUIRE( s1.isSuccessfullyCompleted() == false );
+                REQUIRE( s1.isComplete() == false );
                 
                 s1b.close();
-                REQUIRE( s1b.isSuccessfullyCompleted() );
-                REQUIRE( g1b.isSuccessfullyCompleted() );
+                REQUIRE( s1b.isComplete() );
+                REQUIRE( g1b.isComplete() );
                 testCase2.close();
-                REQUIRE( testCase2.isSuccessfullyCompleted() );
+                REQUIRE( testCase2.isComplete() );
             }
         }
         SECTION( "Start a new inner section" ) {
@@ -515,13 +516,13 @@
             REQUIRE( s2.isOpen() );
 
             s2.close();
-            REQUIRE( s2.isSuccessfullyCompleted() );
+            REQUIRE( s2.isComplete() );
 
             s1.close();
-            REQUIRE( s1.isSuccessfullyCompleted() == false );
+            REQUIRE( s1.isComplete() == false );
 
             testCase.close();
-            REQUIRE( testCase.isSuccessfullyCompleted() == false );
+            REQUIRE( testCase.isComplete() == false );
             
             SECTION( "Re-enter for second generation" ) {
                 ctx.startCycle();
@@ -541,14 +542,81 @@
                 REQUIRE( s2b.isOpen() );
                 
                 s2b.close();
-                REQUIRE( s2b.isSuccessfullyCompleted() );
+                REQUIRE( s2b.isComplete() );
                 
                 s1b.close();
-                REQUIRE( s1b.isSuccessfullyCompleted() );
-                REQUIRE( g1b.isSuccessfullyCompleted() );
+                REQUIRE( g1b.isComplete() );
+                REQUIRE( s1b.isComplete() );
                 
                 testCase2.close();
-                REQUIRE( testCase2.isSuccessfullyCompleted() );
+                REQUIRE( testCase2.isComplete() );
+            }
+        }
+        
+        SECTION( "Fail an inner section" ) {
+            IPartTracker& s2 = SectionTracker::acquire( ctx, "S2" );
+            REQUIRE( s2.isOpen() );
+            
+            s2.fail();
+            REQUIRE( s2.isComplete() );
+            REQUIRE( s2.isSuccessfullyCompleted() == false );
+            
+            s1.close();
+            REQUIRE( s1.isComplete() == false );
+            
+            testCase.close();
+            REQUIRE( testCase.isComplete() == false );
+            
+            SECTION( "Re-enter for second generation" ) {
+                ctx.startCycle();
+                IPartTracker& testCase2 = SectionTracker::acquire( ctx, "Testcase" );
+                REQUIRE( testCase2.isOpen() );
+                
+                IPartTracker& s1b = SectionTracker::acquire( ctx, "S1" );
+                REQUIRE( s1b.isOpen() );
+                
+                // generator - still same value
+                IndexTracker& g1b = IndexTracker::acquire( ctx, "G1", 2 );
+                REQUIRE( g1b.isOpen() );
+                REQUIRE( g1b.index() == 0 );
+                
+                // inner section again - this time won't open
+                IPartTracker& s2b = SectionTracker::acquire( ctx, "S2" );
+                REQUIRE( s2b.isOpen() == false );
+                
+                s1b.close();
+                REQUIRE( g1b.isComplete() == false );
+                REQUIRE( s1b.isComplete() == false );
+                
+                testCase2.close();
+                REQUIRE( testCase2.isComplete() == false );
+                
+                // Another cycle - now should complete
+                ctx.startCycle();
+                IPartTracker& testCase3 = SectionTracker::acquire( ctx, "Testcase" );
+                REQUIRE( testCase3.isOpen() );
+                
+                IPartTracker& s1c = SectionTracker::acquire( ctx, "S1" );
+                REQUIRE( s1c.isOpen() );
+                
+                // generator - now next value
+                IndexTracker& g1c = IndexTracker::acquire( ctx, "G1", 2 );
+                REQUIRE( g1c.isOpen() );
+                REQUIRE( g1c.index() == 1 );
+                
+                // inner section - now should open again
+                IPartTracker& s2c = SectionTracker::acquire( ctx, "S2" );
+                REQUIRE( s2c.isOpen() );
+                
+                s2c.close();
+                REQUIRE( s2c.isComplete() );
+                
+                s1c.close();
+                REQUIRE( g1c.isComplete() );
+                REQUIRE( s1c.isComplete() );
+                
+                testCase3.close();
+                REQUIRE( testCase3.isComplete() );
             }
         }
         // !TBD"