private void testSafeDeleteHelper(
      String entityType,
      String overridingId,
      boolean cascade,
      boolean dryrun,
      boolean forced,
      boolean logViolations,
      Integer maxObjects,
      AccessibilityCheck access,
      boolean leafDataOnly,
      int expectedNObjects,
      int expectedDepth,
      CascadeResult.Status expectedStatus,
      CascadeResultError.ErrorType expectedErrorType,
      CascadeResultError.ErrorType expectedWarningType) {
    //        System.out.println("Testing safeDelete: ");
    //        System.out.println("   entity type             : " + entityType);
    //        System.out.println("   override id             : " + overridingId);
    //        System.out.println("   cascade                 : " + cascade);
    //        System.out.println("   dryrun                  : " + dryrun);
    //        System.out.println("   maxObjects              : " + maxObjects);
    //        System.out.println("   leaf data only          : " + leafDataOnly);
    //        System.out.println("   expected affected count : " + expectedNObjects);
    //        System.out.println("   expected depth          : " + expectedDepth);

    CascadeResult result = null;
    String idToDelete = prepareSafeDeleteGradingPeriodData(leafDataOnly);

    // used to test bad id scenario
    if (overridingId != null) {
      idToDelete = overridingId;
    }

    result =
        repository.safeDelete(
            entityType, idToDelete, cascade, dryrun, forced, logViolations, maxObjects, access);

    // check for at least one instance of the expected error type
    boolean errorMatchFound = false;
    List<CascadeResultError> errors = result.getErrors();
    if (expectedErrorType == null && errors != null && errors.size() == 0) {
      errorMatchFound = true;
    } else {
      for (CascadeResultError error : errors) {
        if (error.getErrorType() == expectedErrorType) {
          errorMatchFound = true;
          break;
        }
      }
    }

    //        for (CascadeResultError error : result.getErrors()) {
    //            System.out.println(error);
    //        }

    // check for at least one instance of the expected warning type
    boolean warningMatchFound = false;
    List<CascadeResultError> warnings = result.getWarnings();
    if (expectedWarningType == null && warnings != null && warnings.size() == 0) {
      warningMatchFound = true;
    } else {
      for (CascadeResultError warning : warnings) {
        if (warning.getErrorType() == expectedWarningType) {
          warningMatchFound = true;
          break;
        }
      }
    }

    //        for(CascadeResultError warning : result.getWarnings()) {
    //            System.out.println(warning);
    //        }

    //   verify expected results
    assertEquals(expectedNObjects, result.getnObjects());
    assertEquals(expectedDepth, result.getDepth());
    assertEquals(expectedStatus, result.getStatus());
    assertTrue(errorMatchFound);
    assertTrue(warningMatchFound);
  }