public void assertWorkingScoreFromScratch(Score workingScore, Object completedAction) {
   InnerScoreDirectorFactory assertionScoreDirectorFactory =
       scoreDirectorFactory.getAssertionScoreDirectorFactory();
   if (assertionScoreDirectorFactory == null) {
     assertionScoreDirectorFactory = scoreDirectorFactory;
   }
   InnerScoreDirector uncorruptedScoreDirector =
       assertionScoreDirectorFactory.buildScoreDirector(true);
   uncorruptedScoreDirector.setWorkingSolution(workingSolution);
   Score uncorruptedScore = uncorruptedScoreDirector.calculateScore();
   if (!workingScore.equals(uncorruptedScore)) {
     String scoreCorruptionAnalysis = buildScoreCorruptionAnalysis(uncorruptedScoreDirector);
     uncorruptedScoreDirector.dispose();
     throw new IllegalStateException(
         "Score corruption: the workingScore ("
             + workingScore
             + ") is not the uncorruptedScore ("
             + uncorruptedScore
             + ") after completedAction ("
             + completedAction
             + "):\n"
             + scoreCorruptionAnalysis);
   } else {
     uncorruptedScoreDirector.dispose();
   }
 }
 @Override
 public void assertScoreFromScratch(Solution_ solution) {
   // Get the score before uncorruptedScoreDirector.calculateScore() modifies it
   Score score = getSolutionDescriptor().getScore(solution);
   InnerScoreDirector<Solution_> uncorruptedScoreDirector = buildScoreDirector(false, true);
   uncorruptedScoreDirector.setWorkingSolution(solution);
   Score uncorruptedScore = uncorruptedScoreDirector.calculateScore();
   uncorruptedScoreDirector.dispose();
   if (!score.equals(uncorruptedScore)) {
     throw new IllegalStateException(
         "Score corruption: the solution's score ("
             + score
             + ") is not the uncorruptedScore ("
             + uncorruptedScore
             + ").");
   }
 }