@Test
 public void partition() {
   ImmutableCollection<Integer> integers = this.classUnderTest();
   PartitionImmutableCollection<Integer> partition = integers.partition(IntegerPredicates.isOdd());
   Assert.assertEquals(integers.select(IntegerPredicates.isOdd()), partition.getSelected());
   Assert.assertEquals(integers.select(IntegerPredicates.isEven()), partition.getRejected());
 }
  private void groupByAssertions(ImmutableBagMultimap<Boolean, String> multimap) {
    Verify.assertIterableEmpty(multimap.get(null));

    ImmutableBag<String> odds = multimap.get(true);
    ImmutableBag<String> evens = multimap.get(false);
    for (int i = 1; i <= this.numKeys(); i++) {
      String key = String.valueOf(i);
      ImmutableBag<String> containingBag = IntegerPredicates.isOdd().accept(i) ? odds : evens;
      ImmutableBag<String> nonContainingBag = IntegerPredicates.isOdd().accept(i) ? evens : odds;
      Assert.assertTrue(containingBag.contains(key));
      Assert.assertFalse(nonContainingBag.contains(key));

      Assert.assertEquals(i, containingBag.occurrencesOf(key));
    }
  }
 @Test
 public void rejectWith() {
   ImmutableCollection<Integer> integers = this.classUnderTest();
   Assert.assertEquals(
       this.<Integer>newMutable().withAll(integers).reject(IntegerPredicates.isOdd()),
       integers.rejectWith(Predicates2.in(), iList(1, 3, 5, 7, 9)));
 }
  @Test
  public void groupBy() {
    ImmutableBagMultimap<Boolean, String> multimap =
        this.newBag().groupBy(string -> IntegerPredicates.isOdd().accept(Integer.valueOf(string)));

    this.groupByAssertions(multimap);
  }
  @Test
  public void groupBy_with_target() {
    ImmutableBagMultimap<Boolean, String> multimap =
        this.newBag()
            .groupBy(
                string -> IntegerPredicates.isOdd().accept(Integer.valueOf(string)),
                new HashBagMultimap<Boolean, String>())
            .toImmutable();

    this.groupByAssertions(multimap);
  }
  @Test
  public void groupBy() {
    ImmutableMap<String, Integer> map = this.newMapWithKeysValues("1", 1, "2", 2, "3", 3, "4", 4);

    Function<Integer, Boolean> isOddFunction = object -> IntegerPredicates.isOdd().accept(object);

    Multimap<Boolean, Integer> expected;

    switch (map.size()) {
      case 1:
        expected = FastListMultimap.newMultimap(Tuples.pair(Boolean.TRUE, 1));
        break;
      case 2:
        expected =
            FastListMultimap.newMultimap(
                Tuples.pair(Boolean.TRUE, 1), Tuples.pair(Boolean.FALSE, 2));
        break;
      case 3:
        expected =
            FastListMultimap.newMultimap(
                Tuples.pair(Boolean.TRUE, 1),
                Tuples.pair(Boolean.TRUE, 3),
                Tuples.pair(Boolean.FALSE, 2));
        break;
      case 4:
        expected =
            FastListMultimap.newMultimap(
                Tuples.pair(Boolean.TRUE, 1),
                Tuples.pair(Boolean.TRUE, 3),
                Tuples.pair(Boolean.FALSE, 2),
                Tuples.pair(Boolean.FALSE, 4));
        break;
      default:
        expected = FastListMultimap.newMultimap();
        break;
    }

    Multimap<Boolean, Integer> actual = map.groupBy(isOddFunction);
    Assert.assertEquals(HashBagMultimap.newMultimap(expected), HashBagMultimap.newMultimap(actual));

    Multimap<Boolean, Integer> actualFromTarget =
        map.groupBy(isOddFunction, FastListMultimap.<Boolean, Integer>newMultimap());
    Assert.assertEquals(
        HashBagMultimap.newMultimap(expected), HashBagMultimap.newMultimap(actualFromTarget));
  }