11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2009 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 java.util.Arrays.asList;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.junit.contrib.truth.Truth.ASSERT;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Objects;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Table.Cell;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.EqualsTester;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Test cases for {@link ArrayTable}.
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ArrayTableTest extends AbstractTableTest {
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected ArrayTable<String, Integer, Character> create(
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Object... data) {
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // TODO: Specify different numbers of rows and columns, to detect problems
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // that arise when the wrong size is used.
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayTable<String, Integer, Character> table =
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ArrayTable.create(asList("foo", "bar", "cat"), asList(1, 2, 3));
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    populate(table, data);
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return table;
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected void assertSize(int expectedSize) {
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(9, table.size());
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected boolean supportsRemove() {
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return false;
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected boolean supportsNullValues() {
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return true;
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Overriding tests of behavior that differs for ArrayTable.
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void testContains() {
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.contains("foo", 1));
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.contains("bar", 1));
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.contains("foo", 3));
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.contains("foo", 2));
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.contains("bar", 3));
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.contains("cat", 1));
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.contains("foo", -1));
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.contains("bad", 1));
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.contains("bad", -1));
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.contains("foo", null));
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.contains(null, 1));
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.contains(null, null));
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void testContainsRow() {
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.containsRow("foo"));
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.containsRow("bar"));
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.containsRow("cat"));
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.containsRow("bad"));
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.containsRow(null));
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void testContainsColumn() {
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.containsColumn(1));
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.containsColumn(3));
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.containsColumn(2));
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.containsColumn(-1));
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.containsColumn(null));
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void testContainsValue() {
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.containsValue('a'));
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.containsValue('b'));
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.containsValue('c'));
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.containsValue('x'));
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.containsValue(null));
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void testIsEmpty() {
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.isEmpty());
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.isEmpty());
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void testEquals() {
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<String, Integer, Character> hashCopy = HashBasedTable.create();
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    hashCopy.put("foo", 1, 'a');
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    hashCopy.put("bar", 1, 'b');
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    hashCopy.put("foo", 3, 'c');
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<String, Integer, Character> reordered
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = create("foo", 3, 'c', "foo", 1, 'a', "bar", 1, 'b');
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<String, Integer, Character> smaller
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = create("foo", 1, 'a', "bar", 1, 'b');
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<String, Integer, Character> swapOuter
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = create("bar", 1, 'a', "foo", 1, 'b', "bar", 3, 'c');
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<String, Integer, Character> swapValues
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = create("foo", 1, 'c', "bar", 1, 'b', "foo", 3, 'a');
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(table, reordered)
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(hashCopy)
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(smaller)
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(swapOuter)
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(swapValues)
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void testHashCode() {
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = ArrayTable.create(asList("foo", "bar"), asList(1, 3));
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put("foo", 1, 'a');
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put("bar", 1, 'b');
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put("foo", 3, 'c');
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int expected = Objects.hashCode("foo", 1, 'a')
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        + Objects.hashCode("bar", 1, 'b')
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        + Objects.hashCode("foo", 3, 'c')
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        + Objects.hashCode("bar", 3, 0);
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, table.hashCode());
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void testRow() {
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Integer, Character> expected = Maps.newHashMap();
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expected.put(1, 'a');
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expected.put(3, 'c');
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expected.put(2, null);
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, table.row("foo"));
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void testColumn() {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Character> expected = Maps.newHashMap();
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expected.put("foo", 'a');
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expected.put("bar", 'b');
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expected.put("cat", null);
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, table.column(1));
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void testToStringSize1() {
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = ArrayTable.create(ImmutableList.of("foo"), ImmutableList.of(1));
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put("foo", 1, 'a');
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{foo={1=a}}", table.toString());
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateDuplicateRows() {
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ArrayTable.create(asList("foo", "bar", "foo"), asList(1, 2, 3));
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateDuplicateColumns() {
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ArrayTable.create(asList("foo", "bar"), asList(1, 2, 3, 2));
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateEmptyRows() {
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ArrayTable.create(Arrays.<String>asList(), asList(1, 2, 3));
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateEmptyColumns() {
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ArrayTable.create(asList("foo", "bar"), Arrays.<Integer>asList());
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateCopyArrayTable() {
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<String, Integer, Character> original
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<String, Integer, Character> copy = ArrayTable.create(original);
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(original, copy);
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    original.put("foo", 1, 'd');
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'd', original.get("foo", 1));
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'a', copy.get("foo", 1));
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(copy.rowKeySet(), original.rowKeySet());
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(copy.columnKeySet(), original.columnKeySet());
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateCopyHashBasedTable() {
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<String, Integer, Character> original = HashBasedTable.create();
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    original.put("foo", 1, 'a');
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    original.put("bar", 1, 'b');
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    original.put("foo", 3, 'c');
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<String, Integer, Character> copy = ArrayTable.create(original);
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, copy.size());
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'a', copy.get("foo", 1));
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'b', copy.get("bar", 1));
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'c', copy.get("foo", 3));
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(copy.get("bar", 3));
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    original.put("foo", 1, 'd');
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'd', original.get("foo", 1));
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'a', copy.get("foo", 1));
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(copy.rowKeySet(), ImmutableSet.of("foo", "bar"));
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(copy.columnKeySet(), ImmutableSet.of(1, 3));
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateCopyEmptyTable() {
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Table<String, Integer, Character> original = HashBasedTable.create();
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ArrayTable.create(original);
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization() {
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(table);
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNullPointerStatic() throws Exception {
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new NullPointerTester().testAllPublicStaticMethods(ArrayTable.class);
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToString_ordered() {
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{foo={1=a, 2=null, 3=c}, " +
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "bar={1=b, 2=null, 3=null}, " +
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "cat={1=null, 2=null, 3=null}}",
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        table.toString());
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{foo={1=a, 2=null, 3=c}, " +
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "bar={1=b, 2=null, 3=null}, " +
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "cat={1=null, 2=null, 3=null}}",
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        table.rowMap().toString());
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCellSetToString_ordered() {
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[(foo,1)=a, (foo,2)=null, (foo,3)=c, " +
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "(bar,1)=b, (bar,2)=null, (bar,3)=null, " +
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "(cat,1)=null, (cat,2)=null, (cat,3)=null]",
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        table.cellSet().toString());
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowKeySetToString_ordered() {
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[foo, bar, cat]", table.rowKeySet().toString());
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testColumnKeySetToString_ordered() {
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[1, 2, 3]", table.columnKeySet().toString());
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValuesToString_ordered() {
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[a, null, c, b, null, null, null, null, null]",
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        table.values().toString());
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowKeyList() {
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayTable<String, Integer, Character> table
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.rowKeyList()).hasContentsInOrder("foo", "bar", "cat");
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testColumnKeyList() {
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayTable<String, Integer, Character> table
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.columnKeyList()).hasContentsInOrder(1, 2, 3);
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetMissingKeys() {
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(table.get("dog", 1));
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(table.get("foo", 4));
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAt() {
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayTable<String, Integer, Character> table
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'b', table.at(1, 0));
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'c', table.at(0, 2));
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(table.at(1, 2));
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.at(1, 3);
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.at(1, -1);
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.at(3, 2);
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.at(-1, 2);
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSet() {
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayTable<String, Integer, Character> table
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'b', table.set(1, 0, 'd'));
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'd', table.get("bar", 1));
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(table.set(2, 0, 'e'));
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'e', table.get("cat", 1));
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'a', table.set(0, 0, null));
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(table.get("foo", 1));
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.set(1, 3, 'z');
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.set(1, -1, 'z');
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.set(3, 2, 'z');
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.set(-1, 2, 'z');
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.containsValue('z'));
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEraseAll() {
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayTable<String, Integer, Character> table
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.eraseAll();
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(9, table.size());
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(table.get("bar", 1));
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(table.containsRow("foo"));
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.containsValue('a'));
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPutIllegal() {
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("dog", 1, 'd');
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("Row dog not in [foo, bar, cat]", expected.getMessage());
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 4, 'd');
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("Column 4 not in [1, 2, 3]", expected.getMessage());
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(table.containsValue('d'));
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testErase() {
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayTable<String, Integer, Character> table
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'b', table.erase("bar", 1));
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(table.get("bar", 1));
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(9, table.size());
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(table.erase("bar", 1));
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(table.erase("foo", 2));
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(table.erase("dog", 1));
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(table.erase("bar", 5));
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(table.erase(null, 1));
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(table.erase("bar", null));
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToArray() {
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayTable<String, Integer, Character> table
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Character[][] array = table.toArray(Character.class);
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, array.length);
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(array[0]).hasContentsInOrder('a', null, 'c');
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(array[1]).hasContentsInOrder('b', null, null);
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(array[2]).hasContentsInOrder(null, null, null);
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.set(0, 2, 'd');
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'c', array[0][2]);
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[0][2] = 'e';
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'd', table.at(0, 2));
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCellReflectsChanges() {
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Cell<String, Integer, Character> cell = table.cellSet().iterator().next();
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Tables.immutableCell("foo", 1, 'a'), cell);
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Character) 'a', table.put("foo", 1, 'd'));
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Tables.immutableCell("foo", 1, 'd'), cell);
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowMissing() {
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Integer, Character> row = table.row("dog");
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(row.isEmpty());
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      row.put(1, 'd');
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {}
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testColumnMissing() {
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Character> column = table.column(4);
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(column.isEmpty());
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      column.put("foo", 'd');
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {}
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowPutIllegal() {
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Integer, Character> map = table.row("foo");
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      map.put(4, 'd');
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("Column 4 not in [1, 2, 3]", expected.getMessage());
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testColumnPutIllegal() {
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Character> map = table.column(3);
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      map.put("dog", 'd');
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("Row dog not in [foo, bar, cat]", expected.getMessage());
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
457