1package org.testng;
2
3import static org.testng.internal.EclipseInterface.ASSERT_LEFT;
4import static org.testng.internal.EclipseInterface.ASSERT_LEFT2;
5import static org.testng.internal.EclipseInterface.ASSERT_MIDDLE;
6import static org.testng.internal.EclipseInterface.ASSERT_RIGHT;
7
8import org.testng.collections.Lists;
9
10import java.lang.reflect.Array;
11import java.util.Arrays;
12import java.util.Collection;
13import java.util.Iterator;
14import java.util.List;
15import java.util.Map;
16import java.util.Set;
17
18
19/**
20 * Assertion tool class. Presents assertion methods with a more natural parameter order.
21 * The order is always <B>actualValue</B>, <B>expectedValue</B> [, message].
22 *
23 * @author <a href='mailto:the_mindstorm@evolva.ro'>Alexandru Popescu</a>
24 */
25public class Assert {
26
27  /**
28   * Protect constructor since it is a static only class
29   */
30  protected Assert() {
31    // hide constructor
32  }
33
34  /**
35   * Asserts that a condition is true. If it isn't,
36   * an AssertionError, with the given message, is thrown.
37   * @param condition the condition to evaluate
38   * @param message the assertion error message
39   */
40  static public void assertTrue(boolean condition, String message) {
41    if(!condition) {
42      failNotEquals(condition, Boolean.TRUE, message);
43    }
44  }
45
46  /**
47   * Asserts that a condition is true. If it isn't,
48   * an AssertionError is thrown.
49   * @param condition the condition to evaluate
50   */
51  static public void assertTrue(boolean condition) {
52    assertTrue(condition, null);
53  }
54
55  /**
56   * Asserts that a condition is false. If it isn't,
57   * an AssertionError, with the given message, is thrown.
58   * @param condition the condition to evaluate
59   * @param message the assertion error message
60   */
61  static public void assertFalse(boolean condition, String message) {
62    if(condition) {
63      failNotEquals(condition, Boolean.FALSE, message); // TESTNG-81
64    }
65  }
66
67  /**
68   * Asserts that a condition is false. If it isn't,
69   * an AssertionError is thrown.
70   * @param condition the condition to evaluate
71   */
72  static public void assertFalse(boolean condition) {
73    assertFalse(condition, null);
74  }
75
76  /**
77   * Fails a test with the given message and wrapping the original exception.
78   *
79   * @param message the assertion error message
80   * @param realCause the original exception
81   */
82  static public void fail(String message, Throwable realCause) {
83    AssertionError ae = new AssertionError(message);
84    ae.initCause(realCause);
85
86    throw ae;
87  }
88
89  /**
90   * Fails a test with the given message.
91   * @param message the assertion error message
92   */
93  static public void fail(String message) {
94    throw new AssertionError(message);
95  }
96
97  /**
98   * Fails a test with no message.
99   */
100  static public void fail() {
101    fail(null);
102  }
103
104  /**
105   * Asserts that two objects are equal. If they are not,
106   * an AssertionError, with the given message, is thrown.
107   * @param actual the actual value
108   * @param expected the expected value
109   * @param message the assertion error message
110   */
111  static public void assertEquals(Object actual, Object expected, String message) {
112    if (expected != null && expected.getClass().isArray()) {
113       assertArrayEquals(actual, expected, message);
114       return;
115    }
116    assertEqualsImpl(actual, expected, message);
117  }
118
119  /**
120   * Differs from {@link #assertEquals(Object, Object, String)} by not taking arrays into
121   * special consideration hence comparing them by reference. Intended to be called directly
122   * to test equality of collections content.
123   */
124  private static void assertEqualsImpl(Object actual, Object expected,
125          String message) {
126      if((expected == null) && (actual == null)) {
127        return;
128      }
129      if(expected == null ^ actual == null) {
130        failNotEquals(actual, expected, message);
131      }
132      if (expected.equals(actual) && actual.equals(expected)) {
133        return;
134      }
135      failNotEquals(actual, expected, message);
136    }
137
138  private static void assertArrayEquals(Object actual, Object expected, String message) {
139    if (expected == actual) {
140      return;
141    }
142    if (null == expected) {
143      fail("expected a null array, but not null found. " + message);
144    }
145    if (null == actual) {
146      fail("expected not null array, but null found. " + message);
147    }
148    //is called only when expected is an array
149    if (actual.getClass().isArray()) {
150      int expectedLength = Array.getLength(expected);
151      if (expectedLength == Array.getLength(actual)) {
152         for (int i = 0 ; i < expectedLength ; i++) {
153            Object _actual = Array.get(actual, i);
154            Object _expected = Array.get(expected, i);
155            try {
156               assertEquals(_actual, _expected);
157            } catch (AssertionError ae) {
158               failNotEquals(actual, expected, message == null ? "" : message
159                        + " (values at index " + i + " are not the same)");
160            }
161         }
162         //array values matched
163         return;
164      } else {
165         failNotEquals(Array.getLength(actual), expectedLength, message == null ? "" : message
166                  + " (Array lengths are not the same)");
167      }
168    }
169    failNotEquals(actual, expected, message);
170  }
171
172  /**
173   * Asserts that two objects are equal. If they are not,
174   * an AssertionError is thrown.
175   * @param actual the actual value
176   * @param expected the expected value
177   */
178  static public void assertEquals(Object actual, Object expected) {
179    assertEquals(actual, expected, null);
180  }
181
182  /**
183   * Asserts that two Strings are equal. If they are not,
184   * an AssertionError, with the given message, is thrown.
185   * @param actual the actual value
186   * @param expected the expected value
187   * @param message the assertion error message
188   */
189  static public void assertEquals(String actual, String expected, String message) {
190    assertEquals((Object) actual, (Object) expected, message);
191  }
192
193  /**
194   * Asserts that two Strings are equal. If they are not,
195   * an AssertionError is thrown.
196   * @param actual the actual value
197   * @param expected the expected value
198   */
199  static public void assertEquals(String actual, String expected) {
200    assertEquals(actual, expected, null);
201  }
202
203  /**
204   * Asserts that two doubles are equal concerning a delta.  If they are not,
205   * an AssertionError, with the given message, is thrown.  If the expected
206   * value is infinity then the delta value is ignored.
207   * @param actual the actual value
208   * @param expected the expected value
209   * @param delta the absolute tolerable difference between the actual and expected values
210   * @param message the assertion error message
211   */
212  static public void assertEquals(double actual, double expected, double delta, String message) {
213    // handle infinity specially since subtracting to infinite values gives NaN and the
214    // the following test fails
215    if(Double.isInfinite(expected)) {
216      if(!(expected == actual)) {
217        failNotEquals(actual, expected, message);
218      }
219    }
220    else if (Double.isNaN(expected)) {
221      if (!Double.isNaN(actual)) {
222        failNotEquals(actual, expected, message);
223      }
224    }
225    else if(!(Math.abs(expected - actual) <= delta)) {
226      failNotEquals(actual, expected, message);
227    }
228  }
229
230  /**
231   * Asserts that two doubles are equal concerning a delta. If they are not,
232   * an AssertionError is thrown. If the expected value is infinity then the
233   * delta value is ignored.
234   * @param actual the actual value
235   * @param expected the expected value
236   * @param delta the absolute tolerable difference between the actual and expected values
237   */
238  static public void assertEquals(double actual, double expected, double delta) {
239    assertEquals(actual, expected, delta, null);
240  }
241
242  /**
243   * Asserts that two floats are equal concerning a delta. If they are not,
244   * an AssertionError, with the given message, is thrown.  If the expected
245   * value is infinity then the delta value is ignored.
246   * @param actual the actual value
247   * @param expected the expected value
248   * @param delta the absolute tolerable difference between the actual and expected values
249   * @param message the assertion error message
250   */
251  static public void assertEquals(float actual, float expected, float delta, String message) {
252    // handle infinity specially since subtracting to infinite values gives NaN and the
253    // the following test fails
254    if(Float.isInfinite(expected)) {
255      if(!(expected == actual)) {
256        failNotEquals(actual, expected, message);
257      }
258    }
259    else if(!(Math.abs(expected - actual) <= delta)) {
260      failNotEquals(actual, expected, message);
261    }
262  }
263
264  /**
265   * Asserts that two floats are equal concerning a delta. If they are not,
266   * an AssertionError is thrown. If the expected
267   * value is infinity then the delta value is ignored.
268   * @param actual the actual value
269   * @param expected the expected value
270   * @param delta the absolute tolerable difference between the actual and expected values
271   */
272  static public void assertEquals(float actual, float expected, float delta) {
273    assertEquals(actual, expected, delta, null);
274  }
275
276  /**
277   * Asserts that two longs are equal. If they are not,
278   * an AssertionError, with the given message, is thrown.
279   * @param actual the actual value
280   * @param expected the expected value
281   * @param message the assertion error message
282   */
283  static public void assertEquals(long actual, long expected, String message) {
284    assertEquals(Long.valueOf(actual), Long.valueOf(expected), message);
285  }
286
287  /**
288   * Asserts that two longs are equal. If they are not,
289   * an AssertionError is thrown.
290   * @param actual the actual value
291   * @param expected the expected value
292   */
293  static public void assertEquals(long actual, long expected) {
294    assertEquals(actual, expected, null);
295  }
296
297  /**
298   * Asserts that two booleans are equal. If they are not,
299   * an AssertionError, with the given message, is thrown.
300   * @param actual the actual value
301   * @param expected the expected value
302   * @param message the assertion error message
303   */
304  static public void assertEquals(boolean actual, boolean expected, String message) {
305    assertEquals( Boolean.valueOf(actual), Boolean.valueOf(expected), message);
306  }
307
308  /**
309   * Asserts that two booleans are equal. If they are not,
310   * an AssertionError is thrown.
311   * @param actual the actual value
312   * @param expected the expected value
313   */
314  static public void assertEquals(boolean actual, boolean expected) {
315    assertEquals(actual, expected, null);
316  }
317
318  /**
319   * Asserts that two bytes are equal. If they are not,
320   * an AssertionError, with the given message, is thrown.
321   * @param actual the actual value
322   * @param expected the expected value
323   * @param message the assertion error message
324   */
325  static public void assertEquals(byte actual, byte expected, String message) {
326    assertEquals(Byte.valueOf(actual), Byte.valueOf(expected), message);
327  }
328
329  /**
330   * Asserts that two bytes are equal. If they are not,
331   * an AssertionError is thrown.
332   * @param actual the actual value
333   * @param expected the expected value
334   */
335  static public void assertEquals(byte actual, byte expected) {
336    assertEquals(actual, expected, null);
337  }
338
339  /**
340   * Asserts that two chars are equal. If they are not,
341   * an AssertionFailedError, with the given message, is thrown.
342   * @param actual the actual value
343   * @param expected the expected value
344   * @param message the assertion error message
345   */
346  static public void assertEquals(char actual, char expected, String message) {
347    assertEquals(Character.valueOf(actual), Character.valueOf(expected), message);
348  }
349
350  /**
351   * Asserts that two chars are equal. If they are not,
352   * an AssertionError is thrown.
353   * @param actual the actual value
354   * @param expected the expected value
355   */
356  static public void assertEquals(char actual, char expected) {
357    assertEquals(actual, expected, null);
358  }
359
360  /**
361   * Asserts that two shorts are equal. If they are not,
362   * an AssertionFailedError, with the given message, is thrown.
363   * @param actual the actual value
364   * @param expected the expected value
365   * @param message the assertion error message
366   */
367  static public void assertEquals(short actual, short expected, String message) {
368    assertEquals(Short.valueOf(actual), Short.valueOf(expected), message);
369  }
370
371  /**
372   * Asserts that two shorts are equal. If they are not,
373   * an AssertionError is thrown.
374   * @param actual the actual value
375   * @param expected the expected value
376   */
377  static public void assertEquals(short actual, short expected) {
378    assertEquals(actual, expected, null);
379  }
380
381  /**
382   * Asserts that two ints are equal. If they are not,
383   * an AssertionFailedError, with the given message, is thrown.
384   * @param actual the actual value
385   * @param expected the expected value
386   * @param message the assertion error message
387   */
388  static public void assertEquals(int actual,  int expected, String message) {
389    assertEquals(Integer.valueOf(actual), Integer.valueOf(expected), message);
390  }
391
392  /**
393   * Asserts that two ints are equal. If they are not,
394   * an AssertionError is thrown.
395   * @param actual the actual value
396   * @param expected the expected value
397   */
398  static public void assertEquals(int actual, int expected) {
399    assertEquals(actual, expected, null);
400  }
401
402  /**
403   * Asserts that an object isn't null. If it is,
404   * an AssertionError is thrown.
405   * @param object the assertion object
406   */
407  static public void assertNotNull(Object object) {
408    assertNotNull(object, null);
409  }
410
411  /**
412   * Asserts that an object isn't null. If it is,
413   * an AssertionFailedError, with the given message, is thrown.
414   * @param object the assertion object
415   * @param message the assertion error message
416   */
417  static public void assertNotNull(Object object, String message) {
418    if (object == null) {
419      String formatted = "";
420      if(message != null) {
421        formatted = message + " ";
422      }
423      fail(formatted + "expected object to not be null");
424    }
425    assertTrue(object != null, message);
426  }
427
428  /**
429   * Asserts that an object is null. If it is not,
430   * an AssertionError, with the given message, is thrown.
431   * @param object the assertion object
432   */
433  static public void assertNull(Object object) {
434    assertNull(object, null);
435  }
436
437  /**
438   * Asserts that an object is null. If it is not,
439   * an AssertionFailedError, with the given message, is thrown.
440   * @param object the assertion object
441   * @param message the assertion error message
442   */
443  static public void assertNull(Object object, String message) {
444    if (object != null) {
445      failNotSame(object, null, message);
446    }
447  }
448
449  /**
450   * Asserts that two objects refer to the same object. If they do not,
451   * an AssertionFailedError, with the given message, is thrown.
452   * @param actual the actual value
453   * @param expected the expected value
454   * @param message the assertion error message
455   */
456  static public void assertSame(Object actual, Object expected, String message) {
457    if(expected == actual) {
458      return;
459    }
460    failNotSame(actual, expected, message);
461  }
462
463  /**
464   * Asserts that two objects refer to the same object. If they do not,
465   * an AssertionError is thrown.
466   * @param actual the actual value
467   * @param expected the expected value
468   */
469  static public void assertSame(Object actual, Object expected) {
470    assertSame(actual, expected, null);
471  }
472
473  /**
474   * Asserts that two objects do not refer to the same objects. If they do,
475   * an AssertionError, with the given message, is thrown.
476   * @param actual the actual value
477   * @param expected the expected value
478   * @param message the assertion error message
479   */
480  static public void assertNotSame(Object actual, Object expected, String message) {
481    if(expected == actual) {
482      failSame(actual, expected, message);
483    }
484  }
485
486  /**
487   * Asserts that two objects do not refer to the same object. If they do,
488   * an AssertionError is thrown.
489   * @param actual the actual value
490   * @param expected the expected value
491   */
492  static public void assertNotSame(Object actual, Object expected) {
493    assertNotSame(actual, expected, null);
494  }
495
496  static private void failSame(Object actual, Object expected, String message) {
497    String formatted = "";
498    if(message != null) {
499      formatted = message + " ";
500    }
501    fail(formatted + ASSERT_LEFT2 + expected + ASSERT_MIDDLE + actual + ASSERT_RIGHT);
502  }
503
504  static private void failNotSame(Object actual, Object expected, String message) {
505    String formatted = "";
506    if(message != null) {
507      formatted = message + " ";
508    }
509    fail(formatted + ASSERT_LEFT + expected + ASSERT_MIDDLE + actual + ASSERT_RIGHT);
510  }
511
512  static private void failNotEquals(Object actual , Object expected, String message ) {
513    fail(format(actual, expected, message));
514  }
515
516  static String format(Object actual, Object expected, String message) {
517    String formatted = "";
518    if (null != message) {
519      formatted = message + " ";
520    }
521
522    return formatted + ASSERT_LEFT + expected + ASSERT_MIDDLE + actual + ASSERT_RIGHT;
523  }
524
525  /**
526   * Asserts that two collections contain the same elements in the same order. If they do not,
527   * an AssertionError is thrown.
528   *
529   * @param actual the actual value
530   * @param expected the expected value
531   */
532  static public void assertEquals(Collection<?> actual, Collection<?> expected) {
533    assertEquals(actual, expected, null);
534  }
535
536  /**
537   * Asserts that two collections contain the same elements in the same order. If they do not,
538   * an AssertionError, with the given message, is thrown.
539   * @param actual the actual value
540   * @param expected the expected value
541   * @param message the assertion error message
542   */
543  static public void assertEquals(Collection<?> actual, Collection<?> expected, String message) {
544    if(actual == expected) {
545      return;
546    }
547
548    if (actual == null || expected == null) {
549      if (message != null) {
550        fail(message);
551      } else {
552        fail("Collections not equal: expected: " + expected + " and actual: " + actual);
553      }
554    }
555
556    assertEquals(actual.size(), expected.size(), (message == null ? "" : message + ": ") + "lists don't have the same size");
557
558    Iterator<?> actIt = actual.iterator();
559    Iterator<?> expIt = expected.iterator();
560    int i = -1;
561    while(actIt.hasNext() && expIt.hasNext()) {
562      i++;
563      Object e = expIt.next();
564      Object a = actIt.next();
565      String explanation = "Lists differ at element [" + i + "]: " + e + " != " + a;
566      String errorMessage = message == null ? explanation : message + ": " + explanation;
567
568      assertEqualsImpl(a, e, errorMessage);
569    }
570  }
571
572  /** Asserts that two iterators return the same elements in the same order. If they do not,
573   * an AssertionError is thrown.
574   * Please note that this assert iterates over the elements and modifies the state of the iterators.
575   * @param actual the actual value
576   * @param expected the expected value
577   */
578  static public void assertEquals(Iterator<?> actual, Iterator<?> expected) {
579    assertEquals(actual, expected, null);
580  }
581
582  /** Asserts that two iterators return the same elements in the same order. If they do not,
583   * an AssertionError, with the given message, is thrown.
584   * Please note that this assert iterates over the elements and modifies the state of the iterators.
585   * @param actual the actual value
586   * @param expected the expected value
587   * @param message the assertion error message
588   */
589  static public void assertEquals(Iterator<?> actual, Iterator<?> expected, String message) {
590    if(actual == expected) {
591      return;
592    }
593
594    if(actual == null || expected == null) {
595      if(message != null) {
596        fail(message);
597      } else {
598        fail("Iterators not equal: expected: " + expected + " and actual: " + actual);
599      }
600    }
601
602    int i = -1;
603    while(actual.hasNext() && expected.hasNext()) {
604
605      i++;
606      Object e = expected.next();
607      Object a = actual.next();
608      String explanation = "Iterators differ at element [" + i + "]: " + e + " != " + a;
609      String errorMessage = message == null ? explanation : message + ": " + explanation;
610
611      assertEqualsImpl(a, e, errorMessage);
612
613    }
614
615    if(actual.hasNext()) {
616
617      String explanation = "Actual iterator returned more elements than the expected iterator.";
618      String errorMessage = message == null ? explanation : message + ": " + explanation;
619      fail(errorMessage);
620
621    } else if(expected.hasNext()) {
622
623      String explanation = "Expected iterator returned more elements than the actual iterator.";
624      String errorMessage = message == null ? explanation : message + ": " + explanation;
625      fail(errorMessage);
626
627    }
628
629  }
630
631  /** Asserts that two iterables return iterators with the same elements in the same order. If they do not,
632   * an AssertionError is thrown.
633   * @param actual the actual value
634   * @param expected the expected value
635   */
636  static public void assertEquals(Iterable<?> actual, Iterable<?> expected) {
637    assertEquals(actual, expected, null);
638  }
639
640  /** Asserts that two iterables return iterators with the same elements in the same order. If they do not,
641   * an AssertionError, with the given message, is thrown.
642   * @param actual the actual value
643   * @param expected the expected value
644   * @param message the assertion error message
645   */
646  static public void assertEquals(Iterable<?> actual, Iterable<?> expected, String message) {
647    if(actual == expected) {
648      return;
649    }
650
651    if(actual == null || expected == null) {
652      if(message != null) {
653        fail(message);
654      } else {
655        fail("Iterables not equal: expected: " + expected + " and actual: " + actual);
656      }
657    }
658
659    Iterator<?> actIt = actual.iterator();
660    Iterator<?> expIt = expected.iterator();
661
662    assertEquals(actIt, expIt, message);
663  }
664
665
666
667
668  /**
669   * Asserts that two arrays contain the same elements in the same order. If they do not,
670   * an AssertionError, with the given message, is thrown.
671   * @param actual the actual value
672   * @param expected the expected value
673   * @param message the assertion error message
674   */
675  static public void assertEquals(Object[] actual, Object[] expected, String message) {
676    if(actual == expected) {
677      return;
678    }
679
680    if ((actual == null && expected != null) || (actual != null && expected == null)) {
681      if (message != null) {
682        fail(message);
683      } else {
684        fail("Arrays not equal: " + Arrays.toString(expected) + " and " + Arrays.toString(actual));
685      }
686    }
687    assertEquals(Arrays.asList(actual), Arrays.asList(expected), message);
688  }
689
690  /**
691   * Asserts that two arrays contain the same elements in no particular order. If they do not,
692   * an AssertionError, with the given message, is thrown.
693   * @param actual the actual value
694   * @param expected the expected value
695   * @param message the assertion error message
696   */
697  static public void assertEqualsNoOrder(Object[] actual, Object[] expected, String message) {
698    if(actual == expected) {
699      return;
700    }
701
702    if ((actual == null && expected != null) || (actual != null && expected == null)) {
703      failAssertNoEqual(
704          "Arrays not equal: " + Arrays.toString(expected) + " and " + Arrays.toString(actual),
705          message);
706    }
707
708    if (actual.length != expected.length) {
709      failAssertNoEqual(
710          "Arrays do not have the same size:" + actual.length + " != " + expected.length,
711          message);
712    }
713
714    List<Object> actualCollection = Lists.newArrayList();
715    for (Object a : actual) {
716      actualCollection.add(a);
717    }
718    for (Object o : expected) {
719      actualCollection.remove(o);
720    }
721    if (actualCollection.size() != 0) {
722      failAssertNoEqual(
723          "Arrays not equal: " + Arrays.toString(expected) + " and " + Arrays.toString(actual),
724          message);
725    }
726  }
727
728  private static void failAssertNoEqual(String defaultMessage, String message) {
729    if (message != null) {
730      fail(message);
731    } else {
732      fail(defaultMessage);
733    }
734  }
735
736  /**
737   * Asserts that two arrays contain the same elements in the same order. If they do not,
738   * an AssertionError is thrown.
739   *
740   * @param actual the actual value
741   * @param expected the expected value
742   */
743  static public void assertEquals(Object[] actual, Object[] expected) {
744    assertEquals(actual, expected, null);
745  }
746
747  /**
748   * Asserts that two arrays contain the same elements in no particular order. If they do not,
749   * an AssertionError is thrown.
750   * @param actual the actual value
751   * @param expected the expected value
752   */
753  static public void assertEqualsNoOrder(Object[] actual, Object[] expected) {
754    assertEqualsNoOrder(actual, expected, null);
755  }
756
757  /**
758   * Asserts that two sets are equal.
759   */
760  static public void assertEquals(Set<?> actual, Set<?> expected) {
761    assertEquals(actual, expected, null);
762  }
763
764	/**
765	 * Assert set equals
766	 */
767  static public void assertEquals(Set<?> actual, Set<?> expected, String message) {
768    if (actual == expected) {
769      return;
770    }
771
772    if (actual == null || expected == null) {
773      // Keep the back compatible
774      if (message == null) {
775        fail("Sets not equal: expected: " + expected + " and actual: " + actual);
776      } else {
777        failNotEquals(actual, expected, message);
778      }
779    }
780
781    if (!actual.equals(expected)) {
782      if (message == null) {
783        fail("Sets differ: expected " + expected + " but got " + actual);
784      } else {
785        failNotEquals(actual, expected, message);
786      }
787    }
788  }
789
790  /**
791   * Asserts that two maps are equal.
792   */
793  static public void assertEquals(Map<?, ?> actual, Map<?, ?> expected) {
794    if (actual == expected) {
795      return;
796    }
797
798    if (actual == null || expected == null) {
799      fail("Maps not equal: expected: " + expected + " and actual: " + actual);
800    }
801
802    if (actual.size() != expected.size()) {
803      fail("Maps do not have the same size:" + actual.size() + " != " + expected.size());
804    }
805
806    Set<?> entrySet = actual.entrySet();
807    for (Object anEntrySet : entrySet) {
808      Map.Entry<?, ?> entry = (Map.Entry<?, ?>) anEntrySet;
809      Object key = entry.getKey();
810      Object value = entry.getValue();
811      Object expectedValue = expected.get(key);
812      assertEqualsImpl(value, expectedValue, "Maps do not match for key:" + key + " actual:" + value
813              + " expected:" + expectedValue);
814    }
815
816  }
817
818  /////
819  // assertNotEquals
820  //
821
822  public static void assertNotEquals(Object actual1, Object actual2, String message) {
823    boolean fail = false;
824    try {
825      Assert.assertEquals(actual1, actual2);
826      fail = true;
827    } catch (AssertionError e) {
828    }
829
830    if (fail) {
831      Assert.fail(message);
832    }
833  }
834
835  public static void assertNotEquals(Object actual1, Object actual2) {
836    assertNotEquals(actual1, actual2, null);
837  }
838
839  static void assertNotEquals(String actual1, String actual2, String message) {
840    assertNotEquals((Object) actual1, (Object) actual2, message);
841  }
842
843  static void assertNotEquals(String actual1, String actual2) {
844    assertNotEquals(actual1, actual2, null);
845  }
846
847  static void assertNotEquals(long actual1, long actual2, String message) {
848    assertNotEquals(Long.valueOf(actual1), Long.valueOf(actual2), message);
849  }
850
851  static void assertNotEquals(long actual1, long actual2) {
852    assertNotEquals(actual1, actual2, null);
853  }
854
855  static void assertNotEquals(boolean actual1, boolean actual2, String message) {
856    assertNotEquals(Boolean.valueOf(actual1), Boolean.valueOf(actual2), message);
857  }
858
859  static void assertNotEquals(boolean actual1, boolean actual2) {
860    assertNotEquals(actual1, actual2, null);
861  }
862
863  static void assertNotEquals(byte actual1, byte actual2, String message) {
864    assertNotEquals(Byte.valueOf(actual1), Byte.valueOf(actual2), message);
865  }
866
867  static void assertNotEquals(byte actual1, byte actual2) {
868    assertNotEquals(actual1, actual2, null);
869  }
870
871  static void assertNotEquals(char actual1, char actual2, String message) {
872    assertNotEquals(Character.valueOf(actual1), Character.valueOf(actual2), message);
873  }
874
875  static void assertNotEquals(char actual1, char actual2) {
876    assertNotEquals(actual1, actual2, null);
877  }
878
879  static void assertNotEquals(short actual1, short actual2, String message) {
880    assertNotEquals(Short.valueOf(actual1), Short.valueOf(actual2), message);
881  }
882
883  static void assertNotEquals(short actual1, short actual2) {
884    assertNotEquals(actual1, actual2, null);
885  }
886
887  static void assertNotEquals(int actual1, int actual2, String message) {
888    assertNotEquals(Integer.valueOf(actual1), Integer.valueOf(actual2), message);
889  }
890
891  static void assertNotEquals(int actual1, int actual2) {
892    assertNotEquals(actual1, actual2, null);
893  }
894
895  static public void assertNotEquals(float actual1, float actual2, float delta, String message) {
896    boolean fail = false;
897    try {
898      Assert.assertEquals(actual1, actual2, delta, message);
899      fail = true;
900    } catch (AssertionError e) {
901
902    }
903
904    if (fail) {
905      Assert.fail(message);
906    }
907  }
908
909  static public void assertNotEquals(float actual1, float actual2, float delta) {
910    assertNotEquals(actual1, actual2, delta, null);
911  }
912
913  static public void assertNotEquals(double actual1, double actual2, double delta, String message) {
914    boolean fail = false;
915    try {
916      Assert.assertEquals(actual1, actual2, delta, message);
917      fail = true;
918    } catch (AssertionError e) {
919
920    }
921
922    if (fail) {
923      Assert.fail(message);
924    }
925  }
926
927  static public void assertNotEquals(double actual1, double actual2, double delta) {
928    assertNotEquals(actual1, actual2, delta, null);
929  }
930
931  /**
932   * This interface facilitates the use of {@link #expectThrows} from Java 8. It allows
933   * method references to both void and non-void methods to be passed directly into
934   * expectThrows without wrapping, even if they declare checked exceptions.
935   * <p/>
936   * This interface is not meant to be implemented directly.
937   */
938  public interface ThrowingRunnable {
939    void run() throws Throwable;
940  }
941
942  /**
943   * Asserts that {@code runnable} throws an exception when invoked. If it does not, an
944   * {@link AssertionError} is thrown.
945   *
946   * @param runnable A function that is expected to throw an exception when invoked
947   * @since 6.9.5
948   */
949  public static void assertThrows(ThrowingRunnable runnable) {
950    assertThrows(Throwable.class, runnable);
951  }
952
953  /**
954   * Asserts that {@code runnable} throws an exception of type {@code throwableClass} when
955   * executed. If it does not throw an exception, an {@link AssertionError} is thrown. If it
956   * throws the wrong type of exception, an {@code AssertionError} is thrown describing the
957   * mismatch; the exception that was actually thrown can be obtained by calling {@link
958   * AssertionError#getCause}.
959   *
960   * @param throwableClass the expected type of the exception
961   * @param runnable       A function that is expected to throw an exception when invoked
962   * @since 6.9.5
963   */
964  @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
965  public static <T extends Throwable> void assertThrows(Class<T> throwableClass, ThrowingRunnable runnable) {
966    expectThrows(throwableClass, runnable);
967  }
968
969  /**
970   * Asserts that {@code runnable} throws an exception of type {@code throwableClass} when
971   * executed and returns the exception. If {@code runnable} does not throw an exception, an
972   * {@link AssertionError} is thrown. If it throws the wrong type of exception, an {@code
973   * AssertionError} is thrown describing the mismatch; the exception that was actually thrown can
974   * be obtained by calling {@link AssertionError#getCause}.
975   *
976   * @param throwableClass the expected type of the exception
977   * @param runnable       A function that is expected to throw an exception when invoked
978   * @return The exception thrown by {@code runnable}
979   * @since 6.9.5
980   */
981  public static <T extends Throwable> T expectThrows(Class<T> throwableClass, ThrowingRunnable runnable) {
982    try {
983      runnable.run();
984    } catch (Throwable t) {
985      if (throwableClass.isInstance(t)) {
986        return throwableClass.cast(t);
987      } else {
988        String mismatchMessage = String.format("Expected %s to be thrown, but %s was thrown",
989                throwableClass.getSimpleName(), t.getClass().getSimpleName());
990
991        throw new AssertionError(mismatchMessage, t);
992      }
993    }
994    String message = String.format("Expected %s to be thrown, but nothing was thrown",
995            throwableClass.getSimpleName());
996    throw new AssertionError(message);
997  }
998}
999