View Javadoc
1   /*
2    * Copyright (C) 2008 The Guava Authors
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package com.google.common.collect;
18  
19  import static com.google.common.truth.Truth.assertThat;
20  
21  import com.google.common.annotations.GwtCompatible;
22  import com.google.common.base.Objects;
23  import com.google.common.testing.EqualsTester;
24  
25  import junit.framework.TestCase;
26  
27  /**
28   * Test cases for {@link Table} read operations.
29   *
30   * @author Jared Levy
31   */
32  @GwtCompatible(emulated = true)
33  public abstract class AbstractTableReadTest extends TestCase {
34    protected Table<String, Integer, Character> table;
35  
36    /**
37     * Creates a table with the specified data.
38     *
39     * @param data the table data, repeating the sequence row key, column key,
40     *     value once per mapping
41     * @throws IllegalArgumentException if the size of {@code data} isn't a
42     *     multiple of 3
43     * @throws ClassCastException if a data element has the wrong type
44     */
45    protected abstract Table<String, Integer, Character>
46        create(Object... data);
47  
48    protected void assertSize(int expectedSize) {
49      assertEquals(expectedSize, table.size());
50    }
51  
52    @Override public void setUp() throws Exception {
53      super.setUp();
54      table = create();
55    }
56  
57    public void testContains() {
58      table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
59      assertTrue(table.contains("foo", 1));
60      assertTrue(table.contains("bar", 1));
61      assertTrue(table.contains("foo", 3));
62      assertFalse(table.contains("foo", 2));
63      assertFalse(table.contains("bar", 3));
64      assertFalse(table.contains("cat", 1));
65      assertFalse(table.contains("foo", null));
66      assertFalse(table.contains(null, 1));
67      assertFalse(table.contains(null, null));
68    }
69  
70    public void testContainsRow() {
71      table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
72      assertTrue(table.containsRow("foo"));
73      assertTrue(table.containsRow("bar"));
74      assertFalse(table.containsRow("cat"));
75      assertFalse(table.containsRow(null));
76    }
77  
78    public void testContainsColumn() {
79      table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
80      assertTrue(table.containsColumn(1));
81      assertTrue(table.containsColumn(3));
82      assertFalse(table.containsColumn(2));
83      assertFalse(table.containsColumn(null));
84    }
85  
86    public void testContainsValue() {
87      table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
88      assertTrue(table.containsValue('a'));
89      assertTrue(table.containsValue('b'));
90      assertTrue(table.containsValue('c'));
91      assertFalse(table.containsValue('x'));
92      assertFalse(table.containsValue(null));
93    }
94  
95    public void testGet() {
96      table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
97      assertEquals((Character) 'a', table.get("foo", 1));
98      assertEquals((Character) 'b', table.get("bar", 1));
99      assertEquals((Character) 'c', table.get("foo", 3));
100     assertNull(table.get("foo", 2));
101     assertNull(table.get("bar", 3));
102     assertNull(table.get("cat", 1));
103     assertNull(table.get("foo", null));
104     assertNull(table.get(null, 1));
105     assertNull(table.get(null, null));
106   }
107 
108   public void testIsEmpty() {
109     assertTrue(table.isEmpty());
110     table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
111     assertFalse(table.isEmpty());
112   }
113 
114   public void testSize() {
115     assertSize(0);
116     table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
117     assertSize(3);
118   }
119 
120   public void testEquals() {
121     table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
122     Table<String, Integer, Character> hashCopy = HashBasedTable.create(table);
123     Table<String, Integer, Character> reordered
124         = create("foo", 3, 'c', "foo", 1, 'a', "bar", 1, 'b');
125     Table<String, Integer, Character> smaller
126         = create("foo", 1, 'a', "bar", 1, 'b');
127     Table<String, Integer, Character> swapOuter
128         = create("bar", 1, 'a', "foo", 1, 'b', "bar", 3, 'c');
129     Table<String, Integer, Character> swapValues
130         = create("foo", 1, 'c', "bar", 1, 'b', "foo", 3, 'a');
131 
132     new EqualsTester()
133         .addEqualityGroup(table, hashCopy, reordered)
134         .addEqualityGroup(smaller)
135         .addEqualityGroup(swapOuter)
136         .addEqualityGroup(swapValues)
137         .testEquals();
138   }
139 
140   public void testHashCode() {
141     table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
142     int expected = Objects.hashCode("foo", 1, 'a')
143         + Objects.hashCode("bar", 1, 'b')
144         + Objects.hashCode("foo", 3, 'c');
145     assertEquals(expected, table.hashCode());
146   }
147 
148   public void testToStringSize1() {
149     table = create("foo", 1, 'a');
150     assertEquals("{foo={1=a}}", table.toString());
151   }
152 
153   public void testRow() {
154     table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
155     assertEquals(ImmutableMap.of(1, 'a', 3, 'c'), table.row("foo"));
156   }
157 
158   // This test assumes that the implementation does not support null keys.
159   public void testRowNull() {
160     table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
161     try {
162       table.row(null);
163       fail();
164     } catch (NullPointerException expected) {}
165   }
166 
167   public void testColumn() {
168     table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
169     assertEquals(ImmutableMap.of("foo", 'a', "bar", 'b'), table.column(1));
170   }
171 
172   // This test assumes that the implementation does not support null keys.
173   public void testColumnNull() {
174     table = create("foo", 1, 'a', "bar", 1, 'b', "foo", 3, 'c');
175     try {
176       table.column(null);
177       fail();
178     } catch (NullPointerException expected) {}
179   }
180 
181   public void testColumnSetPartialOverlap() {
182     table = create(
183         "foo", 1, 'a', "bar", 1, 'b', "foo", 2, 'c', "bar", 3, 'd');
184     assertThat(table.columnKeySet()).has().exactly(1, 2, 3);
185   }
186 }
187