• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
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 android.test;
18 
19 import junit.framework.Assert;
20 
21 import java.util.Arrays;
22 import java.util.HashMap;
23 import java.util.HashSet;
24 import java.util.Map;
25 import java.util.Set;
26 import java.util.ArrayList;
27 import java.util.regex.MatchResult;
28 import java.util.regex.Matcher;
29 import java.util.regex.Pattern;
30 
31 /**
32  * Contains additional assertion methods not found in JUnit.
33  * @deprecated Use
34  * <a href="https://github.com/hamcrest">Hamcrest matchers</a> instead.
35  */
36 @Deprecated
37 public final class MoreAsserts {
38 
MoreAsserts()39     private MoreAsserts() { }
40 
41     /**
42      * Asserts that the class  {@code expected} is assignable from the object
43      * {@code actual}. This verifies {@code expected} is a parent class or a
44      * interface that {@code actual} implements.
45      */
assertAssignableFrom(Class<?> expected, Object actual)46     public static void assertAssignableFrom(Class<?> expected, Object actual) {
47         assertAssignableFrom(expected, actual.getClass());
48     }
49 
50     /**
51      * Asserts that class {@code expected} is assignable from the class
52      * {@code actual}. This verifies {@code expected} is a parent class or a
53      * interface that {@code actual} implements.
54      */
assertAssignableFrom(Class<?> expected, Class<?> actual)55     public static void assertAssignableFrom(Class<?> expected, Class<?> actual) {
56         Assert.assertTrue(
57                 "Expected " + expected.getCanonicalName() +
58                         " to be assignable from actual class " + actual.getCanonicalName(),
59                 expected.isAssignableFrom(actual));
60     }
61 
62     /**
63      * Asserts that {@code actual} is not equal {@code unexpected}, according
64      * to both {@code ==} and {@link Object#equals}.
65      */
assertNotEqual( String message, Object unexpected, Object actual)66     public static void assertNotEqual(
67             String message, Object unexpected, Object actual) {
68         if (equal(unexpected, actual)) {
69             failEqual(message, unexpected);
70         }
71     }
72 
73     /**
74      * Variant of {@link #assertNotEqual(String,Object,Object)} using a
75      * generic message.
76      */
assertNotEqual(Object unexpected, Object actual)77     public static void assertNotEqual(Object unexpected, Object actual) {
78         assertNotEqual(null, unexpected, actual);
79     }
80 
81     /**
82      * Asserts that array {@code actual} is the same size and every element equals
83      * those in array {@code expected}. On failure, message indicates specific
84      * element mismatch.
85      */
assertEquals( String message, byte[] expected, byte[] actual)86     public static void assertEquals(
87             String message, byte[] expected, byte[] actual) {
88         if (expected.length != actual.length) {
89             failWrongLength(message, expected.length, actual.length);
90         }
91         for (int i = 0; i < expected.length; i++) {
92             if (expected[i] != actual[i]) {
93                 failWrongElement(message, i, expected[i], actual[i]);
94             }
95         }
96     }
97 
98     /**
99      * Asserts that array {@code actual} is the same size and every element equals
100      * those in array {@code expected}. On failure, message indicates specific
101      * element mismatch.
102      */
assertEquals(byte[] expected, byte[] actual)103     public static void assertEquals(byte[] expected, byte[] actual) {
104         assertEquals(null, expected, actual);
105     }
106 
107     /**
108      * Asserts that array {@code actual} is the same size and every element equals
109      * those in array {@code expected}. On failure, message indicates first
110      * specific element mismatch.
111      */
assertEquals( String message, int[] expected, int[] actual)112     public static void assertEquals(
113             String message, int[] expected, int[] actual) {
114         if (expected.length != actual.length) {
115             failWrongLength(message, expected.length, actual.length);
116         }
117         for (int i = 0; i < expected.length; i++) {
118             if (expected[i] != actual[i]) {
119                 failWrongElement(message, i, expected[i], actual[i]);
120             }
121         }
122     }
123 
124     /**
125      * Asserts that array {@code actual} is the same size and every element equals
126      * those in array {@code expected}. On failure, message indicates first
127      * specific element mismatch.
128      */
assertEquals(int[] expected, int[] actual)129     public static void assertEquals(int[] expected, int[] actual) {
130         assertEquals(null, expected, actual);
131     }
132 
133     /**
134      * @hide Asserts that array {@code actual} is the same size and every element equals
135      * those in array {@code expected}. On failure, message indicates first
136      * specific element mismatch.
137      */
assertEquals( String message, long[] expected, long[] actual)138     public static void assertEquals(
139             String message, long[] expected, long[] actual) {
140         if (expected.length != actual.length) {
141             failWrongLength(message, expected.length, actual.length);
142         }
143         for (int i = 0; i < expected.length; i++) {
144             if (expected[i] != actual[i]) {
145                 failWrongElement(message, i, expected[i], actual[i]);
146             }
147         }
148     }
149 
150     /**
151      * @hide Asserts that array {@code actual} is the same size and every element equals
152      * those in array {@code expected}. On failure, message indicates first
153      * specific element mismatch.
154      */
assertEquals(long[] expected, long[] actual)155     public static void assertEquals(long[] expected, long[] actual) {
156         assertEquals(null, expected, actual);
157     }
158 
159 
160     /**
161      * Asserts that array {@code actual} is the same size and every element equals
162      * those in array {@code expected}. On failure, message indicates first
163      * specific element mismatch.
164      */
assertEquals( String message, double[] expected, double[] actual)165     public static void assertEquals(
166             String message, double[] expected, double[] actual) {
167         if (expected.length != actual.length) {
168             failWrongLength(message, expected.length, actual.length);
169         }
170         for (int i = 0; i < expected.length; i++) {
171             if (expected[i] != actual[i]) {
172                 failWrongElement(message, i, expected[i], actual[i]);
173             }
174         }
175     }
176 
177     /**
178      * Asserts that array {@code actual} is the same size and every element equals
179      * those in array {@code expected}. On failure, message indicates first
180      * specific element mismatch.
181      */
assertEquals(double[] expected, double[] actual)182     public static void assertEquals(double[] expected, double[] actual) {
183         assertEquals(null, expected, actual);
184     }
185 
186     /**
187      * Asserts that array {@code actual} is the same size and every element
188      * is the same as those in array {@code expected}. Note that this uses
189      * {@code equals()} instead of {@code ==} to compare the objects.
190      * {@code null} will be considered equal to {@code null} (unlike SQL).
191      * On failure, message indicates first specific element mismatch.
192      */
assertEquals( String message, Object[] expected, Object[] actual)193     public static void assertEquals(
194             String message, Object[] expected, Object[] actual) {
195         if (expected.length != actual.length) {
196             failWrongLength(message, expected.length, actual.length);
197         }
198         for (int i = 0; i < expected.length; i++) {
199             Object exp = expected[i];
200             Object act = actual[i];
201             // The following borrowed from java.util.equals(Object[], Object[]).
202             if (!((exp==null) ? act==null : exp.equals(act))) {
203                 failWrongElement(message, i, exp, act);
204             }
205         }
206     }
207 
208     /**
209      * Asserts that array {@code actual} is the same size and every element
210      * is the same as those in array {@code expected}. Note that this uses
211      * {@code ==} instead of {@code equals()} to compare the objects.
212      * On failure, message indicates first specific element mismatch.
213      */
assertEquals(Object[] expected, Object[] actual)214     public static void assertEquals(Object[] expected, Object[] actual) {
215         assertEquals(null, expected, actual);
216     }
217 
218     /** Asserts that two sets contain the same elements. */
assertEquals( String message, Set<? extends Object> expected, Set<? extends Object> actual)219     public static void assertEquals(
220             String message, Set<? extends Object> expected, Set<? extends Object> actual) {
221         Set<Object> onlyInExpected = new HashSet<Object>(expected);
222         onlyInExpected.removeAll(actual);
223         Set<Object> onlyInActual = new HashSet<Object>(actual);
224         onlyInActual.removeAll(expected);
225         if (onlyInExpected.size() != 0 || onlyInActual.size() != 0) {
226             Set<Object> intersection = new HashSet<Object>(expected);
227             intersection.retainAll(actual);
228             failWithMessage(
229                     message,
230                     "Sets do not match.\nOnly in expected: " + onlyInExpected
231                     + "\nOnly in actual: " + onlyInActual
232                     + "\nIntersection: " + intersection);
233         }
234     }
235 
236     /** Asserts that two sets contain the same elements. */
assertEquals(Set<? extends Object> expected, Set<? extends Object> actual)237     public static void assertEquals(Set<? extends Object> expected, Set<? extends Object> actual) {
238         assertEquals(null, expected, actual);
239     }
240 
241     /**
242      * Asserts that {@code expectedRegex} exactly matches {@code actual} and
243      * fails with {@code message} if it does not.  The MatchResult is returned
244      * in case the test needs access to any captured groups.  Note that you can
245      * also use this for a literal string, by wrapping your expected string in
246      * {@link Pattern#quote}.
247      */
assertMatchesRegex( String message, String expectedRegex, String actual)248     public static MatchResult assertMatchesRegex(
249             String message, String expectedRegex, String actual) {
250         if (actual == null) {
251             failNotMatches(message, expectedRegex, actual);
252         }
253         Matcher matcher = getMatcher(expectedRegex, actual);
254         if (!matcher.matches()) {
255             failNotMatches(message, expectedRegex, actual);
256         }
257         return matcher;
258     }
259 
260     /**
261      * Variant of {@link #assertMatchesRegex(String,String,String)} using a
262      * generic message.
263      */
assertMatchesRegex( String expectedRegex, String actual)264     public static MatchResult assertMatchesRegex(
265             String expectedRegex, String actual) {
266         return assertMatchesRegex(null, expectedRegex, actual);
267     }
268 
269     /**
270      * Asserts that {@code expectedRegex} matches any substring of {@code actual}
271      * and fails with {@code message} if it does not.  The Matcher is returned in
272      * case the test needs access to any captured groups.  Note that you can also
273      * use this for a literal string, by wrapping your expected string in
274      * {@link Pattern#quote}.
275      */
assertContainsRegex( String message, String expectedRegex, String actual)276     public static MatchResult assertContainsRegex(
277             String message, String expectedRegex, String actual) {
278         if (actual == null) {
279             failNotContains(message, expectedRegex, actual);
280         }
281         Matcher matcher = getMatcher(expectedRegex, actual);
282         if (!matcher.find()) {
283             failNotContains(message, expectedRegex, actual);
284         }
285         return matcher;
286     }
287 
288     /**
289      * Variant of {@link #assertContainsRegex(String,String,String)} using a
290      * generic message.
291      */
assertContainsRegex( String expectedRegex, String actual)292     public static MatchResult assertContainsRegex(
293             String expectedRegex, String actual) {
294         return assertContainsRegex(null, expectedRegex, actual);
295     }
296 
297     /**
298      * Asserts that {@code expectedRegex} does not exactly match {@code actual},
299      * and fails with {@code message} if it does. Note that you can also use
300      * this for a literal string, by wrapping your expected string in
301      * {@link Pattern#quote}.
302      */
assertNotMatchesRegex( String message, String expectedRegex, String actual)303     public static void assertNotMatchesRegex(
304             String message, String expectedRegex, String actual) {
305         Matcher matcher = getMatcher(expectedRegex, actual);
306         if (matcher.matches()) {
307             failMatch(message, expectedRegex, actual);
308         }
309     }
310 
311     /**
312      * Variant of {@link #assertNotMatchesRegex(String,String,String)} using a
313      * generic message.
314      */
assertNotMatchesRegex( String expectedRegex, String actual)315     public static void assertNotMatchesRegex(
316             String expectedRegex, String actual) {
317         assertNotMatchesRegex(null, expectedRegex, actual);
318     }
319 
320     /**
321      * Asserts that {@code expectedRegex} does not match any substring of
322      * {@code actual}, and fails with {@code message} if it does.  Note that you
323      * can also use this for a literal string, by wrapping your expected string
324      * in {@link Pattern#quote}.
325      */
assertNotContainsRegex( String message, String expectedRegex, String actual)326     public static void assertNotContainsRegex(
327             String message, String expectedRegex, String actual) {
328         Matcher matcher = getMatcher(expectedRegex, actual);
329         if (matcher.find()) {
330             failContains(message, expectedRegex, actual);
331         }
332     }
333 
334     /**
335      * Variant of {@link #assertNotContainsRegex(String,String,String)} using a
336      * generic message.
337      */
assertNotContainsRegex( String expectedRegex, String actual)338     public static void assertNotContainsRegex(
339             String expectedRegex, String actual) {
340         assertNotContainsRegex(null, expectedRegex, actual);
341     }
342 
343     /**
344      * Asserts that {@code actual} contains precisely the elements
345      * {@code expected}, and in the same order.
346      */
assertContentsInOrder( String message, Iterable<?> actual, Object... expected)347     public static void assertContentsInOrder(
348             String message, Iterable<?> actual, Object... expected) {
349         ArrayList actualList = new ArrayList();
350         for (Object o : actual) {
351             actualList.add(o);
352         }
353         Assert.assertEquals(message, Arrays.asList(expected), actualList);
354     }
355 
356     /**
357      * Variant of assertContentsInOrder(String, Iterable<?>, Object...)
358      * using a generic message.
359      */
assertContentsInOrder( Iterable<?> actual, Object... expected)360     public static void assertContentsInOrder(
361             Iterable<?> actual, Object... expected) {
362         assertContentsInOrder((String) null, actual, expected);
363     }
364 
365     /**
366      * Asserts that {@code actual} contains precisely the elements
367      * {@code expected}, but in any order.
368      */
assertContentsInAnyOrder(String message, Iterable<?> actual, Object... expected)369     public static void assertContentsInAnyOrder(String message, Iterable<?> actual,
370             Object... expected) {
371         HashMap<Object, Object> expectedMap = new HashMap<Object, Object>(expected.length);
372         for (Object expectedObj : expected) {
373             expectedMap.put(expectedObj, expectedObj);
374         }
375 
376         for (Object actualObj : actual) {
377             if (expectedMap.remove(actualObj) == null) {
378                 failWithMessage(message, "Extra object in actual: (" + actualObj.toString() + ")");
379             }
380         }
381 
382         if (expectedMap.size() > 0) {
383             failWithMessage(message, "Extra objects in expected.");
384         }
385     }
386 
387     /**
388      * Variant of assertContentsInAnyOrder(String, Iterable<?>, Object...)
389      * using a generic message.
390      */
assertContentsInAnyOrder(Iterable<?> actual, Object... expected)391     public static void assertContentsInAnyOrder(Iterable<?> actual, Object... expected) {
392         assertContentsInAnyOrder((String)null, actual, expected);
393     }
394 
395     /**
396      * Asserts that {@code iterable} is empty.
397      */
assertEmpty(String message, Iterable<?> iterable)398     public static void assertEmpty(String message, Iterable<?> iterable) {
399         if (iterable.iterator().hasNext()) {
400             failNotEmpty(message, iterable.toString());
401         }
402     }
403 
404     /**
405      * Variant of {@link #assertEmpty(String, Iterable)} using a
406      * generic message.
407      */
assertEmpty(Iterable<?> iterable)408     public static void assertEmpty(Iterable<?> iterable) {
409         assertEmpty(null, iterable);
410     }
411 
412     /**
413      * Asserts that {@code map} is empty.
414      */
assertEmpty(String message, Map<?,?> map)415     public static void assertEmpty(String message, Map<?,?> map) {
416         if (!map.isEmpty()) {
417             failNotEmpty(message, map.toString());
418         }
419     }
420 
421     /**
422      * Variant of {@link #assertEmpty(String, Map)} using a generic
423      * message.
424      */
assertEmpty(Map<?,?> map)425     public  static void assertEmpty(Map<?,?> map) {
426         assertEmpty(null, map);
427     }
428 
429     /**
430      * Asserts that {@code iterable} is not empty.
431      */
assertNotEmpty(String message, Iterable<?> iterable)432     public static void assertNotEmpty(String message, Iterable<?> iterable) {
433         if (!iterable.iterator().hasNext()) {
434             failEmpty(message);
435         }
436     }
437 
438     /**
439      * Variant of assertNotEmpty(String, Iterable<?>)
440      * using a generic message.
441      */
assertNotEmpty(Iterable<?> iterable)442     public static void assertNotEmpty(Iterable<?> iterable) {
443         assertNotEmpty(null, iterable);
444     }
445 
446     /**
447      * Asserts that {@code map} is not empty.
448      */
assertNotEmpty(String message, Map<?,?> map)449     public static void assertNotEmpty(String message, Map<?,?> map) {
450         if (map.isEmpty()) {
451             failEmpty(message);
452         }
453     }
454 
455     /**
456      * Variant of {@link #assertNotEmpty(String, Map)} using a generic
457      * message.
458      */
assertNotEmpty(Map<?,?> map)459     public static void assertNotEmpty(Map<?,?> map) {
460         assertNotEmpty(null, map);
461     }
462 
463     /**
464      * Utility for testing equals() and hashCode() results at once.
465      * Tests that lhs.equals(rhs) matches expectedResult, as well as
466      * rhs.equals(lhs).  Also tests that hashCode() return values are
467      * equal if expectedResult is true.  (hashCode() is not tested if
468      * expectedResult is false, as unequal objects can have equal hashCodes.)
469      *
470      * @param lhs An Object for which equals() and hashCode() are to be tested.
471      * @param rhs As lhs.
472      * @param expectedResult True if the objects should compare equal,
473      *   false if not.
474      */
checkEqualsAndHashCodeMethods( String message, Object lhs, Object rhs, boolean expectedResult)475     public static void checkEqualsAndHashCodeMethods(
476             String message, Object lhs, Object rhs, boolean expectedResult) {
477 
478         if ((lhs == null) && (rhs == null)) {
479             Assert.assertTrue(
480                     "Your check is dubious...why would you expect null != null?",
481                     expectedResult);
482             return;
483         }
484 
485         if ((lhs == null) || (rhs == null)) {
486             Assert.assertFalse(
487                     "Your check is dubious...why would you expect an object "
488                             + "to be equal to null?", expectedResult);
489         }
490 
491         if (lhs != null) {
492             Assert.assertEquals(message, expectedResult, lhs.equals(rhs));
493         }
494         if (rhs != null) {
495             Assert.assertEquals(message, expectedResult, rhs.equals(lhs));
496         }
497 
498         if (expectedResult) {
499             String hashMessage =
500                     "hashCode() values for equal objects should be the same";
501             if (message != null) {
502                 hashMessage += ": " + message;
503             }
504             Assert.assertTrue(hashMessage, lhs.hashCode() == rhs.hashCode());
505         }
506     }
507 
508     /**
509      * Variant of
510      * checkEqualsAndHashCodeMethods(String,Object,Object,boolean...)}
511      * using a generic message.
512      */
checkEqualsAndHashCodeMethods(Object lhs, Object rhs, boolean expectedResult)513     public static void checkEqualsAndHashCodeMethods(Object lhs, Object rhs,
514             boolean expectedResult) {
515         checkEqualsAndHashCodeMethods((String) null, lhs, rhs, expectedResult);
516     }
517 
getMatcher(String expectedRegex, String actual)518     private static Matcher getMatcher(String expectedRegex, String actual) {
519         Pattern pattern = Pattern.compile(expectedRegex);
520         return pattern.matcher(actual);
521     }
522 
failEqual(String message, Object unexpected)523     private static void failEqual(String message, Object unexpected) {
524         failWithMessage(message, "expected not to be:<" + unexpected + ">");
525     }
526 
failWrongLength( String message, int expected, int actual)527     private static void failWrongLength(
528             String message, int expected, int actual) {
529         failWithMessage(message, "expected array length:<" + expected
530                 + "> but was:<" + actual + '>');
531     }
532 
failWrongElement( String message, int index, Object expected, Object actual)533     private static void failWrongElement(
534             String message, int index, Object expected, Object actual) {
535         failWithMessage(message, "expected array element[" + index + "]:<"
536                 + expected + "> but was:<" + actual + '>');
537     }
538 
failNotMatches( String message, String expectedRegex, String actual)539     private static void failNotMatches(
540             String message, String expectedRegex, String actual) {
541         String actualDesc = (actual == null) ? "null" : ('<' + actual + '>');
542         failWithMessage(message, "expected to match regex:<" + expectedRegex
543                 + "> but was:" + actualDesc);
544     }
545 
failNotContains( String message, String expectedRegex, String actual)546     private static void failNotContains(
547             String message, String expectedRegex, String actual) {
548         String actualDesc = (actual == null) ? "null" : ('<' + actual + '>');
549         failWithMessage(message, "expected to contain regex:<" + expectedRegex
550                 + "> but was:" + actualDesc);
551     }
552 
failMatch( String message, String expectedRegex, String actual)553     private static void failMatch(
554             String message, String expectedRegex, String actual) {
555         failWithMessage(message, "expected not to match regex:<" + expectedRegex
556                 + "> but was:<" + actual + '>');
557     }
558 
failContains( String message, String expectedRegex, String actual)559     private static void failContains(
560             String message, String expectedRegex, String actual) {
561         failWithMessage(message, "expected not to contain regex:<" + expectedRegex
562                 + "> but was:<" + actual + '>');
563     }
564 
failNotEmpty( String message, String actual)565     private static void failNotEmpty(
566             String message, String actual) {
567         failWithMessage(message, "expected to be empty, but contained: <"
568                 + actual + ">");
569     }
570 
failEmpty(String message)571     private static void failEmpty(String message) {
572         failWithMessage(message, "expected not to be empty, but was");
573     }
574 
failWithMessage(String userMessage, String ourMessage)575     private static void failWithMessage(String userMessage, String ourMessage) {
576         Assert.fail((userMessage == null)
577                 ? ourMessage
578                 : userMessage + ' ' + ourMessage);
579     }
580 
equal(Object a, Object b)581     private static boolean equal(Object a, Object b) {
582         return a == b || (a != null && a.equals(b));
583     }
584 
585 }
586