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 com.google.common.base.Preconditions.checkNotNull;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Function;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Functions;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Table.Cell;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.CollectionTestSuiteBuilder;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MapInterfaceTest;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.SampleElements;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.SetTestSuiteBuilder;
300888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.testing.SortedSetTestSuiteBuilder;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.TestSetGenerator;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.TestStringCollectionGenerator;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.TestStringSetGenerator;
340888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.testing.TestStringSortedSetGenerator;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.Feature;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
390888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.Test;
400888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
410888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestSuite;
420888a09821a98ac0680fad765217302858e70fa4Paul Duffin
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.SortedMap;
500888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.SortedSet;
517dd252788645e940eada959bdde927426e2531c9Paul Duffin
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Collection tests for {@link Table} implementations.
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class TableCollectionTest extends TestCase {
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Feature<?>[] COLLECTION_FEATURES = {
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CollectionSize.ANY,
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CollectionFeature.ALLOWS_NULL_QUERIES
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  };
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Feature<?>[] COLLECTION_FEATURES_ORDER = {
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CollectionSize.ANY,
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CollectionFeature.KNOWN_ORDER,
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CollectionFeature.ALLOWS_NULL_QUERIES
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  };
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Feature<?>[] COLLECTION_FEATURES_REMOVE = {
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CollectionSize.ANY,
747dd252788645e940eada959bdde927426e2531c9Paul Duffin    CollectionFeature.SUPPORTS_REMOVE,
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CollectionFeature.ALLOWS_NULL_QUERIES
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  };
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Feature<?>[] COLLECTION_FEATURES_REMOVE_ORDER = {
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CollectionSize.ANY,
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CollectionFeature.KNOWN_ORDER,
817dd252788645e940eada959bdde927426e2531c9Paul Duffin    CollectionFeature.SUPPORTS_REMOVE,
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CollectionFeature.ALLOWS_NULL_QUERIES
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  };
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("suite")
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Test suite() {
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TestSuite suite = new TestSuite();
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(ArrayRowTests.class);
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(HashRowTests.class);
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TreeRowTests.class);
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TransposeRowTests.class);
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TransformValueRowTests.class);
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(UnmodifiableHashRowTests.class);
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(UnmodifiableTreeRowTests.class);
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(ArrayColumnTests.class);
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(HashColumnTests.class);
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TreeColumnTests.class);
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TransposeColumnTests.class);
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TransformValueColumnTests.class);
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(UnmodifiableHashColumnTests.class);
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(UnmodifiableTreeColumnTests.class);
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(ArrayRowMapTests.class);
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(HashRowMapTests.class);
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TreeRowMapTests.class);
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TreeRowMapHeadMapTests.class);
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TreeRowMapTailMapTests.class);
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TreeRowMapSubMapTests.class);
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TransformValueRowMapTests.class);
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(UnmodifiableHashRowMapTests.class);
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(UnmodifiableTreeRowMapTests.class);
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(ArrayColumnMapTests.class);
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(HashColumnMapTests.class);
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TreeColumnMapTests.class);
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(TransformValueColumnMapTests.class);
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(UnmodifiableHashColumnMapTests.class);
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(UnmodifiableTreeColumnMapTests.class);
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Not testing rowKeySet() or columnKeySet() of Table.transformValues()
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // since the transformation doesn't affect the row and column key sets.
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                = ArrayTable.create(
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                    ImmutableList.copyOf(elements), ImmutableList.of(1, 2));
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.rowKeySet();
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ArrayTable.rowKeySet")
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ONE, CollectionSize.SEVERAL,
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.REJECTS_DUPLICATES_AT_CREATION,
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table = HashBasedTable.create();
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.rowKeySet();
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("HashBasedTable.rowKeySet")
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_REMOVE)
1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .withFeatures(CollectionFeature.SUPPORTS_ITERATOR_REMOVE)
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    suite.addTest(SortedSetTestSuiteBuilder.using(new TestStringSortedSetGenerator() {
1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin          @Override protected SortedSet<String> create(String[] elements) {
1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin            TreeBasedTable<String, Integer, Character> table = TreeBasedTable.create();
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.rowKeySet();
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public List<String> order(List<String> insertionOrder) {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Collections.sort(insertionOrder);
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return insertionOrder;
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TreeBasedTable.rowKeySet")
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER)
1630888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .withFeatures(CollectionFeature.SUPPORTS_ITERATOR_REMOVE)
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1657dd252788645e940eada959bdde927426e2531c9Paul Duffin
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table = HashBasedTable.create();
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableTable(table).rowKeySet();
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableTable[HashBasedTable].rowKeySet")
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES)
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            RowSortedTable<String, Integer, Character> table = TreeBasedTable.create();
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableRowSortedTable(table).rowKeySet();
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public List<String> order(List<String> insertionOrder) {
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Collections.sort(insertionOrder);
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return insertionOrder;
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableRowSortedTable[TreeBasedTable].rowKeySet")
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_ORDER)
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<Integer, String, Character> table
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                = ArrayTable.create(
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                    ImmutableList.of(1, 2), ImmutableList.copyOf(elements));
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForColumnKeySet(table, elements);
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.columnKeySet();
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ArrayTable.columnKeySet")
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ONE, CollectionSize.SEVERAL,
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.REJECTS_DUPLICATES_AT_CREATION,
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<Integer, String, Character> table = HashBasedTable.create();
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForColumnKeySet(table, elements);
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.columnKeySet();
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("HashBasedTable.columnKeySet")
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_REMOVE)
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<Integer, String, Character> table = TreeBasedTable.create();
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForColumnKeySet(table, elements);
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.columnKeySet();
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public List<String> order(List<String> insertionOrder) {
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Collections.sort(insertionOrder);
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return insertionOrder;
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TreeBasedTable.columnKeySet")
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER)
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<Integer, String, Character> table = HashBasedTable.create();
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForColumnKeySet(table, elements);
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableTable(table).columnKeySet();
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableTable[HashBasedTable].columnKeySet")
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES)
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            RowSortedTable<Integer, String, Character> table = TreeBasedTable.create();
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForColumnKeySet(table, elements);
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableRowSortedTable(table).columnKeySet();
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public List<String> order(List<String> insertionOrder) {
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Collections.sort(insertionOrder);
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return insertionOrder;
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableRowSortedTable[TreeBasedTable].columnKeySet")
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_ORDER)
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(CollectionTestSuiteBuilder.using(
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new TestStringCollectionGenerator() {
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Collection<String> create(String[] elements) {
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            List<Integer> rowKeys = Lists.newArrayList();
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (int i = 0; i < elements.length; i++) {
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              rowKeys.add(i);
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<Integer, Character, String> table
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                = ArrayTable.create(rowKeys, ImmutableList.of('a'));
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForValues(table, elements);
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.values();
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ArrayTable.values")
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ONE, CollectionSize.SEVERAL,
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES,
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER)
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(CollectionTestSuiteBuilder.using(
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new TestStringCollectionGenerator() {
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Collection<String> create(String[] elements) {
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<Integer, Character, String> table = HashBasedTable.create();
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            table.put(1, 'a', "foo");
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            table.clear();
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForValues(table, elements);
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.values();
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("HashBasedTable.values")
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_REMOVE)
2940888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .withFeatures(CollectionFeature.SUPPORTS_ITERATOR_REMOVE)
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(CollectionTestSuiteBuilder.using(
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new TestStringCollectionGenerator() {
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Collection<String> create(String[] elements) {
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<Integer, Character, String> table = TreeBasedTable.create();
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            table.put(1, 'a', "foo");
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            table.clear();
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForValues(table, elements);
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.values();
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TreeBasedTable.values")
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER)
3090888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .withFeatures(CollectionFeature.SUPPORTS_ITERATOR_REMOVE)
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Function<String, String> removeFirstCharacter
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = new Function<String, String>() {
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public String apply(String input) {
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return input.substring(1);
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        };
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(CollectionTestSuiteBuilder.using(
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new TestStringCollectionGenerator() {
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Collection<String> create(String[] elements) {
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<Integer, Character, String> table = HashBasedTable.create();
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (int i = 0; i < elements.length; i++) {
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              table.put(i, 'a', "x" + checkNotNull(elements[i]));
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.transformValues(table, removeFirstCharacter).values();
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TransformValues.values")
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_REMOVE)
3310888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .withFeatures(CollectionFeature.SUPPORTS_ITERATOR_REMOVE)
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(CollectionTestSuiteBuilder.using(
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new TestStringCollectionGenerator() {
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Collection<String> create(String[] elements) {
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<Integer, Character, String> table = HashBasedTable.create();
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            table.put(1, 'a', "foo");
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            table.clear();
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForValues(table, elements);
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableTable(table).values();
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableTable[HashBasedTable].values")
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES)
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(CollectionTestSuiteBuilder.using(
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new TestStringCollectionGenerator() {
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Collection<String> create(String[] elements) {
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            RowSortedTable<Integer, Character, String> table = TreeBasedTable.create();
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            table.put(1, 'a', "foo");
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            table.clear();
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForValues(table, elements);
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableRowSortedTable(table).values();
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableTable[TreeBasedTable].values")
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_ORDER)
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestCellSetGenerator() {
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public SampleElements<Cell<String, Integer, Character>>
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              samples() {
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return new SampleElements<Cell<String, Integer, Character>>(
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                Tables.immutableCell("bar", 1, 'a'),
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                Tables.immutableCell("bar", 2, 'b'),
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                Tables.immutableCell("bar", 3, (Character) null),
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                Tables.immutableCell("bar", 4, 'b'),
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                Tables.immutableCell("bar", 5, 'b'));
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public Set<Cell<String, Integer, Character>> create(
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Object... elements) {
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            List<Integer> columnKeys = Lists.newArrayList();
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (Object element : elements) {
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              @SuppressWarnings("unchecked")
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Cell<String, Integer, Character> cell
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  = (Cell<String, Integer, Character>) element;
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              columnKeys.add(cell.getColumnKey());
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                = ArrayTable.create(ImmutableList.of("bar"), columnKeys);
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (Object element : elements) {
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              @SuppressWarnings("unchecked")
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Cell<String, Integer, Character> cell
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  = (Cell<String, Integer, Character>) element;
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              table.put(cell.getRowKey(), cell.getColumnKey(), cell.getValue());
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.cellSet();
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override Table<String, Integer, Character> createTable() {
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            throw new UnsupportedOperationException();
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ArrayTable.cellSet")
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ONE, CollectionSize.SEVERAL,
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.REJECTS_DUPLICATES_AT_CREATION,
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestCellSetGenerator() {
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override Table<String, Integer, Character> createTable() {
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return HashBasedTable.create();
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("HashBasedTable.cellSet")
4080888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .withFeatures(CollectionSize.ANY, CollectionFeature.REMOVE_OPERATIONS,
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestCellSetGenerator() {
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override Table<String, Integer, Character> createTable() {
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return TreeBasedTable.create();
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TreeBasedTable.cellSet")
4180888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .withFeatures(CollectionSize.ANY, CollectionFeature.REMOVE_OPERATIONS,
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestCellSetGenerator() {
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override Table<String, Integer, Character> createTable() {
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<Integer, String, Character> original
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                = TreeBasedTable.create();
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.transpose(original);
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TransposedTable.cellSet")
4300888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .withFeatures(CollectionSize.ANY, CollectionFeature.REMOVE_OPERATIONS,
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestCellSetGenerator() {
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override Table<String, Integer, Character> createTable() {
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return HashBasedTable.create();
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public Set<Cell<String, Integer, Character>> create(
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Object... elements) {
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table = createTable();
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (Object element : elements) {
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              @SuppressWarnings("unchecked")
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Cell<String, Integer, Character> cell
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  = (Cell<String, Integer, Character>) element;
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              table.put(cell.getRowKey(), cell.getColumnKey(), cell.getValue());
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.transformValues(table, Functions.<Character>identity()).cellSet();
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TransformValues.cellSet")
4527dd252788645e940eada959bdde927426e2531c9Paul Duffin        .withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_QUERIES,
4530888a09821a98ac0680fad765217302858e70fa4Paul Duffin            CollectionFeature.REMOVE_OPERATIONS)
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestCellSetGenerator() {
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override Table<String, Integer, Character> createTable() {
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableTable(HashBasedTable.<String, Integer, Character> create());
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public Set<Cell<String, Integer, Character>> create(
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Object... elements) {
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table = HashBasedTable.create();
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (Object element : elements) {
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              @SuppressWarnings("unchecked")
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Cell<String, Integer, Character> cell
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  = (Cell<String, Integer, Character>) element;
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              table.put(cell.getRowKey(), cell.getColumnKey(), cell.getValue());
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableTable(table).cellSet();
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableTable[HashBasedTable].cellSet")
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_QUERIES)
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestCellSetGenerator() {
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override RowSortedTable<String, Integer, Character> createTable() {
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableRowSortedTable(TreeBasedTable
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                .<String, Integer, Character> create());
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public Set<Cell<String, Integer, Character>> create(
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Object... elements) {
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            RowSortedTable<String, Integer, Character> table = TreeBasedTable.create();
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (Object element : elements) {
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              @SuppressWarnings("unchecked")
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Cell<String, Integer, Character> cell
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  = (Cell<String, Integer, Character>) element;
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              table.put(cell.getRowKey(), cell.getColumnKey(), cell.getValue());
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableRowSortedTable(table).cellSet();
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableRowSortedTable[TreeBasedTable].cellSet")
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_QUERIES)
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Iterable<String> rowKeys = ImmutableSet.copyOf(elements);
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Iterable<Integer> columnKeys = ImmutableList.of(1, 2, 3);
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                = ArrayTable.create(rowKeys, columnKeys);
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.column(1).keySet();
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ArrayTable.column.keySet")
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ONE, CollectionSize.SEVERAL,
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table = HashBasedTable.create();
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.column(1).keySet();
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("HashBasedTable.column.keySet")
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_REMOVE)
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    .createTestSuite());
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table = TreeBasedTable.create();
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.column(1).keySet();
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public List<String> order(List<String> insertionOrder) {
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Collections.sort(insertionOrder);
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return insertionOrder;
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TreeBasedTable.column.keySet")
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER)
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table = HashBasedTable.create();
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.transformValues(table, Functions.toStringFunction()).column(1).keySet();
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TransformValues.column.keySet")
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_REMOVE)
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    .createTestSuite());
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table = HashBasedTable.create();
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableTable(table).column(1).keySet();
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableTable[HashBasedTable].column.keySet")
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES)
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    .createTestSuite());
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            RowSortedTable<String, Integer, Character> table = TreeBasedTable.create();
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableRowSortedTable(table).column(1).keySet();
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public List<String> order(List<String> insertionOrder) {
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Collections.sort(insertionOrder);
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return insertionOrder;
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableRowSortedTable[TreeBasedTable].column.keySet")
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_ORDER)
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return suite;
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void populateForRowKeySet(
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Integer, Character> table, String[] elements) {
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String row : elements) {
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(row, 1, 'a');
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(row, 2, 'b');
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void populateForColumnKeySet(
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Integer, String, Character> table, String[] elements) {
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String column : elements) {
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, column, 'a');
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(2, column, 'b');
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void populateForValues(
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Integer, Character, String> table, String[] elements) {
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < elements.length; i++) {
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(i, 'a', elements[i]);
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class TestCellSetGenerator
6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      implements TestSetGenerator<Cell<String, Integer, Character>> {
6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public SampleElements<Cell<String, Integer, Character>> samples() {
6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return new SampleElements<Cell<String, Integer, Character>>(
6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Tables.immutableCell("bar", 1, 'a'),
6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Tables.immutableCell("bar", 2, 'b'),
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Tables.immutableCell("foo", 3, 'c'),
6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Tables.immutableCell("bar", 1, 'b'),
6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Tables.immutableCell("cat", 2, 'b'));
6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Set<Cell<String, Integer, Character>> create(
6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Object... elements) {
6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Integer, Character> table = createTable();
6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (Object element : elements) {
6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @SuppressWarnings("unchecked")
6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Cell<String, Integer, Character> cell
6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            = (Cell<String, Integer, Character>) element;
6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        table.put(cell.getRowKey(), cell.getColumnKey(), cell.getValue());
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.cellSet();
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    abstract Table<String, Integer, Character> createTable();
6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unchecked")
6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Cell<String, Integer, Character>[] createArray(int length) {
6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (Cell<String, Integer, Character>[]) new Cell<?, ?, ?>[length];
6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public List<Cell<String, Integer, Character>> order(
6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        List<Cell<String, Integer, Character>> insertionOrder) {
6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return insertionOrder;
6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class MapTests
6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends MapInterfaceTest<String, Integer> {
6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    MapTests(boolean allowsNullValues, boolean supportsPut, boolean supportsRemove,
6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean supportsClear, boolean supportsIteratorRemove) {
6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, allowsNullValues, supportsPut, supportsRemove, supportsClear,
6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          supportsIteratorRemove);
6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "four";
6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getValueNotInPopulatedMap() {
6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return 4;
6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class RowTests extends MapTests {
6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    RowTests(boolean allowsNullValues, boolean supportsPut, boolean supportsRemove,
6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean supportsClear, boolean supportsIteratorRemove) {
6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(allowsNullValues, supportsPut, supportsRemove, supportsClear,
6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          supportsIteratorRemove);
6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    abstract Table<Character, String, Integer> makeTable();
6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makeEmptyMap() {
6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return makeTable().row('a');
6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Character, String, Integer> table = makeTable();
6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "one", 1);
6781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "two", 2);
6791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "three", 3);
6801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('b', "four", 4);
6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.row('a');
6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("TODO(hhchan): ArrayTable")
6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class ArrayRowTests extends RowTests {
6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public ArrayRowTests() {
6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(true, true, false, false, false);
6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makeEmptyMap() {
6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Table<Character, String, Integer> makeTable() {
7001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ArrayTable.create(Arrays.asList('a', 'b', 'c'),
7011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Arrays.asList("one", "two", "three", "four"));
7021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class HashRowTests extends RowTests {
7061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public HashRowTests() {
7071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true, true);
7081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Character, String, Integer> makeTable() {
7111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return HashBasedTable.create();
7121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeRowTests extends RowTests {
7161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeRowTests() {
7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true, true);
7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Character, String, Integer> makeTable() {
7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return TreeBasedTable.create();
7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TransposeRowTests extends RowTests {
7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TransposeRowTests() {
7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true, false);
7281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Character, String, Integer> makeTable() {
7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Character, Integer> original = TreeBasedTable.create();
7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transpose(original);
7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Function<Integer, Integer> DIVIDE_BY_2
7371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      = new Function<Integer, Integer>() {
7381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override public Integer apply(Integer input) {
7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return (input == null) ? null : input / 2;
7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
7411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  };
7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TransformValueRowTests extends RowTests {
7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TransformValueRowTests() {
7451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, true, true, true);
7461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Character, String, Integer> makeTable() {
7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Character, String, Integer> table = HashBasedTable.create();
7501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(table, DIVIDE_BY_2);
7511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
7541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Character, String, Integer> table = HashBasedTable.create();
7551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "one", 2);
7561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "two", 4);
7571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "three", 6);
7581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('b', "four", 8);
7591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(table, DIVIDE_BY_2).row('a');
7601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableHashRowTests extends RowTests {
7641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableHashRowTests() {
7651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false, false);
7661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Character, String, Integer> makeTable() {
7691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Character, String, Integer> table = HashBasedTable.create();
7701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(table);
7711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
7741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Character, String, Integer> table = HashBasedTable.create();
7751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "one", 1);
7761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "two", 2);
7771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "three", 3);
7781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('b', "four", 4);
7791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(table).row('a');
7801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableTreeRowTests extends RowTests {
7841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableTreeRowTests() {
7851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false, false);
7861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Character, String, Integer> makeTable() {
7891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<Character, String, Integer> table = TreeBasedTable.create();
7901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(table);
7911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
7941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<Character, String, Integer> table = TreeBasedTable.create();
7951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "one", 1);
7961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "two", 2);
7971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "three", 3);
7981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('b', "four", 4);
7991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(table).row('a');
8001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class ColumnTests extends MapTests {
8041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ColumnTests(boolean allowsNullValues, boolean supportsPut, boolean supportsRemove,
8051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean supportsClear, boolean supportsIteratorRemove) {
8061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(allowsNullValues, supportsPut, supportsRemove, supportsClear,
8071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          supportsIteratorRemove);
8081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    abstract Table<String, Character, Integer> makeTable();
8111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makeEmptyMap() {
8131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return makeTable().column('a');
8141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
8171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Character, Integer> table = makeTable();
8181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("one", 'a', 1);
8191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("two", 'a', 2);
8201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("three", 'a', 3);
8211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("four", 'b', 4);
8221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.column('a');
8231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("TODO(hhchan): ArrayTable")
8271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class ArrayColumnTests extends ColumnTests {
8281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public ArrayColumnTests() {
8291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(true, true, false, false, false);
8301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
8331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
8341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makeEmptyMap() {
8371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
8381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Character, Integer> makeTable() {
8411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ArrayTable.create(Arrays.asList("one", "two", "three", "four"),
8421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Arrays.asList('a', 'b', 'c'));
8431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class HashColumnTests extends ColumnTests {
8471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public HashColumnTests() {
8481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true, false);
8491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Character, Integer> makeTable() {
8521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return HashBasedTable.create();
8531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeColumnTests extends ColumnTests {
8571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeColumnTests() {
8581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true, false);
8591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Character, Integer> makeTable() {
8621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return TreeBasedTable.create();
8631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TransposeColumnTests extends ColumnTests {
8671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TransposeColumnTests() {
8681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true, true);
8691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Character, Integer> makeTable() {
8721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Character, String, Integer> original = TreeBasedTable.create();
8731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transpose(original);
8741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TransformValueColumnTests extends ColumnTests {
8781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TransformValueColumnTests() {
8791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, true, true, false);
8801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Character, Integer> makeTable() {
8831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Character, Integer> table = HashBasedTable.create();
8841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(table, DIVIDE_BY_2);
8851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
8881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Character, Integer> table = HashBasedTable.create();
8891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("one", 'a', 1);
8901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("two", 'a', 2);
8911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("three", 'a', 3);
8921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("four", 'b', 4);
8931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(table, DIVIDE_BY_2).column('a');
8941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableHashColumnTests extends ColumnTests {
8981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableHashColumnTests() {
8991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false, false);
9001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Character, Integer> makeTable() {
9031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Character, Integer> table = HashBasedTable.create();
9041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(table);
9051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
9081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Character, Integer> table = HashBasedTable.create();
9091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("one", 'a', 1);
9101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("two", 'a', 2);
9111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("three", 'a', 3);
9121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("four", 'b', 4);
9131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(table).column('a');
9141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableTreeColumnTests extends ColumnTests {
9181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableTreeColumnTests() {
9191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false, false);
9201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Character, Integer> makeTable() {
9231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<String, Character, Integer> table = TreeBasedTable.create();
9241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(table);
9251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
9281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<String, Character, Integer> table = TreeBasedTable.create();
9291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("one", 'a', 1);
9301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("two", 'a', 2);
9311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("three", 'a', 3);
9321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("four", 'b', 4);
9331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(table).column('a');
9341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class MapMapTests
9381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends MapInterfaceTest<String, Map<Integer, Character>> {
9391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    MapMapTests(boolean allowsNullValues, boolean supportsRemove,
9411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean supportsClear, boolean supportsIteratorRemove) {
9421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, allowsNullValues, false, supportsRemove, supportsClear,
9431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          supportsIteratorRemove);
9441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
9471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "cat";
9481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<Integer, Character> getValueNotInPopulatedMap() {
9511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableMap.of();
9521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
9551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * The version of this test supplied by {@link MapInterfaceTest} fails for
9561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * this particular map implementation, because {@code map.get()} returns a
9571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * view collection that changes in the course of a call to {@code remove()}.
9581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Thus, the expectation doesn't hold that {@code map.remove(x)} returns the
9591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * same value which {@code map.get(x)} did immediately beforehand.
9601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
9611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public void testRemove() {
9621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final Map<String, Map<Integer, Character>> map;
9631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final String keyToRemove;
9641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
9651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        map = makePopulatedMap();
9661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (UnsupportedOperationException e) {
9671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return;
9681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
9691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      keyToRemove = map.keySet().iterator().next();
9701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (supportsRemove) {
9711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        int initialSize = map.size();
9721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        map.get(keyToRemove);
9731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        map.remove(keyToRemove);
9741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // This line doesn't hold - see the Javadoc comments above.
9751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // assertEquals(expectedValue, oldValue);
9761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertFalse(map.containsKey(keyToRemove));
9771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(initialSize - 1, map.size());
9781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } else {
9791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
9801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          map.remove(keyToRemove);
9811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          fail("Expected UnsupportedOperationException.");
9821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (UnsupportedOperationException e) {
9831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          // Expected.
9841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
9851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
9861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertInvariants(map);
9871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class RowMapTests extends MapMapTests {
9911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    RowMapTests(boolean allowsNullValues, boolean supportsRemove,
9921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean supportsClear, boolean supportsIteratorRemove) {
9931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(allowsNullValues, supportsRemove, supportsClear,
9941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          supportsIteratorRemove);
9951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    abstract Table<String, Integer, Character> makeTable();
9981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>>
10001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        makePopulatedMap() {
10011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Integer, Character> table = makeTable();
10021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      populateTable(table);
10031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.rowMap();
10041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    void populateTable(Table<String, Integer, Character> table) {
10071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 1, 'a');
10081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("bar", 1, 'b');
10091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 3, 'c');
10101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>> makeEmptyMap() {
10131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return makeTable().rowMap();
10141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("TODO(hhchan): ArrayTable")
10181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class ArrayRowMapTests extends RowMapTests {
10191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public ArrayRowMapTests() {
10201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(true, false, false, false);
10211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Integer, Character> makeTable() {
10241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ArrayTable.create(Arrays.asList("foo", "bar", "dog"),
10251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Arrays.asList(1, 2, 3));
10261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>> makeEmptyMap() {
10291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
10301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class HashRowMapTests extends RowMapTests {
10341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public HashRowMapTests() {
10351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true);
10361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Integer, Character> makeTable() {
10391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return HashBasedTable.create();
10401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeRowMapTests extends RowMapTests {
10441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeRowMapTests() {
10451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true);
10461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Integer, Character> makeTable() {
10491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return TreeBasedTable.create();
10501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeRowMapHeadMapTests extends RowMapTests {
10541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeRowMapHeadMapTests() {
10551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true);
10561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override TreeBasedTable<String, Integer, Character> makeTable() {
10591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, Integer, Character> table =
10601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          TreeBasedTable.create();
10611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("z", 1, 'a');
10621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table;
10631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>>
10661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        makePopulatedMap() {
10671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, Integer, Character> table = makeTable();
10681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      populateTable(table);
10691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.rowMap().headMap("x");
10701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>> makeEmptyMap() {
10731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return makeTable().rowMap().headMap("x");
10741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
10771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "z";
10781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeRowMapTailMapTests extends RowMapTests {
10821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeRowMapTailMapTests() {
10831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true);
10841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override TreeBasedTable<String, Integer, Character> makeTable() {
10871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, Integer, Character> table =
10881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          TreeBasedTable.create();
10891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("a", 1, 'a');
10901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table;
10911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>>
10941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        makePopulatedMap() {
10951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, Integer, Character> table = makeTable();
10961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      populateTable(table);
10971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.rowMap().tailMap("b");
10981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>> makeEmptyMap() {
11011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return makeTable().rowMap().tailMap("b");
11021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
11051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "a";
11061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeRowMapSubMapTests extends RowMapTests {
11101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeRowMapSubMapTests() {
11111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true);
11121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override TreeBasedTable<String, Integer, Character> makeTable() {
11151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, Integer, Character> table =
11161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          TreeBasedTable.create();
11171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("a", 1, 'a');
11181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("z", 1, 'a');
11191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table;
11201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>>
11231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        makePopulatedMap() {
11241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, Integer, Character> table = makeTable();
11251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      populateTable(table);
11261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.rowMap().subMap("b", "x");
11271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>> makeEmptyMap() {
11301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return makeTable().rowMap().subMap("b", "x");
11311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
11341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "z";
11351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Function<String, Character> FIRST_CHARACTER =
11391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      new Function<String, Character>() {
11401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override
11411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        public Character apply(String input) {
11421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return input == null ? null : input.charAt(0);
11431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
11441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      };
11451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TransformValueRowMapTests extends RowMapTests {
11471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TransformValueRowMapTests() {
11481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true);
11491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Integer, Character> makeTable() {
11521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Integer, String> original = HashBasedTable.create();
11531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(original, FIRST_CHARACTER);
11541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
11571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected Map<String, Map<Integer, Character>> makePopulatedMap() {
11581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Integer, String> table = HashBasedTable.create();
11591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 1, "apple");
11601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("bar", 1, "banana");
11611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 3, "cat");
11621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(table, FIRST_CHARACTER).rowMap();
11631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableHashRowMapTests extends RowMapTests {
11671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableHashRowMapTests() {
11681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false);
11691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Integer, Character> makeTable() {
11721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Integer, Character> original = HashBasedTable.create();
11731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(original);
11741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
11771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected Map<String, Map<Integer, Character>> makePopulatedMap() {
11781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Integer, Character> table = HashBasedTable.create();
11791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 1, 'a');
11801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("bar", 1, 'b');
11811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 3, 'c');
11821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(table).rowMap();
11831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableTreeRowMapTests extends RowMapTests {
11871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableTreeRowMapTests() {
11881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false);
11891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override RowSortedTable<String, Integer, Character> makeTable() {
11921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<String, Integer, Character> original = TreeBasedTable.create();
11931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(original);
11941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
11971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected SortedMap<String, Map<Integer, Character>> makePopulatedMap() {
11981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<String, Integer, Character> table = TreeBasedTable.create();
11991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 1, 'a');
12001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("bar", 1, 'b');
12011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 3, 'c');
12021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(table).rowMap();
12031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class ColumnMapTests extends MapMapTests {
12071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ColumnMapTests(boolean allowsNullValues, boolean supportsRemove,
12081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean supportsClear, boolean supportsIteratorRemove) {
12091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(allowsNullValues, supportsRemove, supportsClear,
12101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          supportsIteratorRemove);
12111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    abstract Table<Integer, String, Character> makeTable();
12141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>>
12161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        makePopulatedMap() {
12171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Integer, String, Character> table = makeTable();
12181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "foo", 'a');
12191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "bar", 'b');
12201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(3, "foo", 'c');
12211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.columnMap();
12221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>> makeEmptyMap() {
12251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return makeTable().columnMap();
12261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("TODO(hhchan): ArrayTable")
12301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class ArrayColumnMapTests extends ColumnMapTests {
12311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public ArrayColumnMapTests() {
12321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(true, false, false, false);
12331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Integer, String, Character> makeTable() {
12361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ArrayTable.create(Arrays.asList(1, 2, 3),
12371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Arrays.asList("foo", "bar", "dog"));
12381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>> makeEmptyMap() {
12411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
12421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class HashColumnMapTests extends ColumnMapTests {
12461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public HashColumnMapTests() {
12471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, false);
12481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Integer, String, Character> makeTable() {
12511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return HashBasedTable.create();
12521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeColumnMapTests extends ColumnMapTests {
12561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeColumnMapTests() {
12571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, false);
12581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Integer, String, Character> makeTable() {
12611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return TreeBasedTable.create();
12621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TransformValueColumnMapTests extends ColumnMapTests {
12661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TransformValueColumnMapTests() {
12671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, false);
12681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Integer, String, Character> makeTable() {
12711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Integer, String, String> original = HashBasedTable.create();
12721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(original, FIRST_CHARACTER);
12731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
12761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected Map<String, Map<Integer, Character>> makePopulatedMap() {
12771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Integer, String, String> table = HashBasedTable.create();
12781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "foo", "apple");
12791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "bar", "banana");
12801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(3, "foo", "cat");
12811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(table, FIRST_CHARACTER).columnMap();
12821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableHashColumnMapTests extends ColumnMapTests {
12861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableHashColumnMapTests() {
12871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false);
12881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Integer, String, Character> makeTable() {
12911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Integer, String, Character> original = HashBasedTable.create();
12921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(original);
12931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
12961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected Map<String, Map<Integer, Character>> makePopulatedMap() {
12971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Integer, String, Character> table = HashBasedTable.create();
12981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "foo", 'a');
12991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "bar", 'b');
13001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(3, "foo", 'c');
13011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(table).columnMap();
13021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableTreeColumnMapTests extends ColumnMapTests {
13061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableTreeColumnMapTests() {
13071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false);
13081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Integer, String, Character> makeTable() {
13111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<Integer, String, Character> original = TreeBasedTable.create();
13121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(original);
13131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
13161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected Map<String, Map<Integer, Character>> makePopulatedMap() {
13171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<Integer, String, Character> table = TreeBasedTable.create();
13181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "foo", 'a');
13191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "bar", 'b');
13201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(3, "foo", 'c');
13211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(table).columnMap();
13221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
1325