11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2009 Google Inc.
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 Bringert/**
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests common methods in {@link ImmutableTable}
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author gak@google.com (Gregory Kick)
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ImmutableTableTest extends AbstractTableReadTest {
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Table<String, Integer, Character> create(Object... data) {
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableTable.Builder<String, Integer, Character> builder =
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableTable.builder();
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < data.length; i = i + 3) {
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put((String) data[i], (Integer) data[i + 1],
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          (Character) data[i + 2]);
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return builder.build();
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder() {
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableTable.Builder<Character, Integer, String> builder =
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new ImmutableTable.Builder<Character, Integer, String>();
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableTable.of(), builder.build());
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableTable.of('a', 1, "foo"), builder
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .put('a', 1, "foo")
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build());
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<Character, Integer, String> expectedTable = HashBasedTable.create();
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectedTable.put('a', 1, "foo");
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectedTable.put('b', 1, "bar");
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectedTable.put('a', 2, "baz");
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<Character, Integer, String> otherTable = HashBasedTable.create();
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    otherTable.put('b', 1, "bar");
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    otherTable.put('a', 2, "baz");
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expectedTable, builder
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .putAll(otherTable)
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build());
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_withImmutableCell() {
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableTable.Builder<Character, Integer, String> builder =
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new ImmutableTable.Builder<Character, Integer, String>();
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableTable.of('a', 1, "foo"), builder
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .put(Tables.immutableCell('a', 1, "foo"))
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build());
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_withImmutableCellAndNullContents() {
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableTable.Builder<Character, Integer, String> builder =
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new ImmutableTable.Builder<Character, Integer, String>();
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put(Tables.immutableCell((Character) null, 1, "foo"));
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException e) {
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // success
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put(Tables.immutableCell('a', (Integer) null, "foo"));
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException e) {
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // success
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put(Tables.immutableCell('a', 1, (String) null));
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException e) {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // success
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class StringHolder {
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String string;
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_withMutableCell() {
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableTable.Builder<Character, Integer, String> builder =
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new ImmutableTable.Builder<Character, Integer, String>();
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final StringHolder holder = new StringHolder();
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    holder.string = "foo";
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table.Cell<Character, Integer, String> mutableCell =
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Tables.AbstractCell<Character, Integer, String>() {
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public Character getRowKey() {
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return 'K';
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public Integer getColumnKey() {
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return 42;
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public String getValue() {
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return holder.string;
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        };
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Add the mutable cell to the builder
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put(mutableCell);
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Mutate the value
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    holder.string = "bar";
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Make sure it uses the original value.
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableTable.of('K', 42, "foo"), builder.build());
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_noDuplicates() {
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableTable.Builder<Character, Integer, String> builder =
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new ImmutableTable.Builder<Character, Integer, String>()
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put('a', 1, "foo")
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put('a', 1, "bar");
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.build();
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException e) {
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // success
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_noNulls() {
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableTable.Builder<Character, Integer, String> builder =
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new ImmutableTable.Builder<Character, Integer, String>();
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put(null, 1, "foo");
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException e) {
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // success
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put('a', null, "foo");
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException e) {
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // success
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put('a', 1, null);
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException e) {
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // success
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static <R, C, V> void validateTableCopies(Table<R, C, V> original) {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<R, C, V> copy = ImmutableTable.copyOf(original);
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(original, copy);
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    validateViewOrdering(original, copy);
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<R, C, V> built
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableTable.<R, C, V>builder().putAll(original).build();
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(original, built);
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    validateViewOrdering(original, built);
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static <R, C, V> void validateViewOrdering(
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<R, C, V> original, Table<R, C, V> copy) {
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.elementsEqual(original.cellSet(), copy.cellSet()));
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.elementsEqual(original.rowKeySet(), copy.rowKeySet()));
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.elementsEqual(original.values(), copy.values()));
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf() {
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<Character, Integer, String> table = TreeBasedTable.create();
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    validateTableCopies(table);
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('b', 2, "foo");
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    validateTableCopies(table);
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('b', 1, "bar");
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('a', 2, "baz");
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    validateTableCopies(table);
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Even though rowKeySet, columnKeySet, and cellSet have the same
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // iteration ordering, row has an inconsistent ordering.
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.row('b').keySet()).hasContentsInOrder(1, 2);
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(ImmutableTable.copyOf(table).row('b').keySet())
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(2, 1);
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOfSparse() {
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<Character, Integer, String> table = TreeBasedTable.create();
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('x', 2, "foo");
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('r', 1, "bar");
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('c', 3, "baz");
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('b', 7, "cat");
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('e', 5, "dog");
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('c', 0, "axe");
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('e', 3, "tub");
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('r', 4, "foo");
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('x', 5, "bar");
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    validateTableCopies(table);
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOfDense() {
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<Character, Integer, String> table = TreeBasedTable.create();
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('c', 3, "foo");
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('c', 2, "bar");
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('c', 1, "baz");
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('b', 3, "cat");
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('b', 1, "dog");
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('a', 3, "foo");
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('a', 2, "bar");
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('a', 1, "baz");
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    validateTableCopies(table);
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_orderRowsAndColumnsBy_putAll() {
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<Character, Integer, String> table = HashBasedTable.create();
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('b', 2, "foo");
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('b', 1, "bar");
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put('a', 2, "baz");
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableTable.Builder<Character, Integer, String> builder
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableTable.builder();
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<Character, Integer, String> copy
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = builder.orderRowsBy(Ordering.natural())
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .orderColumnsBy(Ordering.natural())
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .putAll(table).build();
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(copy.rowKeySet()).hasContentsInOrder('a', 'b');
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(copy.columnKeySet()).hasContentsInOrder(1, 2);
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(copy.values()).hasContentsInOrder("baz", "bar", "foo");
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(copy.row('b').keySet()).hasContentsInOrder(1, 2);
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_orderRowsAndColumnsBy_sparse() {
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableTable.Builder<Character, Integer, String> builder
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableTable.builder();
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderRowsBy(Ordering.natural());
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderColumnsBy(Ordering.natural());
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('x', 2, "foo");
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('r', 1, "bar");
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 3, "baz");
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('b', 7, "cat");
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('e', 5, "dog");
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 0, "axe");
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('e', 3, "tub");
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('r', 4, "foo");
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('x', 5, "bar");
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<Character, Integer, String> table = builder.build();
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.rowKeySet()).hasContentsInOrder('b', 'c', 'e', 'r', 'x');
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.columnKeySet()).hasContentsInOrder(0, 1, 2, 3, 4, 5, 7);
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.values()).hasContentsInOrder("cat", "axe", "baz", "tub",
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "dog", "bar", "foo", "foo", "bar");
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.row('c').keySet()).hasContentsInOrder(0, 3);
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.column(5).keySet()).hasContentsInOrder('e', 'x');
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_orderRowsAndColumnsBy_dense() {
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableTable.Builder<Character, Integer, String> builder
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableTable.builder();
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderRowsBy(Ordering.natural());
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderColumnsBy(Ordering.natural());
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 3, "foo");
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 2, "bar");
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 1, "baz");
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('b', 3, "cat");
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('b', 1, "dog");
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('a', 3, "foo");
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('a', 2, "bar");
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('a', 1, "baz");
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<Character, Integer, String> table = builder.build();
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.rowKeySet()).hasContentsInOrder('a', 'b', 'c');
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.columnKeySet()).hasContentsInOrder(1, 2, 3);
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.values()).hasContentsInOrder("baz", "bar", "foo", "dog",
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "cat", "baz", "bar", "foo");
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.row('c').keySet()).hasContentsInOrder(1, 2, 3);
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.column(1).keySet()).hasContentsInOrder('a', 'b', 'c');
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_orderRowsBy_sparse() {
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableTable.Builder<Character, Integer, String> builder
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableTable.builder();
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderRowsBy(Ordering.natural());
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('x', 2, "foo");
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('r', 1, "bar");
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 3, "baz");
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('b', 7, "cat");
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('e', 5, "dog");
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 0, "axe");
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('e', 3, "tub");
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('r', 4, "foo");
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('x', 5, "bar");
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<Character, Integer, String> table = builder.build();
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.rowKeySet()).hasContentsInOrder('b', 'c', 'e', 'r', 'x');
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.column(5).keySet()).hasContentsInOrder('e', 'x');
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_orderRowsBy_dense() {
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableTable.Builder<Character, Integer, String> builder
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableTable.builder();
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderRowsBy(Ordering.natural());
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 3, "foo");
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 2, "bar");
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 1, "baz");
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('b', 3, "cat");
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('b', 1, "dog");
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('a', 3, "foo");
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('a', 2, "bar");
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('a', 1, "baz");
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<Character, Integer, String> table = builder.build();
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.rowKeySet()).hasContentsInOrder('a', 'b', 'c');
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.column(1).keySet()).hasContentsInOrder('a', 'b', 'c');
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_orderColumnsBy_sparse() {
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableTable.Builder<Character, Integer, String> builder
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableTable.builder();
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderColumnsBy(Ordering.natural());
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('x', 2, "foo");
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('r', 1, "bar");
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 3, "baz");
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('b', 7, "cat");
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('e', 5, "dog");
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 0, "axe");
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('e', 3, "tub");
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('r', 4, "foo");
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('x', 5, "bar");
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<Character, Integer, String> table = builder.build();
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.columnKeySet()).hasContentsInOrder(0, 1, 2, 3, 4, 5, 7);
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.row('c').keySet()).hasContentsInOrder(0, 3);
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_orderColumnsBy_dense() {
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableTable.Builder<Character, Integer, String> builder
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableTable.builder();
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderColumnsBy(Ordering.natural());
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 3, "foo");
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 2, "bar");
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('c', 1, "baz");
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('b', 3, "cat");
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('b', 1, "dog");
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('a', 3, "foo");
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('a', 2, "bar");
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put('a', 1, "baz");
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<Character, Integer, String> table = builder.build();
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.columnKeySet()).hasContentsInOrder(1, 2, 3);
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.row('c').keySet()).hasContentsInOrder(1, 2, 3);
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
348