11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2008 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.testing.MapTestSuiteBuilder;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.SortedMapInterfaceTest;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.TestStringMapGenerator;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.MapFeature;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.Test;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestSuite;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Comparator;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.SortedMap;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Test cases for {@link TreeBasedTable}.
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class TreeBasedTableTest extends AbstractTableTest {
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Test suite(){
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TestSuite suite = new TestSuite();
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TreeBasedTableTest.class);
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TreeRowTest.class);
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(MapTestSuiteBuilder
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestStringMapGenerator() {
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Map<String, String> create(
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Entry<String, String>[] entries) {
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            TreeBasedTable<String, String, String> table =
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                TreeBasedTable.create();
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            table.put("a", "b", "c");
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            table.put("c", "b", "a");
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            table.put("a", "a", "d");
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (Entry<String, String> entry : entries) {
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              table.put("b", entry.getKey(), entry.getValue());
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.row("b");
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }).withFeatures(MapFeature.GENERAL_PURPOSE, CollectionSize.ANY)
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("RowMapTestSuite").createTestSuite());
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return suite;
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeRowTest extends
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      SortedMapInterfaceTest<String, String> {
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeRowTest() {
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, true, true, true);
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected SortedMap<String, String> makeEmptyMap() {
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, String, String> table = TreeBasedTable.create();
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("a", "b", "c");
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("c", "b", "a");
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("a", "a", "d");
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.row("b");
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected SortedMap<String, String> makePopulatedMap() {
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, String, String> table = TreeBasedTable.create();
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("a", "b", "c");
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("c", "b", "a");
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("b", "b", "x");
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("b", "c", "y");
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("b", "x", "n");
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("a", "a", "d");
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.row("b");
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "q";
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getValueNotInPopulatedMap() {
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "p";
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testClearSubMapOfRowMap() {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, String, String> table = TreeBasedTable.create();
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("a", "b", "c");
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("c", "b", "a");
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("b", "b", "x");
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("b", "c", "y");
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("b", "x", "n");
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("a", "a", "d");
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.row("b").subMap("c", "x").clear();
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(table.row("b"), ImmutableMap.of("b", "x", "x", "n"));
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.row("b").subMap("b", "y").clear();
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(table.row("b"), ImmutableMap.of());
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(table.backingMap.containsKey("b"));
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private TreeBasedTable<String, Integer, Character> sortedTable;
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected TreeBasedTable<String, Integer, Character> create(
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Comparator<? super String> rowComparator,
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Comparator<? super Integer> columnComparator,
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Object... data) {
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeBasedTable<String, Integer, Character> table =
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        TreeBasedTable.create(rowComparator, columnComparator);
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put("foo", 4, 'a');
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put("cat", 1, 'b');
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.clear();
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    populate(table, data);
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return table;
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected TreeBasedTable<String, Integer, Character> create(
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Object... data) {
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeBasedTable<String, Integer, Character> table = TreeBasedTable.create();
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put("foo", 4, 'a');
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put("cat", 1, 'b');
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.clear();
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    populate(table, data);
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return table;
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateExplicitComparators() {
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = TreeBasedTable.create(
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Collections.reverseOrder(), Ordering.usingToString());
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put("foo", 3, 'a');
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put("foo", 12, 'b');
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put("bar", 5, 'c');
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put("cat", 8, 'd');
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.rowKeySet()).hasContentsInOrder("foo", "cat", "bar");
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.row("foo").keySet()).hasContentsInOrder(12, 3);
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateCopy() {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeBasedTable<String, Integer, Character> original = TreeBasedTable.create(
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Collections.reverseOrder(), Ordering.usingToString());
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    original.put("foo", 3, 'a');
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    original.put("foo", 12, 'b');
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    original.put("bar", 5, 'c');
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    original.put("cat", 8, 'd');
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = TreeBasedTable.create(original);
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.rowKeySet()).hasContentsInOrder("foo", "cat", "bar");
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(table.row("foo").keySet()).hasContentsInOrder(12, 3);
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(original, table);
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization() {
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(table);
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToString_ordered() {
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{bar={1=b}, foo={1=a, 3=c}}", table.toString());
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{bar={1=b}, foo={1=a, 3=c}}", table.rowMap().toString());
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCellSetToString_ordered() {
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[(bar,1)=b, (foo,1)=a, (foo,3)=c]",
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        table.cellSet().toString());
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowKeySetToString_ordered() {
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[bar, foo]", table.rowKeySet().toString());
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValuesToString_ordered() {
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[b, a, c]", table.values().toString());
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowComparator() {
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = TreeBasedTable.create();
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Ordering.natural(), sortedTable.rowComparator());
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = TreeBasedTable.create(
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Collections.reverseOrder(), Ordering.usingToString());
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Collections.reverseOrder(), sortedTable.rowComparator());
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testColumnComparator() {
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = TreeBasedTable.create();
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Ordering.natural(), sortedTable.columnComparator());
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = TreeBasedTable.create(
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Collections.reverseOrder(), Ordering.usingToString());
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Ordering.usingToString(), sortedTable.columnComparator());
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowKeySetComparator() {
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = TreeBasedTable.create();
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Ordering.natural(),
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        sortedTable.rowKeySet().comparator());
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = TreeBasedTable.create(
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Collections.reverseOrder(), Ordering.usingToString());
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Collections.reverseOrder(),
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        sortedTable.rowKeySet().comparator());
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowKeySetFirst() {
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame("bar", sortedTable.rowKeySet().first());
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowKeySetLast() {
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame("foo", sortedTable.rowKeySet().last());
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowKeySetHeadSet() {
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> set = sortedTable.rowKeySet().headSet("cat");
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singleton("bar"), set);
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    set.clear();
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(set.isEmpty());
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singleton("foo"), sortedTable.rowKeySet());
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowKeySetTailSet() {
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> set = sortedTable.rowKeySet().tailSet("cat");
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singleton("foo"), set);
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    set.clear();
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(set.isEmpty());
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singleton("bar"), sortedTable.rowKeySet());
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowKeySetSubSet() {
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = create(
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c', "dog", 2, 'd');
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> set = sortedTable.rowKeySet().subSet("cat", "egg");
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singleton("dog"), set);
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    set.clear();
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(set.isEmpty());
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of("bar", "foo"), sortedTable.rowKeySet());
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowMapComparator() {
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = TreeBasedTable.create();
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Ordering.natural(), sortedTable.rowMap().comparator());
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = TreeBasedTable.create(
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Collections.reverseOrder(), Ordering.usingToString());
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Collections.reverseOrder(), sortedTable.rowMap().comparator());
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowMapFirstKey() {
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame("bar", sortedTable.rowMap().firstKey());
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowMapLastKey() {
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame("foo", sortedTable.rowMap().lastKey());
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowKeyMapHeadMap() {
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Map<Integer, Character>> map
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = sortedTable.rowMap().headMap("cat");
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, map.size());
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(1, 'b'), map.get("bar"));
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.clear();
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(map.isEmpty());
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singleton("foo"), sortedTable.rowKeySet());
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowKeyMapTailMap() {
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Map<Integer, Character>> map
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = sortedTable.rowMap().tailMap("cat");
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, map.size());
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(1, 'a', 3, 'c'), map.get("foo"));
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.clear();
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(map.isEmpty());
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singleton("bar"), sortedTable.rowKeySet());
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowKeyMapSubMap() {
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = create(
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c', "dog", 2, 'd');
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Map<Integer, Character>> map
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = sortedTable.rowMap().subMap("cat", "egg");
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(2, 'd'), map.get("dog"));
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.clear();
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(map.isEmpty());
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of("bar", "foo"), sortedTable.rowKeySet());
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowMapValuesAreSorted(){
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sortedTable = create(
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c', "dog", 2, 'd');
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(sortedTable.rowMap().get("foo") instanceof SortedMap);
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testColumnKeySet_isSorted() {
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("a", 2,  'X',
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "a", 2,  'X',
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "b", 3,  'X',
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "b", 2,  'X',
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "c", 10, 'X',
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "c", 10, 'X',
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "c", 20, 'X',
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "d", 15, 'X',
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "d", 20, 'X',
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "d", 1,  'X',
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "e", 5,  'X'
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  );
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[1, 2, 3, 5, 10, 15, 20]", table.columnKeySet().toString());
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testColumnKeySet_isSortedWithRealComparator() {
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create(String.CASE_INSENSITIVE_ORDER,
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   Ordering.natural().reverse(),
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "a", 2,  'X',
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "a", 2,  'X',
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "b", 3,  'X',
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "b", 2,  'X',
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "c", 10, 'X',
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "c", 10, 'X',
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "c", 20, 'X',
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "d", 15, 'X',
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "d", 20, 'X',
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "d", 1,  'X',
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "e", 5,  'X'
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  );
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[20, 15, 10, 5, 3, 2, 1]", table.columnKeySet().toString());
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testColumnKeySet_empty() {
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create();
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[]", table.columnKeySet().toString());
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testColumnKeySet_oneRow() {
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("a", 2,  'X',
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "a", 1,  'X'
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  );
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[1, 2]", table.columnKeySet().toString());
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testColumnKeySet_oneColumn() {
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("a", 1,  'X',
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   "b", 1,  'X'
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  );
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[1]", table.columnKeySet().toString());
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testColumnKeySet_oneEntry() {
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("a", 1,  'X');
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[1]", table.columnKeySet().toString());
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowEntrySetContains(){
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table =
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        sortedTable =
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            create("a", 2, 'X', "a", 2, 'X', "b", 3, 'X', "b", 2, 'X', "c", 10,
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                'X', "c", 10, 'X', "c", 20, 'X', "d", 15, 'X', "d", 20, 'X',
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                "d", 1, 'X', "e", 5, 'X');
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedMap<Integer, Character> row = sortedTable.row("c");
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Map.Entry<Integer, Character>> entrySet = row.entrySet();
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.contains(Maps.immutableEntry(10, 'X')));
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.contains(Maps.immutableEntry(20, 'X')));
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(15, 'X')));
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entrySet = row.tailMap(15).entrySet();
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(10, 'X')));
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.contains(Maps.immutableEntry(20, 'X')));
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(15, 'X')));
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowEntrySetRemove(){
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table =
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        sortedTable =
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            create("a", 2, 'X', "a", 2, 'X', "b", 3, 'X', "b", 2, 'X', "c", 10,
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                'X', "c", 10, 'X', "c", 20, 'X', "d", 15, 'X', "d", 20, 'X',
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                "d", 1, 'X', "e", 5, 'X');
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedMap<Integer, Character> row = sortedTable.row("c");
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Map.Entry<Integer, Character>> entrySet = row.tailMap(15).entrySet();
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.remove(Maps.immutableEntry(10, 'X')));
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.remove(Maps.immutableEntry(20, 'X')));
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.remove(Maps.immutableEntry(15, 'X')));
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entrySet = row.entrySet();
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.remove(Maps.immutableEntry(10, 'X')));
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.remove(Maps.immutableEntry(20, 'X')));
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.remove(Maps.immutableEntry(15, 'X')));
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRowSize(){
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table =
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        sortedTable =
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            create("a", 2, 'X', "a", 2, 'X', "b", 3, 'X', "b", 2, 'X', "c", 10,
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                'X', "c", 10, 'X', "c", 20, 'X', "d", 15, 'X', "d", 20, 'X',
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                "d", 1, 'X', "e", 5, 'X');
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedMap<Integer, Character> row = sortedTable.row("c");
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(row.size(), 2);
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(row.tailMap(15).size(), 1);
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSubRowClearAndPut() {
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedMap<Integer, Character> row = (SortedMap<Integer, Character>) table.row("foo");
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedMap<Integer, Character> subRow = row.tailMap(2);
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(1, 'a', 3, 'c'), row);
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(3, 'c'), subRow);
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.remove("foo", 3);
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(1, 'a'), row);
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(), subRow);
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.remove("foo", 1);
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(), row);
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(), subRow);
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put("foo", 2, 'b');
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(2, 'b'), row);
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(2, 'b'), subRow);
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    row.clear();
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(), row);
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(), subRow);
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    table.put("foo", 5, 'x');
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(5, 'x'), row);
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(5, 'x'), subRow);
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
448