TableCollectionTest.java revision 7dd252788645e940eada959bdde927426e2531c9
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 java.util.Arrays;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.SortedMap;
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
477dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.Test;
487dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.TestCase;
497dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.TestSuite;
507dd252788645e940eada959bdde927426e2531c9Paul Duffin
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,
737dd252788645e940eada959bdde927426e2531c9Paul Duffin    CollectionFeature.SUPPORTS_REMOVE,
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,
807dd252788645e940eada959bdde927426e2531c9Paul Duffin    CollectionFeature.SUPPORTS_REMOVE,
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());
2177dd252788645e940eada959bdde927426e2531c9Paul Duffin
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")
4617dd252788645e940eada959bdde927426e2531c9Paul Duffin        .withFeatures(CollectionSize.ANY, CollectionFeature.SUPPORTS_REMOVE,
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")
4717dd252788645e940eada959bdde927426e2531c9Paul Duffin        .withFeatures(CollectionSize.ANY, CollectionFeature.SUPPORTS_REMOVE,
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")
4837dd252788645e940eada959bdde927426e2531c9Paul Duffin        .withFeatures(CollectionSize.ANY, CollectionFeature.SUPPORTS_REMOVE,
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")
5057dd252788645e940eada959bdde927426e2531c9Paul Duffin        .withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_QUERIES,
5067dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SUPPORTS_REMOVE)
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestCellSetGenerator() {
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override Table<String, Integer, Character> createTable() {
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableTable(HashBasedTable.<String, Integer, Character> create());
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public Set<Cell<String, Integer, Character>> create(
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Object... elements) {
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table = HashBasedTable.create();
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (Object element : elements) {
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              @SuppressWarnings("unchecked")
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Cell<String, Integer, Character> cell
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  = (Cell<String, Integer, Character>) element;
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              table.put(cell.getRowKey(), cell.getColumnKey(), cell.getValue());
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableTable(table).cellSet();
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableTable[HashBasedTable].cellSet")
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_QUERIES)
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestCellSetGenerator() {
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override RowSortedTable<String, Integer, Character> createTable() {
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableRowSortedTable(TreeBasedTable
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                .<String, Integer, Character> create());
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public Set<Cell<String, Integer, Character>> create(
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Object... elements) {
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            RowSortedTable<String, Integer, Character> table = TreeBasedTable.create();
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (Object element : elements) {
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              @SuppressWarnings("unchecked")
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Cell<String, Integer, Character> cell
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  = (Cell<String, Integer, Character>) element;
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              table.put(cell.getRowKey(), cell.getColumnKey(), cell.getValue());
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableRowSortedTable(table).cellSet();
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableRowSortedTable[TreeBasedTable].cellSet")
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_QUERIES)
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Iterable<String> rowKeys = ImmutableSet.copyOf(elements);
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Iterable<Integer> columnKeys = ImmutableList.of(1, 2, 3);
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                = ArrayTable.create(rowKeys, columnKeys);
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.column(1).keySet();
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ArrayTable.column.keySet")
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ONE, CollectionSize.SEVERAL,
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table = HashBasedTable.create();
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.column(1).keySet();
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("HashBasedTable.column.keySet")
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_REMOVE)
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(getIteratorUnknownOrderRemoveSupportedMethod())
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    .createTestSuite());
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table = TreeBasedTable.create();
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return table.column(1).keySet();
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public List<String> order(List<String> insertionOrder) {
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Collections.sort(insertionOrder);
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return insertionOrder;
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TreeBasedTable.column.keySet")
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_REMOVE_ORDER)
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(getIteratorKnownOrderRemoveSupportedMethod())
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table = HashBasedTable.create();
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.transformValues(table, Functions.toStringFunction()).column(1).keySet();
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TransformValues.column.keySet")
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_REMOVE)
6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(getIteratorUnknownOrderRemoveSupportedMethod())
6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    .createTestSuite());
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Table<String, Integer, Character> table = HashBasedTable.create();
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableTable(table).column(1).keySet();
6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableTable[HashBasedTable].column.keySet")
6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES)
6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(getIteratorUnknownOrderRemoveSupportedMethod())
6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    .createTestSuite());
6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            RowSortedTable<String, Integer, Character> table = TreeBasedTable.create();
6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            populateForRowKeySet(table, elements);
6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Tables.unmodifiableRowSortedTable(table).column(1).keySet();
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public List<String> order(List<String> insertionOrder) {
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Collections.sort(insertionOrder);
6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return insertionOrder;
6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableRowSortedTable[TreeBasedTable].column.keySet")
6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(COLLECTION_FEATURES_ORDER)
6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(getIteratorKnownOrderRemoveSupportedMethod())
6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return suite;
6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void populateForRowKeySet(
6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Integer, Character> table, String[] elements) {
6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String row : elements) {
6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(row, 1, 'a');
6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(row, 2, 'b');
6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void populateForColumnKeySet(
6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Integer, String, Character> table, String[] elements) {
6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String column : elements) {
6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, column, 'a');
6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(2, column, 'b');
6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void populateForValues(
6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Integer, Character, String> table, String[] elements) {
6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < elements.length; i++) {
6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(i, 'a', elements[i]);
6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class TestCellSetGenerator
6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      implements TestSetGenerator<Cell<String, Integer, Character>> {
6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public SampleElements<Cell<String, Integer, Character>> samples() {
6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return new SampleElements<Cell<String, Integer, Character>>(
6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Tables.immutableCell("bar", 1, 'a'),
6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Tables.immutableCell("bar", 2, 'b'),
6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Tables.immutableCell("foo", 3, 'c'),
6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Tables.immutableCell("bar", 1, 'b'),
6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Tables.immutableCell("cat", 2, 'b'));
6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Set<Cell<String, Integer, Character>> create(
6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Object... elements) {
6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Integer, Character> table = createTable();
6781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (Object element : elements) {
6791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @SuppressWarnings("unchecked")
6801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Cell<String, Integer, Character> cell
6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            = (Cell<String, Integer, Character>) element;
6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        table.put(cell.getRowKey(), cell.getColumnKey(), cell.getValue());
6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.cellSet();
6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    abstract Table<String, Integer, Character> createTable();
6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unchecked")
6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Cell<String, Integer, Character>[] createArray(int length) {
6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (Cell<String, Integer, Character>[]) new Cell<?, ?, ?>[length];
6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public List<Cell<String, Integer, Character>> order(
6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        List<Cell<String, Integer, Character>> insertionOrder) {
6981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return insertionOrder;
6991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class MapTests
7031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends MapInterfaceTest<String, Integer> {
7041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    MapTests(boolean allowsNullValues, boolean supportsPut, boolean supportsRemove,
7061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean supportsClear, boolean supportsIteratorRemove) {
7071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, allowsNullValues, supportsPut, supportsRemove, supportsClear,
7081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          supportsIteratorRemove);
7091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
7121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "four";
7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getValueNotInPopulatedMap() {
7161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return 4;
7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class RowTests extends MapTests {
7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    RowTests(boolean allowsNullValues, boolean supportsPut, boolean supportsRemove,
7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean supportsClear, boolean supportsIteratorRemove) {
7231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(allowsNullValues, supportsPut, supportsRemove, supportsClear,
7241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          supportsIteratorRemove);
7251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    abstract Table<Character, String, Integer> makeTable();
7281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makeEmptyMap() {
7301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return makeTable().row('a');
7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Character, String, Integer> table = makeTable();
7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "one", 1);
7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "two", 2);
7371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "three", 3);
7381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('b', "four", 4);
7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.row('a');
7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("TODO(hhchan): ArrayTable")
7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class ArrayRowTests extends RowTests {
7451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public ArrayRowTests() {
7461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(true, true, false, false, false);
7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
7501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
7511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makeEmptyMap() {
7541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
7551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Table<Character, String, Integer> makeTable() {
7581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ArrayTable.create(Arrays.asList('a', 'b', 'c'),
7591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Arrays.asList("one", "two", "three", "four"));
7601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class HashRowTests extends RowTests {
7641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public HashRowTests() {
7651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true, true);
7661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Character, String, Integer> makeTable() {
7691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return HashBasedTable.create();
7701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeRowTests extends RowTests {
7741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeRowTests() {
7751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true, true);
7761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Character, String, Integer> makeTable() {
7791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return TreeBasedTable.create();
7801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TransposeRowTests extends RowTests {
7841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TransposeRowTests() {
7851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true, false);
7861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Character, String, Integer> makeTable() {
7891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Character, Integer> original = TreeBasedTable.create();
7901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transpose(original);
7911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Function<Integer, Integer> DIVIDE_BY_2
7951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      = new Function<Integer, Integer>() {
7961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override public Integer apply(Integer input) {
7971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return (input == null) ? null : input / 2;
7981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
7991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  };
8001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TransformValueRowTests extends RowTests {
8021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TransformValueRowTests() {
8031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, true, true, true);
8041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Character, String, Integer> makeTable() {
8071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Character, String, Integer> table = HashBasedTable.create();
8081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(table, DIVIDE_BY_2);
8091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
8121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Character, String, Integer> table = HashBasedTable.create();
8131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "one", 2);
8141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "two", 4);
8151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "three", 6);
8161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('b', "four", 8);
8171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(table, DIVIDE_BY_2).row('a');
8181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableHashRowTests extends RowTests {
8221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableHashRowTests() {
8231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false, false);
8241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Character, String, Integer> makeTable() {
8271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Character, String, Integer> table = HashBasedTable.create();
8281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(table);
8291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
8321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Character, String, Integer> table = HashBasedTable.create();
8331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "one", 1);
8341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "two", 2);
8351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "three", 3);
8361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('b', "four", 4);
8371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(table).row('a');
8381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableTreeRowTests extends RowTests {
8421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableTreeRowTests() {
8431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false, false);
8441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Character, String, Integer> makeTable() {
8471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<Character, String, Integer> table = TreeBasedTable.create();
8481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(table);
8491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
8521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<Character, String, Integer> table = TreeBasedTable.create();
8531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "one", 1);
8541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "two", 2);
8551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('a', "three", 3);
8561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put('b', "four", 4);
8571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(table).row('a');
8581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class ColumnTests extends MapTests {
8621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ColumnTests(boolean allowsNullValues, boolean supportsPut, boolean supportsRemove,
8631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean supportsClear, boolean supportsIteratorRemove) {
8641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(allowsNullValues, supportsPut, supportsRemove, supportsClear,
8651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          supportsIteratorRemove);
8661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    abstract Table<String, Character, Integer> makeTable();
8691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makeEmptyMap() {
8711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return makeTable().column('a');
8721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
8751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Character, Integer> table = makeTable();
8761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("one", 'a', 1);
8771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("two", 'a', 2);
8781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("three", 'a', 3);
8791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("four", 'b', 4);
8801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.column('a');
8811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("TODO(hhchan): ArrayTable")
8851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class ArrayColumnTests extends ColumnTests {
8861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public ArrayColumnTests() {
8871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(true, true, false, false, false);
8881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
8911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
8921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makeEmptyMap() {
8951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
8961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Character, Integer> makeTable() {
8991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ArrayTable.create(Arrays.asList("one", "two", "three", "four"),
9001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Arrays.asList('a', 'b', 'c'));
9011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class HashColumnTests extends ColumnTests {
9051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public HashColumnTests() {
9061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true, false);
9071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Character, Integer> makeTable() {
9101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return HashBasedTable.create();
9111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeColumnTests extends ColumnTests {
9151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeColumnTests() {
9161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true, false);
9171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Character, Integer> makeTable() {
9201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return TreeBasedTable.create();
9211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TransposeColumnTests extends ColumnTests {
9251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TransposeColumnTests() {
9261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true, true);
9271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Character, Integer> makeTable() {
9301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Character, String, Integer> original = TreeBasedTable.create();
9311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transpose(original);
9321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TransformValueColumnTests extends ColumnTests {
9361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TransformValueColumnTests() {
9371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, true, true, false);
9381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Character, Integer> makeTable() {
9411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Character, Integer> table = HashBasedTable.create();
9421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(table, DIVIDE_BY_2);
9431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
9461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Character, Integer> table = HashBasedTable.create();
9471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("one", 'a', 1);
9481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("two", 'a', 2);
9491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("three", 'a', 3);
9501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("four", 'b', 4);
9511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(table, DIVIDE_BY_2).column('a');
9521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableHashColumnTests extends ColumnTests {
9561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableHashColumnTests() {
9571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false, false);
9581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Character, Integer> makeTable() {
9611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Character, Integer> table = HashBasedTable.create();
9621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(table);
9631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
9661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Character, Integer> table = HashBasedTable.create();
9671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("one", 'a', 1);
9681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("two", 'a', 2);
9691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("three", 'a', 3);
9701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("four", 'b', 4);
9711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(table).column('a');
9721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableTreeColumnTests extends ColumnTests {
9761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableTreeColumnTests() {
9771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false, false);
9781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Character, Integer> makeTable() {
9811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<String, Character, Integer> table = TreeBasedTable.create();
9821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(table);
9831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
9861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<String, Character, Integer> table = TreeBasedTable.create();
9871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("one", 'a', 1);
9881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("two", 'a', 2);
9891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("three", 'a', 3);
9901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("four", 'b', 4);
9911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(table).column('a');
9921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class MapMapTests
9961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends MapInterfaceTest<String, Map<Integer, Character>> {
9971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    MapMapTests(boolean allowsNullValues, boolean supportsRemove,
9991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean supportsClear, boolean supportsIteratorRemove) {
10001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, allowsNullValues, false, supportsRemove, supportsClear,
10011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          supportsIteratorRemove);
10021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
10051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "cat";
10061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<Integer, Character> getValueNotInPopulatedMap() {
10091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableMap.of();
10101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
10131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * The version of this test supplied by {@link MapInterfaceTest} fails for
10141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * this particular map implementation, because {@code map.get()} returns a
10151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * view collection that changes in the course of a call to {@code remove()}.
10161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Thus, the expectation doesn't hold that {@code map.remove(x)} returns the
10171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * same value which {@code map.get(x)} did immediately beforehand.
10181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
10191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public void testRemove() {
10201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final Map<String, Map<Integer, Character>> map;
10211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final String keyToRemove;
10221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
10231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        map = makePopulatedMap();
10241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (UnsupportedOperationException e) {
10251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return;
10261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
10271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      keyToRemove = map.keySet().iterator().next();
10281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (supportsRemove) {
10291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        int initialSize = map.size();
10301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        map.get(keyToRemove);
10311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        map.remove(keyToRemove);
10321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // This line doesn't hold - see the Javadoc comments above.
10331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // assertEquals(expectedValue, oldValue);
10341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertFalse(map.containsKey(keyToRemove));
10351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(initialSize - 1, map.size());
10361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } else {
10371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        try {
10381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          map.remove(keyToRemove);
10391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          fail("Expected UnsupportedOperationException.");
10401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } catch (UnsupportedOperationException e) {
10411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          // Expected.
10421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
10431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
10441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertInvariants(map);
10451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class RowMapTests extends MapMapTests {
10491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    RowMapTests(boolean allowsNullValues, boolean supportsRemove,
10501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean supportsClear, boolean supportsIteratorRemove) {
10511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(allowsNullValues, supportsRemove, supportsClear,
10521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          supportsIteratorRemove);
10531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    abstract Table<String, Integer, Character> makeTable();
10561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>>
10581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        makePopulatedMap() {
10591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Integer, Character> table = makeTable();
10601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      populateTable(table);
10611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.rowMap();
10621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    void populateTable(Table<String, Integer, Character> table) {
10651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 1, 'a');
10661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("bar", 1, 'b');
10671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 3, 'c');
10681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>> makeEmptyMap() {
10711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return makeTable().rowMap();
10721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("TODO(hhchan): ArrayTable")
10761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class ArrayRowMapTests extends RowMapTests {
10771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public ArrayRowMapTests() {
10781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(true, false, false, false);
10791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Integer, Character> makeTable() {
10821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ArrayTable.create(Arrays.asList("foo", "bar", "dog"),
10831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Arrays.asList(1, 2, 3));
10841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>> makeEmptyMap() {
10871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
10881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class HashRowMapTests extends RowMapTests {
10921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public HashRowMapTests() {
10931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true);
10941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Integer, Character> makeTable() {
10971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return HashBasedTable.create();
10981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeRowMapTests extends RowMapTests {
11021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeRowMapTests() {
11031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true);
11041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Integer, Character> makeTable() {
11071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return TreeBasedTable.create();
11081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeRowMapHeadMapTests extends RowMapTests {
11121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeRowMapHeadMapTests() {
11131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true);
11141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override TreeBasedTable<String, Integer, Character> makeTable() {
11171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, Integer, Character> table =
11181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          TreeBasedTable.create();
11191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("z", 1, 'a');
11201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table;
11211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>>
11241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        makePopulatedMap() {
11251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, Integer, Character> table = makeTable();
11261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      populateTable(table);
11271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.rowMap().headMap("x");
11281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>> makeEmptyMap() {
11311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return makeTable().rowMap().headMap("x");
11321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
11351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "z";
11361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeRowMapTailMapTests extends RowMapTests {
11401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeRowMapTailMapTests() {
11411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true);
11421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override TreeBasedTable<String, Integer, Character> makeTable() {
11451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, Integer, Character> table =
11461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          TreeBasedTable.create();
11471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("a", 1, 'a');
11481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table;
11491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>>
11521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        makePopulatedMap() {
11531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, Integer, Character> table = makeTable();
11541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      populateTable(table);
11551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.rowMap().tailMap("b");
11561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>> makeEmptyMap() {
11591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return makeTable().rowMap().tailMap("b");
11601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
11631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "a";
11641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeRowMapSubMapTests extends RowMapTests {
11681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeRowMapSubMapTests() {
11691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true);
11701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override TreeBasedTable<String, Integer, Character> makeTable() {
11731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, Integer, Character> table =
11741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          TreeBasedTable.create();
11751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("a", 1, 'a');
11761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("z", 1, 'a');
11771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table;
11781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>>
11811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        makePopulatedMap() {
11821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      TreeBasedTable<String, Integer, Character> table = makeTable();
11831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      populateTable(table);
11841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.rowMap().subMap("b", "x");
11851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>> makeEmptyMap() {
11881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return makeTable().rowMap().subMap("b", "x");
11891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
11921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "z";
11931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Function<String, Character> FIRST_CHARACTER =
11971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      new Function<String, Character>() {
11981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override
11991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        public Character apply(String input) {
12001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return input == null ? null : input.charAt(0);
12011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
12021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      };
12031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TransformValueRowMapTests extends RowMapTests {
12051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TransformValueRowMapTests() {
12061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, true);
12071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Integer, Character> makeTable() {
12101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Integer, String> original = HashBasedTable.create();
12111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(original, FIRST_CHARACTER);
12121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
12151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected Map<String, Map<Integer, Character>> makePopulatedMap() {
12161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Integer, String> table = HashBasedTable.create();
12171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 1, "apple");
12181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("bar", 1, "banana");
12191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 3, "cat");
12201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(table, FIRST_CHARACTER).rowMap();
12211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableHashRowMapTests extends RowMapTests {
12251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableHashRowMapTests() {
12261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false);
12271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<String, Integer, Character> makeTable() {
12301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Integer, Character> original = HashBasedTable.create();
12311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(original);
12321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
12351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected Map<String, Map<Integer, Character>> makePopulatedMap() {
12361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<String, Integer, Character> table = HashBasedTable.create();
12371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 1, 'a');
12381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("bar", 1, 'b');
12391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 3, 'c');
12401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(table).rowMap();
12411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableTreeRowMapTests extends RowMapTests {
12451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableTreeRowMapTests() {
12461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false);
12471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override RowSortedTable<String, Integer, Character> makeTable() {
12501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<String, Integer, Character> original = TreeBasedTable.create();
12511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(original);
12521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
12551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected SortedMap<String, Map<Integer, Character>> makePopulatedMap() {
12561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<String, Integer, Character> table = TreeBasedTable.create();
12571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 1, 'a');
12581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("bar", 1, 'b');
12591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put("foo", 3, 'c');
12601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(table).rowMap();
12611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class ColumnMapTests extends MapMapTests {
12651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ColumnMapTests(boolean allowsNullValues, boolean supportsRemove,
12661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        boolean supportsClear, boolean supportsIteratorRemove) {
12671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(allowsNullValues, supportsRemove, supportsClear,
12681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          supportsIteratorRemove);
12691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    abstract Table<Integer, String, Character> makeTable();
12721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>>
12741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        makePopulatedMap() {
12751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Integer, String, Character> table = makeTable();
12761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "foo", 'a');
12771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "bar", 'b');
12781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(3, "foo", 'c');
12791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return table.columnMap();
12801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>> makeEmptyMap() {
12831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return makeTable().columnMap();
12841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("TODO(hhchan): ArrayTable")
12881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class ArrayColumnMapTests extends ColumnMapTests {
12891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public ArrayColumnMapTests() {
12901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(true, false, false, false);
12911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Integer, String, Character> makeTable() {
12941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ArrayTable.create(Arrays.asList(1, 2, 3),
12951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Arrays.asList("foo", "bar", "dog"));
12961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Map<Integer, Character>> makeEmptyMap() {
12991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
13001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class HashColumnMapTests extends ColumnMapTests {
13041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public HashColumnMapTests() {
13051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, false);
13061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Integer, String, Character> makeTable() {
13091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return HashBasedTable.create();
13101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TreeColumnMapTests extends ColumnMapTests {
13141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TreeColumnMapTests() {
13151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, false);
13161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Integer, String, Character> makeTable() {
13191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return TreeBasedTable.create();
13201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class TransformValueColumnMapTests extends ColumnMapTests {
13241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public TransformValueColumnMapTests() {
13251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, true, true, false);
13261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Integer, String, Character> makeTable() {
13291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Integer, String, String> original = HashBasedTable.create();
13301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(original, FIRST_CHARACTER);
13311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
13341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected Map<String, Map<Integer, Character>> makePopulatedMap() {
13351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Integer, String, String> table = HashBasedTable.create();
13361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "foo", "apple");
13371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "bar", "banana");
13381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(3, "foo", "cat");
13391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.transformValues(table, FIRST_CHARACTER).columnMap();
13401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableHashColumnMapTests extends ColumnMapTests {
13441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableHashColumnMapTests() {
13451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false);
13461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Integer, String, Character> makeTable() {
13491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Integer, String, Character> original = HashBasedTable.create();
13501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(original);
13511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
13541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected Map<String, Map<Integer, Character>> makePopulatedMap() {
13551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Table<Integer, String, Character> table = HashBasedTable.create();
13561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "foo", 'a');
13571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "bar", 'b');
13581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(3, "foo", 'c');
13591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableTable(table).columnMap();
13601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class UnmodifiableTreeColumnMapTests extends ColumnMapTests {
13641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public UnmodifiableTreeColumnMapTests() {
13651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false);
13661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Table<Integer, String, Character> makeTable() {
13691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<Integer, String, Character> original = TreeBasedTable.create();
13701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(original);
13711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
13741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected Map<String, Map<Integer, Character>> makePopulatedMap() {
13751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      RowSortedTable<Integer, String, Character> table = TreeBasedTable.create();
13761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "foo", 'a');
13771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(1, "bar", 'b');
13781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      table.put(3, "foo", 'c');
13791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Tables.unmodifiableRowSortedTable(table).columnMap();
13801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
1383