11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.junit.contrib.truth.Truth.ASSERT;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableSet.Builder;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@link ImmutableSet}.
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Nick Kralevich
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ImmutableSetTest extends AbstractImmutableSetTest {
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Set<String> of() {
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableSet.of();
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Set<String> of(String e) {
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableSet.of(e);
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Set<String> of(String e1, String e2) {
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableSet.of(e1, e2);
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Set<String> of(String e1, String e2, String e3) {
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableSet.of(e1, e2, e3);
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Set<String> of(
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String e1, String e2, String e3, String e4) {
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableSet.of(e1, e2, e3, e4);
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Set<String> of(
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String e1, String e2, String e3, String e4, String e5) {
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableSet.of(e1, e2, e3, e4, e5);
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Set<String> of(String e1, String e2, String e3,
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String e4, String e5, String e6, String... rest) {
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableSet.of(e1, e2, e3, e4, e5, e6, rest);
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Set<String> copyOf(String[] elements) {
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableSet.copyOf(elements);
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Set<String> copyOf(Collection<String> elements) {
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableSet.copyOf(elements);
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Set<String> copyOf(Iterable<String> elements) {
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableSet.copyOf(elements);
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Set<String> copyOf(Iterator<String> elements) {
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableSet.copyOf(elements);
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_allDuplicates() {
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSet<String> set = ImmutableSet.copyOf(Lists.newArrayList("a", "a"));
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(set instanceof SingletonImmutableSet);
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Lists.newArrayList("a"), Lists.newArrayList(set));
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_oneDuplicate() {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // now we'll get the varargs overload
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSet<String> set = ImmutableSet.of(
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "a");
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Lists.newArrayList(
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"),
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Lists.newArrayList(set));
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_manyDuplicates() {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // now we'll get the varargs overload
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSet<String> set = ImmutableSet.of(
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "a", "b", "c", "c", "c", "c", "b", "b", "a", "a", "c", "c", "c", "a");
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(set).hasContentsInOrder("a", "b", "c");
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_arrayOfArray() {
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = new String[] { "a" };
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String[]> set = ImmutableSet.<String[]>of(array);
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singleton(array), set);
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNullPointers() throws Exception {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(ImmutableSet.class);
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("ImmutableSet.chooseTableSize")
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testChooseTableSize() {
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(8, ImmutableSet.chooseTableSize(3));
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(16, ImmutableSet.chooseTableSize(4));
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1 << 30, ImmutableSet.chooseTableSize(1 << 28));
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1 << 30, ImmutableSet.chooseTableSize(1 << 29 - 1));
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Now we hit the cap
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1 << 30, ImmutableSet.chooseTableSize(1 << 29));
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1 << 30, ImmutableSet.chooseTableSize(1 << 30 - 1));
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Now we've gone too far
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSet.chooseTableSize(1 << 30);
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("RegularImmutableSet.table not in emulation")
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testResizeTable() {
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    verifyTableSize(100, 2, 8);
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    verifyTableSize(100, 5, 16);
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    verifyTableSize(100, 33, 256);
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    verifyTableSize(17, 17, 64);
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    verifyTableSize(17, 16, 64);
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    verifyTableSize(17, 15, 64);
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("RegularImmutableSet.table not in emulation")
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void verifyTableSize(int inputSize, int setSize, int tableSize) {
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Builder<Integer> builder = ImmutableSet.builder();
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < inputSize; i++) {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.add(i % setSize);
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSet<Integer> set = builder.build();
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(set instanceof RegularImmutableSet);
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("Input size " + inputSize + " and set size " + setSize,
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        tableSize, ((RegularImmutableSet<Integer>) set).table.length);
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_copiesImmutableSortedSet() {
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSortedSet<String> sortedSet = ImmutableSortedSet.of("a");
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSet<String> copy = ImmutableSet.copyOf(sortedSet);
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNotSame(sortedSet, copy);
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("GWT is single threaded")
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_threadSafe() {
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    verifyThreadSafe();
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsList() {
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSet<String> set = ImmutableSet.of("a", "b", "c", "d", "e");
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableList<String> list = set.asList();
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableList.of("a", "b", "c", "d", "e"), list);
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester, ImmutableAsList")
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsListReturnTypeAndSerialization() {
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSet<String> set = ImmutableSet.of("a", "b", "c", "d", "e");
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableList<String> list = set.asList();
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(list instanceof ImmutableAsList);
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableList<String> copy = SerializableTester.reserializeAndAssert(list);
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy instanceof ImmutableAsList);
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override <E extends Comparable<E>> Builder<E> builder() {
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableSet.builder();
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override int getComplexBuilderSetLastElement() {
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return LAST_COLOR_ADDED;
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
199