@Test
  public void testForEachUsingMap() {
    // Test the default batch size calculations
    IntegerSum sum1 = new IntegerSum(0);
    MutableMap<String, Integer> map1 =
        Interval.fromTo(1, 10000).toMap(String::valueOf, Functions.getIntegerPassThru());
    ParallelIterate.forEach(map1, new SumProcedure(sum1), new SumCombiner(sum1));
    Assert.assertEquals(50005000, sum1.getSum());

    // Testing batch size 1
    IntegerSum sum2 = new IntegerSum(0);
    UnifiedMap<String, Integer> map2 =
        (UnifiedMap<String, Integer>)
            Interval.fromTo(1, 100).toMap(String::valueOf, Functions.getIntegerPassThru());
    ParallelIterate.forEach(
        map2, new SumProcedure(sum2), new SumCombiner(sum2), 1, map2.getBatchCount(map2.size()));
    Assert.assertEquals(5050, sum2.getSum());

    // Testing an uneven batch size
    IntegerSum sum3 = new IntegerSum(0);
    UnifiedMap<String, Integer> set3 =
        (UnifiedMap<String, Integer>)
            Interval.fromTo(1, 100).toMap(String::valueOf, Functions.getIntegerPassThru());
    ParallelIterate.forEach(
        set3, new SumProcedure(sum3), new SumCombiner(sum3), 1, set3.getBatchCount(13));
    Assert.assertEquals(5050, sum3.getSum());
  }
  @Test
  public void testForEachUsingSet() {
    // Tests the default batch size calculations
    IntegerSum sum = new IntegerSum(0);
    MutableSet<Integer> set = Interval.toSet(1, 10000);
    ParallelIterate.forEach(set, new SumProcedure(sum), new SumCombiner(sum));
    Assert.assertEquals(50005000, sum.getSum());

    // Testing batch size 1
    IntegerSum sum2 = new IntegerSum(0);
    UnifiedSet<Integer> set2 = UnifiedSet.newSet(Interval.oneTo(100));
    ParallelIterate.forEach(
        set2, new SumProcedure(sum2), new SumCombiner(sum2), 1, set2.getBatchCount(set2.size()));
    Assert.assertEquals(5050, sum2.getSum());

    // Testing an uneven batch size
    IntegerSum sum3 = new IntegerSum(0);
    UnifiedSet<Integer> set3 = UnifiedSet.newSet(Interval.oneTo(100));
    ParallelIterate.forEach(
        set3, new SumProcedure(sum3), new SumCombiner(sum3), 1, set3.getBatchCount(13));
    Assert.assertEquals(5050, sum3.getSum());

    // Testing divideByZero exception by passing 1 as batchSize
    IntegerSum sum4 = new IntegerSum(0);
    UnifiedSet<Integer> set4 = UnifiedSet.newSet(Interval.oneTo(100));
    ParallelIterate.forEach(set4, new SumProcedure(sum4), new SumCombiner(sum4), 1);
    Assert.assertEquals(5050, sum4.getSum());
  }
 private void executeParallelIterate(int level, ExecutorService executorService) {
   MutableList<Integer> items = Lists.mutable.of();
   for (int i = 0; i < 20000; i++) {
     items.add(i % 1000 == 0 ? level : 0);
   }
   ParallelIterate.forEach(items, new RecursiveProcedure(), executorService);
 }
 @Test
 public void testForEachWithException() {
   Verify.assertThrows(
       RuntimeException.class,
       () ->
           ParallelIterate.forEach(
               ParallelIterateAcceptanceTest.createIntegerList(5),
               new PassThruProcedureFactory<>(EXCEPTION_PROCEDURE),
               new PassThruCombiner<>(),
               1,
               5));
 }
  @Test
  public void testForEachImmutableList() {
    IntegerSum sum1 = new IntegerSum(0);
    ImmutableList<Integer> list1 =
        Lists.immutable.ofAll(ParallelIterateAcceptanceTest.createIntegerList(16));
    ParallelIterate.forEach(
        list1, new SumProcedure(sum1), new SumCombiner(sum1), 1, list1.size() / 2);
    Assert.assertEquals(16, sum1.getSum());

    IntegerSum sum2 = new IntegerSum(0);
    ImmutableList<Integer> list2 =
        Lists.immutable.ofAll(ParallelIterateAcceptanceTest.createIntegerList(7));
    ParallelIterate.forEach(list2, new SumProcedure(sum2), new SumCombiner(sum2));
    Assert.assertEquals(7, sum2.getSum());

    IntegerSum sum3 = new IntegerSum(0);
    ImmutableList<Integer> list3 =
        Lists.immutable.ofAll(ParallelIterateAcceptanceTest.createIntegerList(15));
    ParallelIterate.forEach(
        list3, new SumProcedure(sum3), new SumCombiner(sum3), 1, list3.size() / 2);
    Assert.assertEquals(15, sum3.getSum());

    IntegerSum sum4 = new IntegerSum(0);
    ImmutableList<Integer> list4 =
        Lists.immutable.ofAll(ParallelIterateAcceptanceTest.createIntegerList(35));
    ParallelIterate.forEach(list4, new SumProcedure(sum4), new SumCombiner(sum4));
    Assert.assertEquals(35, sum4.getSum());

    IntegerSum sum5 = new IntegerSum(0);
    ImmutableList<Integer> list5 = FastList.newList(list4).toImmutable();
    ParallelIterate.forEach(list5, new SumProcedure(sum5), new SumCombiner(sum5));
    Assert.assertEquals(35, sum5.getSum());

    IntegerSum sum6 = new IntegerSum(0);
    ImmutableList<Integer> list6 =
        Lists.immutable.ofAll(ParallelIterateAcceptanceTest.createIntegerList(40));
    ParallelIterate.forEach(
        list6, new SumProcedure(sum6), new SumCombiner(sum6), 1, list6.size() / 2);
    Assert.assertEquals(40, sum6.getSum());

    IntegerSum sum7 = new IntegerSum(0);
    ImmutableList<Integer> list7 = FastList.newList(list6).toImmutable();
    ParallelIterate.forEach(
        list7, new SumProcedure(sum7), new SumCombiner(sum7), 1, list6.size() / 2);
    Assert.assertEquals(40, sum7.getSum());
  }