code: private List<TestCaseDef> getValidCases( FunctionInputDef inputDef, VarTupleSet validTuples)
      {
      logger_.debug( "{}: Creating valid test cases", inputDef);
      
      List<TestCaseDef> validCases = new ArrayList<TestCaseDef>();
  
      // For each valid input tuple not yet used in a test case...
      Tuple nextUnused;
      while( (nextUnused = validTuples.getNextUnused()) != null)
        {
        // Completed bindings for all variables?
        TestCaseDef validCase = createTestCase( nextUnused, inputDef, validTuples);
        if( validCase != null)
          {
          // Yes, add new valid test case.
          validTuples.used( validCase);
          validCases.add( validCase);
          }
  
        else
          {
          // No, remove infeasible tuple.
          validTuples.remove( nextUnused);
          }
        }
  
      logger_.info( "{}: Created {} valid test cases", inputDef, validCases.size());
      return validCases;
      }
docs: Returns a set of valid {@link TestCaseDef test case definitions} for the given function input definition.