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