• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.primitives;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 import static com.google.common.truth.Truth.assertWithMessage;
21 
22 import com.google.common.annotations.GwtCompatible;
23 import com.google.common.annotations.GwtIncompatible;
24 import com.google.common.annotations.J2ktIncompatible;
25 import com.google.common.collect.testing.Helpers;
26 import com.google.common.testing.NullPointerTester;
27 import com.google.common.testing.SerializableTester;
28 import java.util.Arrays;
29 import java.util.Collection;
30 import java.util.Collections;
31 import java.util.Comparator;
32 import java.util.List;
33 import junit.framework.TestCase;
34 import org.checkerframework.checker.nullness.qual.Nullable;
35 
36 /**
37  * Unit test for {@link Booleans}.
38  *
39  * @author Kevin Bourrillion
40  */
41 @GwtCompatible(emulated = true)
42 @ElementTypesAreNonnullByDefault
43 public class BooleansTest extends TestCase {
44   private static final boolean[] EMPTY = {};
45   private static final boolean[] ARRAY_FALSE = {false};
46   private static final boolean[] ARRAY_TRUE = {true};
47   private static final boolean[] ARRAY_FALSE_FALSE = {false, false};
48   private static final boolean[] ARRAY_FALSE_TRUE = {false, true};
49 
50   private static final boolean[] VALUES = {false, true};
51 
52   @J2ktIncompatible // TODO(b/285538920): Fix and enable.
testHashCode()53   public void testHashCode() {
54     assertThat(Booleans.hashCode(true)).isEqualTo(Boolean.TRUE.hashCode());
55     assertThat(Booleans.hashCode(false)).isEqualTo(Boolean.FALSE.hashCode());
56   }
57 
testTrueFirst()58   public void testTrueFirst() {
59     assertThat(Booleans.trueFirst().compare(true, true)).isEqualTo(0);
60     assertThat(Booleans.trueFirst().compare(false, false)).isEqualTo(0);
61     assertThat(Booleans.trueFirst().compare(true, false)).isLessThan(0);
62     assertThat(Booleans.trueFirst().compare(false, true)).isGreaterThan(0);
63   }
64 
testFalseFirst()65   public void testFalseFirst() {
66     assertThat(Booleans.falseFirst().compare(true, true)).isEqualTo(0);
67     assertThat(Booleans.falseFirst().compare(false, false)).isEqualTo(0);
68     assertThat(Booleans.falseFirst().compare(false, true)).isLessThan(0);
69     assertThat(Booleans.falseFirst().compare(true, false)).isGreaterThan(0);
70   }
71 
testCompare()72   public void testCompare() {
73     for (boolean x : VALUES) {
74       for (boolean y : VALUES) {
75         // note: spec requires only that the sign is the same
76         assertWithMessage(x + ", " + y)
77             .that(Booleans.compare(x, y))
78             .isEqualTo(Boolean.valueOf(x).compareTo(y));
79       }
80     }
81   }
82 
testContains()83   public void testContains() {
84     assertThat(Booleans.contains(EMPTY, false)).isFalse();
85     assertThat(Booleans.contains(ARRAY_FALSE, true)).isFalse();
86     assertThat(Booleans.contains(ARRAY_FALSE, false)).isTrue();
87     assertThat(Booleans.contains(ARRAY_FALSE_TRUE, false)).isTrue();
88     assertThat(Booleans.contains(ARRAY_FALSE_TRUE, true)).isTrue();
89   }
90 
testIndexOf()91   public void testIndexOf() {
92     assertThat(Booleans.indexOf(EMPTY, ARRAY_FALSE)).isEqualTo(-1);
93     assertThat(Booleans.indexOf(ARRAY_FALSE, ARRAY_FALSE_TRUE)).isEqualTo(-1);
94     assertThat(Booleans.indexOf(ARRAY_FALSE_FALSE, ARRAY_FALSE)).isEqualTo(0);
95     assertThat(Booleans.indexOf(ARRAY_FALSE, ARRAY_FALSE)).isEqualTo(0);
96     assertThat(Booleans.indexOf(ARRAY_FALSE_TRUE, ARRAY_FALSE)).isEqualTo(0);
97     assertThat(Booleans.indexOf(ARRAY_FALSE_TRUE, ARRAY_TRUE)).isEqualTo(1);
98     assertThat(Booleans.indexOf(ARRAY_TRUE, new boolean[0])).isEqualTo(0);
99   }
100 
testIndexOf_arrays()101   public void testIndexOf_arrays() {
102     assertThat(Booleans.indexOf(EMPTY, false)).isEqualTo(-1);
103     assertThat(Booleans.indexOf(ARRAY_FALSE, true)).isEqualTo(-1);
104     assertThat(Booleans.indexOf(ARRAY_FALSE_FALSE, true)).isEqualTo(-1);
105     assertThat(Booleans.indexOf(ARRAY_FALSE, false)).isEqualTo(0);
106     assertThat(Booleans.indexOf(ARRAY_FALSE_TRUE, false)).isEqualTo(0);
107     assertThat(Booleans.indexOf(ARRAY_FALSE_TRUE, true)).isEqualTo(1);
108     assertThat(Booleans.indexOf(new boolean[] {false, false, true}, true)).isEqualTo(2);
109   }
110 
testLastIndexOf()111   public void testLastIndexOf() {
112     assertThat(Booleans.lastIndexOf(EMPTY, false)).isEqualTo(-1);
113     assertThat(Booleans.lastIndexOf(ARRAY_FALSE, true)).isEqualTo(-1);
114     assertThat(Booleans.lastIndexOf(ARRAY_FALSE_FALSE, true)).isEqualTo(-1);
115     assertThat(Booleans.lastIndexOf(ARRAY_FALSE, false)).isEqualTo(0);
116     assertThat(Booleans.lastIndexOf(ARRAY_FALSE_TRUE, false)).isEqualTo(0);
117     assertThat(Booleans.lastIndexOf(ARRAY_FALSE_TRUE, true)).isEqualTo(1);
118     assertThat(Booleans.lastIndexOf(new boolean[] {false, true, true}, true)).isEqualTo(2);
119   }
120 
testConcat()121   public void testConcat() {
122     assertThat(Booleans.concat()).isEqualTo(EMPTY);
123     assertThat(Booleans.concat(EMPTY)).isEqualTo(EMPTY);
124     assertThat(Booleans.concat(EMPTY, EMPTY, EMPTY)).isEqualTo(EMPTY);
125     assertThat(Booleans.concat(ARRAY_FALSE)).isEqualTo(ARRAY_FALSE);
126     assertThat(Booleans.concat(ARRAY_FALSE)).isNotSameInstanceAs(ARRAY_FALSE);
127     assertThat(Booleans.concat(EMPTY, ARRAY_FALSE, EMPTY)).isEqualTo(ARRAY_FALSE);
128     assertThat(Booleans.concat(ARRAY_FALSE, ARRAY_FALSE, ARRAY_FALSE))
129         .isEqualTo(new boolean[] {false, false, false});
130     assertThat(Booleans.concat(ARRAY_FALSE, ARRAY_FALSE_TRUE))
131         .isEqualTo(new boolean[] {false, false, true});
132   }
133 
testEnsureCapacity()134   public void testEnsureCapacity() {
135     assertThat(Booleans.ensureCapacity(EMPTY, 0, 1)).isSameInstanceAs(EMPTY);
136     assertThat(Booleans.ensureCapacity(ARRAY_FALSE, 0, 1)).isSameInstanceAs(ARRAY_FALSE);
137     assertThat(Booleans.ensureCapacity(ARRAY_FALSE, 1, 1)).isSameInstanceAs(ARRAY_FALSE);
138     assertThat(Booleans.ensureCapacity(new boolean[] {true}, 2, 1))
139         .isEqualTo(new boolean[] {true, false, false});
140   }
141 
testEnsureCapacity_fail()142   public void testEnsureCapacity_fail() {
143     try {
144       Booleans.ensureCapacity(ARRAY_FALSE, -1, 1);
145       fail();
146     } catch (IllegalArgumentException expected) {
147     }
148     try {
149       // notice that this should even fail when no growth was needed
150       Booleans.ensureCapacity(ARRAY_FALSE, 1, -1);
151       fail();
152     } catch (IllegalArgumentException expected) {
153     }
154   }
155 
testJoin()156   public void testJoin() {
157     assertThat(Booleans.join(",", EMPTY)).isEmpty();
158     assertThat(Booleans.join(",", ARRAY_FALSE)).isEqualTo("false");
159     assertThat(Booleans.join(",", false, true)).isEqualTo("false,true");
160     assertThat(Booleans.join("", false, true, false)).isEqualTo("falsetruefalse");
161   }
162 
testLexicographicalComparator()163   public void testLexicographicalComparator() {
164     List<boolean[]> ordered =
165         Arrays.asList(
166             new boolean[] {},
167             new boolean[] {false},
168             new boolean[] {false, false},
169             new boolean[] {false, true},
170             new boolean[] {true},
171             new boolean[] {true, false},
172             new boolean[] {true, true},
173             new boolean[] {true, true, true});
174 
175     Comparator<boolean[]> comparator = Booleans.lexicographicalComparator();
176     Helpers.testComparator(comparator, ordered);
177   }
178 
179   @J2ktIncompatible
180   @GwtIncompatible // SerializableTester
testLexicographicalComparatorSerializable()181   public void testLexicographicalComparatorSerializable() {
182     Comparator<boolean[]> comparator = Booleans.lexicographicalComparator();
183     assertThat(SerializableTester.reserialize(comparator)).isSameInstanceAs(comparator);
184   }
185 
testReverse()186   public void testReverse() {
187     testReverse(new boolean[] {}, new boolean[] {});
188     testReverse(new boolean[] {true}, new boolean[] {true});
189     testReverse(new boolean[] {false, true}, new boolean[] {true, false});
190     testReverse(new boolean[] {true, false, false}, new boolean[] {false, false, true});
191     testReverse(new boolean[] {true, true, false, false}, new boolean[] {false, false, true, true});
192   }
193 
testReverse(boolean[] input, boolean[] expectedOutput)194   private static void testReverse(boolean[] input, boolean[] expectedOutput) {
195     input = Arrays.copyOf(input, input.length);
196     Booleans.reverse(input);
197     assertThat(input).isEqualTo(expectedOutput);
198   }
199 
testReverse( boolean[] input, int fromIndex, int toIndex, boolean[] expectedOutput)200   private static void testReverse(
201       boolean[] input, int fromIndex, int toIndex, boolean[] expectedOutput) {
202     input = Arrays.copyOf(input, input.length);
203     Booleans.reverse(input, fromIndex, toIndex);
204     assertThat(input).isEqualTo(expectedOutput);
205   }
206 
testReverseIndexed()207   public void testReverseIndexed() {
208     testReverse(new boolean[] {}, 0, 0, new boolean[] {});
209     testReverse(new boolean[] {true}, 0, 1, new boolean[] {true});
210     testReverse(new boolean[] {false, true}, 0, 2, new boolean[] {true, false});
211     testReverse(new boolean[] {true, false, false}, 0, 2, new boolean[] {false, true, false});
212     testReverse(new boolean[] {true, false, false}, 0, 1, new boolean[] {true, false, false});
213     testReverse(
214         new boolean[] {true, true, false, false}, 1, 3, new boolean[] {true, false, true, false});
215   }
216 
testRotate(boolean[] input, int distance, boolean[] expectedOutput)217   private static void testRotate(boolean[] input, int distance, boolean[] expectedOutput) {
218     input = Arrays.copyOf(input, input.length);
219     Booleans.rotate(input, distance);
220     assertThat(input).isEqualTo(expectedOutput);
221   }
222 
testRotate( boolean[] input, int distance, int fromIndex, int toIndex, boolean[] expectedOutput)223   private static void testRotate(
224       boolean[] input, int distance, int fromIndex, int toIndex, boolean[] expectedOutput) {
225     input = Arrays.copyOf(input, input.length);
226     Booleans.rotate(input, distance, fromIndex, toIndex);
227     assertThat(input).isEqualTo(expectedOutput);
228   }
229 
testRotate()230   public void testRotate() {
231     testRotate(new boolean[] {}, -1, new boolean[] {});
232     testRotate(new boolean[] {}, 0, new boolean[] {});
233     testRotate(new boolean[] {}, 1, new boolean[] {});
234 
235     testRotate(new boolean[] {true}, -2, new boolean[] {true});
236     testRotate(new boolean[] {true}, -1, new boolean[] {true});
237     testRotate(new boolean[] {true}, 0, new boolean[] {true});
238     testRotate(new boolean[] {true}, 1, new boolean[] {true});
239     testRotate(new boolean[] {true}, 2, new boolean[] {true});
240 
241     testRotate(new boolean[] {true, false}, -3, new boolean[] {false, true});
242     testRotate(new boolean[] {true, false}, -1, new boolean[] {false, true});
243     testRotate(new boolean[] {true, false}, -2, new boolean[] {true, false});
244     testRotate(new boolean[] {true, false}, 0, new boolean[] {true, false});
245     testRotate(new boolean[] {true, false}, 1, new boolean[] {false, true});
246     testRotate(new boolean[] {true, false}, 2, new boolean[] {true, false});
247     testRotate(new boolean[] {true, false}, 3, new boolean[] {false, true});
248 
249     testRotate(new boolean[] {true, false, true}, -5, new boolean[] {true, true, false});
250     testRotate(new boolean[] {true, false, true}, -4, new boolean[] {false, true, true});
251     testRotate(new boolean[] {true, false, true}, -3, new boolean[] {true, false, true});
252     testRotate(new boolean[] {true, false, true}, -2, new boolean[] {true, true, false});
253     testRotate(new boolean[] {true, false, true}, -1, new boolean[] {false, true, true});
254     testRotate(new boolean[] {true, false, true}, 0, new boolean[] {true, false, true});
255     testRotate(new boolean[] {true, false, true}, 1, new boolean[] {true, true, false});
256     testRotate(new boolean[] {true, false, true}, 2, new boolean[] {false, true, true});
257     testRotate(new boolean[] {true, false, true}, 3, new boolean[] {true, false, true});
258     testRotate(new boolean[] {true, false, true}, 4, new boolean[] {true, true, false});
259     testRotate(new boolean[] {true, false, true}, 5, new boolean[] {false, true, true});
260 
261     testRotate(
262         new boolean[] {true, false, true, false}, -9, new boolean[] {false, true, false, true});
263     testRotate(
264         new boolean[] {true, false, true, false}, -5, new boolean[] {false, true, false, true});
265     testRotate(
266         new boolean[] {true, false, true, false}, -1, new boolean[] {false, true, false, true});
267     testRotate(
268         new boolean[] {true, false, true, false}, 0, new boolean[] {true, false, true, false});
269     testRotate(
270         new boolean[] {true, false, true, false}, 1, new boolean[] {false, true, false, true});
271     testRotate(
272         new boolean[] {true, false, true, false}, 5, new boolean[] {false, true, false, true});
273     testRotate(
274         new boolean[] {true, false, true, false}, 9, new boolean[] {false, true, false, true});
275 
276     testRotate(
277         new boolean[] {true, false, true, false, true},
278         -6,
279         new boolean[] {false, true, false, true, true});
280     testRotate(
281         new boolean[] {true, false, true, false, true},
282         -4,
283         new boolean[] {true, true, false, true, false});
284     testRotate(
285         new boolean[] {true, false, true, false, true},
286         -3,
287         new boolean[] {false, true, true, false, true});
288     testRotate(
289         new boolean[] {true, false, true, false, true},
290         -1,
291         new boolean[] {false, true, false, true, true});
292     testRotate(
293         new boolean[] {true, false, true, false, true},
294         0,
295         new boolean[] {true, false, true, false, true});
296     testRotate(
297         new boolean[] {true, false, true, false, true},
298         1,
299         new boolean[] {true, true, false, true, false});
300     testRotate(
301         new boolean[] {true, false, true, false, true},
302         3,
303         new boolean[] {true, false, true, true, false});
304     testRotate(
305         new boolean[] {true, false, true, false, true},
306         4,
307         new boolean[] {false, true, false, true, true});
308     testRotate(
309         new boolean[] {true, false, true, false, true},
310         6,
311         new boolean[] {true, true, false, true, false});
312   }
313 
testRotateIndexed()314   public void testRotateIndexed() {
315     testRotate(new boolean[] {}, 0, 0, 0, new boolean[] {});
316 
317     testRotate(new boolean[] {true}, 0, 0, 1, new boolean[] {true});
318     testRotate(new boolean[] {true}, 1, 0, 1, new boolean[] {true});
319     testRotate(new boolean[] {true}, 1, 1, 1, new boolean[] {true});
320 
321     // Rotate the central 5 elements, leaving the ends as-is
322     testRotate(
323         new boolean[] {false, true, false, true, false, true, false},
324         -6,
325         1,
326         6,
327         new boolean[] {false, false, true, false, true, true, false});
328     testRotate(
329         new boolean[] {false, true, false, true, false, true, false},
330         -1,
331         1,
332         6,
333         new boolean[] {false, false, true, false, true, true, false});
334     testRotate(
335         new boolean[] {false, true, false, true, false, true, false},
336         0,
337         1,
338         6,
339         new boolean[] {false, true, false, true, false, true, false});
340     testRotate(
341         new boolean[] {false, true, false, true, false, true, false},
342         5,
343         1,
344         6,
345         new boolean[] {false, true, false, true, false, true, false});
346     testRotate(
347         new boolean[] {false, true, false, true, false, true, false},
348         14,
349         1,
350         6,
351         new boolean[] {false, false, true, false, true, true, false});
352 
353     // Rotate the first three elements
354     testRotate(
355         new boolean[] {false, true, false, true, false, true, false},
356         -2,
357         0,
358         3,
359         new boolean[] {false, false, true, true, false, true, false});
360     testRotate(
361         new boolean[] {false, true, false, true, false, true, false},
362         -1,
363         0,
364         3,
365         new boolean[] {true, false, false, true, false, true, false});
366     testRotate(
367         new boolean[] {false, true, false, true, false, true, false},
368         0,
369         0,
370         3,
371         new boolean[] {false, true, false, true, false, true, false});
372     testRotate(
373         new boolean[] {false, true, false, true, false, true, false},
374         1,
375         0,
376         3,
377         new boolean[] {false, false, true, true, false, true, false});
378     testRotate(
379         new boolean[] {false, true, false, true, false, true, false},
380         2,
381         0,
382         3,
383         new boolean[] {true, false, false, true, false, true, false});
384 
385     // Rotate the last four elements
386     testRotate(
387         new boolean[] {false, true, false, true, false, true, false},
388         -6,
389         3,
390         7,
391         new boolean[] {false, true, false, true, false, true, false});
392     testRotate(
393         new boolean[] {false, true, false, true, false, true, false},
394         -5,
395         3,
396         7,
397         new boolean[] {false, true, false, false, true, false, true});
398     testRotate(
399         new boolean[] {false, true, false, true, false, true, false},
400         -4,
401         3,
402         7,
403         new boolean[] {false, true, false, true, false, true, false});
404     testRotate(
405         new boolean[] {false, true, false, true, false, true, false},
406         -3,
407         3,
408         7,
409         new boolean[] {false, true, false, false, true, false, true});
410     testRotate(
411         new boolean[] {false, true, false, true, false, true, false},
412         -2,
413         3,
414         7,
415         new boolean[] {false, true, false, true, false, true, false});
416     testRotate(
417         new boolean[] {false, true, false, true, false, true, false},
418         -1,
419         3,
420         7,
421         new boolean[] {false, true, false, false, true, false, true});
422     testRotate(
423         new boolean[] {false, true, false, true, false, true, false},
424         0,
425         3,
426         7,
427         new boolean[] {false, true, false, true, false, true, false});
428     testRotate(
429         new boolean[] {false, true, false, true, false, true, false},
430         1,
431         3,
432         7,
433         new boolean[] {false, true, false, false, true, false, true});
434     testRotate(
435         new boolean[] {false, true, false, true, false, true, false},
436         2,
437         3,
438         7,
439         new boolean[] {false, true, false, true, false, true, false});
440     testRotate(
441         new boolean[] {false, true, false, true, false, true, false},
442         3,
443         3,
444         7,
445         new boolean[] {false, true, false, false, true, false, true});
446   }
447 
testToArray()448   public void testToArray() {
449     // need explicit type parameter to avoid javac warning!?
450     List<Boolean> none = Arrays.<Boolean>asList();
451     assertThat(Booleans.toArray(none)).isEqualTo(EMPTY);
452 
453     List<Boolean> one = Arrays.asList(false);
454     assertThat(Booleans.toArray(one)).isEqualTo(ARRAY_FALSE);
455 
456     boolean[] array = {false, false, true};
457 
458     List<Boolean> three = Arrays.asList(false, false, true);
459     assertThat(Booleans.toArray(three)).isEqualTo(array);
460 
461     assertThat(Booleans.toArray(Booleans.asList(array))).isEqualTo(array);
462   }
463 
testToArray_threadSafe()464   public void testToArray_threadSafe() {
465     // Only for booleans, we lengthen VALUES
466     boolean[] VALUES = BooleansTest.VALUES;
467     VALUES = Booleans.concat(VALUES, VALUES);
468 
469     for (int delta : new int[] {+1, 0, -1}) {
470       for (int i = 0; i < VALUES.length; i++) {
471         List<Boolean> list = Booleans.asList(VALUES).subList(0, i);
472         Collection<Boolean> misleadingSize = Helpers.misleadingSizeCollection(delta);
473         misleadingSize.addAll(list);
474         boolean[] arr = Booleans.toArray(misleadingSize);
475         assertThat(arr).hasLength(i);
476         for (int j = 0; j < i; j++) {
477           assertThat(arr[j]).isEqualTo(VALUES[j]);
478         }
479       }
480     }
481   }
482 
testToArray_withNull()483   public void testToArray_withNull() {
484     List<@Nullable Boolean> list = Arrays.asList(false, true, null);
485     try {
486       Booleans.toArray(list);
487       fail();
488     } catch (NullPointerException expected) {
489     }
490   }
491 
492   @SuppressWarnings({"CollectionIsEmptyTruth", "CollectionIsNotEmptyTruth"})
testAsListIsEmpty()493   public void testAsListIsEmpty() {
494     assertThat(Booleans.asList(EMPTY).isEmpty()).isTrue();
495     assertThat(Booleans.asList(ARRAY_FALSE).isEmpty()).isFalse();
496   }
497 
498   @SuppressWarnings("CollectionSizeTruth")
testAsListSize()499   public void testAsListSize() {
500     assertThat(Booleans.asList(EMPTY).size()).isEqualTo(0);
501     assertThat(Booleans.asList(ARRAY_FALSE).size()).isEqualTo(1);
502     assertThat(Booleans.asList(ARRAY_FALSE_TRUE).size()).isEqualTo(2);
503   }
504 
505   @SuppressWarnings("BooleanArrayIndexOfBoolean")
testAsListIndexOf()506   public void testAsListIndexOf() {
507     assertThat(Booleans.asList(EMPTY).indexOf((Object) "wrong type")).isEqualTo(-1);
508     assertThat(Booleans.asList(EMPTY).indexOf(true)).isEqualTo(-1);
509     assertThat(Booleans.asList(ARRAY_FALSE).indexOf(true)).isEqualTo(-1);
510     assertThat(Booleans.asList(ARRAY_FALSE).indexOf(false)).isEqualTo(0);
511     assertThat(Booleans.asList(ARRAY_FALSE_TRUE).indexOf(true)).isEqualTo(1);
512   }
513 
testAsListLastIndexOf()514   public void testAsListLastIndexOf() {
515     assertThat(Booleans.asList(EMPTY).lastIndexOf((Object) "wrong type")).isEqualTo(-1);
516     assertThat(Booleans.asList(EMPTY).lastIndexOf(true)).isEqualTo(-1);
517     assertThat(Booleans.asList(ARRAY_FALSE).lastIndexOf(true)).isEqualTo(-1);
518     assertThat(Booleans.asList(ARRAY_FALSE_TRUE).lastIndexOf(true)).isEqualTo(1);
519     assertThat(Booleans.asList(ARRAY_FALSE_FALSE).lastIndexOf(false)).isEqualTo(1);
520   }
521 
522   @SuppressWarnings({"BooleanArrayContainsBoolean", "CollectionDoesNotContainTruth"})
testAsListContains()523   public void testAsListContains() {
524     assertThat(Booleans.asList(EMPTY).contains((Object) "wrong type")).isFalse();
525     assertThat(Booleans.asList(EMPTY).contains(true)).isFalse();
526     assertThat(Booleans.asList(ARRAY_FALSE).contains(true)).isFalse();
527     assertThat(Booleans.asList(ARRAY_TRUE).contains(true)).isTrue();
528     assertThat(Booleans.asList(ARRAY_FALSE_TRUE).contains(false)).isTrue();
529     assertThat(Booleans.asList(ARRAY_FALSE_TRUE).contains(true)).isTrue();
530   }
531 
testAsListEquals()532   public void testAsListEquals() {
533     assertThat(Booleans.asList(EMPTY).equals(Collections.emptyList())).isTrue();
534     assertThat(Booleans.asList(ARRAY_FALSE).equals(Booleans.asList(ARRAY_FALSE))).isTrue();
535     @SuppressWarnings("EqualsIncompatibleType")
536     boolean listEqualsArray = Booleans.asList(ARRAY_FALSE).equals(ARRAY_FALSE);
537     assertThat(listEqualsArray).isFalse();
538     assertThat(Booleans.asList(ARRAY_FALSE).equals(null)).isFalse();
539     assertThat(Booleans.asList(ARRAY_FALSE).equals(Booleans.asList(ARRAY_FALSE_TRUE))).isFalse();
540     assertThat(Booleans.asList(ARRAY_FALSE_FALSE).equals(Booleans.asList(ARRAY_FALSE_TRUE)))
541         .isFalse();
542     assertEquals(1, Booleans.asList(ARRAY_FALSE_TRUE).lastIndexOf(true));
543     List<Boolean> reference = Booleans.asList(ARRAY_FALSE);
544     assertEquals(Booleans.asList(ARRAY_FALSE), reference);
545     // Explicitly call `equals`; `assertEquals` might return fast
546     assertThat(reference.equals(reference)).isTrue();
547   }
548 
testAsListHashcode()549   public void testAsListHashcode() {
550     assertThat(Booleans.asList(EMPTY).hashCode()).isEqualTo(1);
551     assertThat(Booleans.asList(ARRAY_FALSE).hashCode())
552         .isEqualTo(Booleans.asList(ARRAY_FALSE).hashCode());
553     List<Boolean> reference = Booleans.asList(ARRAY_FALSE);
554     assertThat(reference.hashCode()).isEqualTo(Booleans.asList(ARRAY_FALSE).hashCode());
555   }
556 
testAsListToString()557   public void testAsListToString() {
558     assertThat(Booleans.asList(ARRAY_FALSE).toString()).isEqualTo("[false]");
559     assertThat(Booleans.asList(ARRAY_FALSE_TRUE).toString()).isEqualTo("[false, true]");
560   }
561 
testAsListSet()562   public void testAsListSet() {
563     List<Boolean> list = Booleans.asList(ARRAY_FALSE);
564     assertThat(list.set(0, true)).isFalse();
565     assertThat(list.set(0, false)).isTrue();
566     try {
567       list.set(0, null);
568       fail();
569     } catch (NullPointerException expected) {
570     }
571     try {
572       list.set(1, true);
573       fail();
574     } catch (IndexOutOfBoundsException expected) {
575     }
576   }
577 
testAsListCanonicalValues()578   public void testAsListCanonicalValues() {
579     List<Boolean> list = Booleans.asList(true, false);
580     assertThat(list.get(0)).isSameInstanceAs(true);
581     assertThat(list.get(1)).isSameInstanceAs(false);
582     @SuppressWarnings("deprecation")
583     Boolean anotherTrue = new Boolean(true);
584     @SuppressWarnings("deprecation")
585     Boolean anotherFalse = new Boolean(false);
586     list.set(0, anotherTrue);
587     assertThat(list.get(0)).isSameInstanceAs(true);
588     list.set(1, anotherFalse);
589     assertThat(list.get(1)).isSameInstanceAs(false);
590   }
591 
testCountTrue()592   public void testCountTrue() {
593     assertThat(Booleans.countTrue()).isEqualTo(0);
594     assertThat(Booleans.countTrue(false)).isEqualTo(0);
595     assertThat(Booleans.countTrue(true)).isEqualTo(1);
596     assertThat(Booleans.countTrue(false, true, false, true, false, true)).isEqualTo(3);
597     assertThat(Booleans.countTrue(false, false, true, false, false)).isEqualTo(1);
598   }
599 
600   @J2ktIncompatible
601   @GwtIncompatible // NullPointerTester
testNulls()602   public void testNulls() {
603     new NullPointerTester().testAllPublicStaticMethods(Booleans.class);
604   }
605 }
606