--- jsr166/src/test/tck/JSR166TestCase.java 2017/07/22 18:23:59 1.235
+++ jsr166/src/test/tck/JSR166TestCase.java 2019/04/24 17:36:09 1.254
@@ -66,11 +66,14 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
+import java.util.Deque;
import java.util.Enumeration;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.PropertyPermission;
+import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
@@ -99,7 +102,6 @@ import java.util.concurrent.atomic.Atomi
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Pattern;
-import junit.framework.AssertionFailedError;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestResult;
@@ -115,13 +117,21 @@ import junit.framework.TestSuite;
*
*
*
- * - All assertions in code running in generated threads must use
- * the forms {@link #threadFail}, {@link #threadAssertTrue}, {@link
- * #threadAssertEquals}, or {@link #threadAssertNull}, (not
- * {@code fail}, {@code assertTrue}, etc.) It is OK (but not
- * particularly recommended) for other code to use these forms too.
- * Only the most typically used JUnit assertion methods are defined
- * this way, but enough to live with.
+ *
- All code not running in the main test thread (manually spawned threads
+ * or the common fork join pool) must be checked for failure (and completion!).
+ * Mechanisms that can be used to ensure this are:
+ *
+ * - Signalling via a synchronizer like AtomicInteger or CountDownLatch
+ * that the task completed normally, which is checked before returning from
+ * the test method in the main thread.
+ *
- Using the forms {@link #threadFail}, {@link #threadAssertTrue},
+ * or {@link #threadAssertNull}, (not {@code fail}, {@code assertTrue}, etc.)
+ * Only the most typically used JUnit assertion methods are defined
+ * this way, but enough to live with.
+ *
- Recording failure explicitly using {@link #threadUnexpectedException}
+ * or {@link #threadRecordFailure}.
+ *
- Using a wrapper like CheckedRunnable that uses one the mechanisms above.
+ *
*
* - If you override {@link #setUp} or {@link #tearDown}, make sure
* to invoke {@code super.setUp} and {@code super.tearDown} within
@@ -419,11 +429,10 @@ public class JSR166TestCase extends Test
for (String testClassName : testClassNames) {
try {
Class> testClass = Class.forName(testClassName);
- Method m = testClass.getDeclaredMethod("suite",
- new Class>[0]);
+ Method m = testClass.getDeclaredMethod("suite");
suite.addTest(newTestSuite((Test)m.invoke(null)));
- } catch (Exception e) {
- throw new Error("Missing test class", e);
+ } catch (ReflectiveOperationException e) {
+ throw new AssertionError("Missing test class", e);
}
}
}
@@ -445,18 +454,18 @@ public class JSR166TestCase extends Test
}
}
- public static boolean atLeastJava6() { return JAVA_CLASS_VERSION >= 50.0; }
- public static boolean atLeastJava7() { return JAVA_CLASS_VERSION >= 51.0; }
- public static boolean atLeastJava8() { return JAVA_CLASS_VERSION >= 52.0; }
- public static boolean atLeastJava9() {
- return JAVA_CLASS_VERSION >= 53.0
- // As of 2015-09, java9 still uses 52.0 class file version
- || JAVA_SPECIFICATION_VERSION.matches("^(1\\.)?(9|[0-9][0-9])$");
- }
- public static boolean atLeastJava10() {
- return JAVA_CLASS_VERSION >= 54.0
- || JAVA_SPECIFICATION_VERSION.matches("^(1\\.)?[0-9][0-9]$");
- }
+ public static boolean atLeastJava6() { return JAVA_CLASS_VERSION >= 50.0; }
+ public static boolean atLeastJava7() { return JAVA_CLASS_VERSION >= 51.0; }
+ public static boolean atLeastJava8() { return JAVA_CLASS_VERSION >= 52.0; }
+ public static boolean atLeastJava9() { return JAVA_CLASS_VERSION >= 53.0; }
+ public static boolean atLeastJava10() { return JAVA_CLASS_VERSION >= 54.0; }
+ public static boolean atLeastJava11() { return JAVA_CLASS_VERSION >= 55.0; }
+ public static boolean atLeastJava12() { return JAVA_CLASS_VERSION >= 56.0; }
+ public static boolean atLeastJava13() { return JAVA_CLASS_VERSION >= 57.0; }
+ public static boolean atLeastJava14() { return JAVA_CLASS_VERSION >= 58.0; }
+ public static boolean atLeastJava15() { return JAVA_CLASS_VERSION >= 59.0; }
+ public static boolean atLeastJava16() { return JAVA_CLASS_VERSION >= 60.0; }
+ public static boolean atLeastJava17() { return JAVA_CLASS_VERSION >= 61.0; }
/**
* Collects all JSR166 unit tests as one suite.
@@ -508,6 +517,7 @@ public class JSR166TestCase extends Test
ExecutorsTest.suite(),
ExecutorCompletionServiceTest.suite(),
FutureTaskTest.suite(),
+ HashtableTest.suite(),
LinkedBlockingDequeTest.suite(),
LinkedBlockingQueueTest.suite(),
LinkedListTest.suite(),
@@ -544,8 +554,10 @@ public class JSR166TestCase extends Test
"DoubleAdderTest",
"ForkJoinPool8Test",
"ForkJoinTask8Test",
+ "HashMapTest",
"LinkedBlockingDeque8Test",
"LinkedBlockingQueue8Test",
+ "LinkedHashMapTest",
"LongAccumulatorTest",
"LongAdderTest",
"SplittableRandomTest",
@@ -606,8 +618,8 @@ public class JSR166TestCase extends Test
for (String methodName : testMethodNames(testClass))
suite.addTest((Test) c.newInstance(data, methodName));
return suite;
- } catch (Exception e) {
- throw new Error(e);
+ } catch (ReflectiveOperationException e) {
+ throw new AssertionError(e);
}
}
@@ -623,14 +635,14 @@ public class JSR166TestCase extends Test
if (atLeastJava8()) {
String name = testClass.getName();
String name8 = name.replaceAll("Test$", "8Test");
- if (name.equals(name8)) throw new Error(name);
+ if (name.equals(name8)) throw new AssertionError(name);
try {
return (Test)
Class.forName(name8)
- .getMethod("testSuite", new Class[] { dataClass })
+ .getMethod("testSuite", dataClass)
.invoke(null, data);
- } catch (Exception e) {
- throw new Error(e);
+ } catch (ReflectiveOperationException e) {
+ throw new AssertionError(e);
}
} else {
return new TestSuite();
@@ -739,7 +751,7 @@ public class JSR166TestCase extends Test
String msg = toString() + ": " + String.format(format, args);
System.err.println(msg);
dumpTestThreads();
- throw new AssertionFailedError(msg);
+ throw new AssertionError(msg);
}
/**
@@ -760,12 +772,8 @@ public class JSR166TestCase extends Test
throw (RuntimeException) t;
else if (t instanceof Exception)
throw (Exception) t;
- else {
- AssertionFailedError afe =
- new AssertionFailedError(t.toString());
- afe.initCause(t);
- throw afe;
- }
+ else
+ throw new AssertionError(t.toString(), t);
}
if (Thread.interrupted())
@@ -799,83 +807,83 @@ public class JSR166TestCase extends Test
/**
* Just like fail(reason), but additionally recording (using
- * threadRecordFailure) any AssertionFailedError thrown, so that
- * the current testcase will fail.
+ * threadRecordFailure) any AssertionError thrown, so that the
+ * current testcase will fail.
*/
public void threadFail(String reason) {
try {
fail(reason);
- } catch (AssertionFailedError t) {
- threadRecordFailure(t);
- throw t;
+ } catch (AssertionError fail) {
+ threadRecordFailure(fail);
+ throw fail;
}
}
/**
* Just like assertTrue(b), but additionally recording (using
- * threadRecordFailure) any AssertionFailedError thrown, so that
- * the current testcase will fail.
+ * threadRecordFailure) any AssertionError thrown, so that the
+ * current testcase will fail.
*/
public void threadAssertTrue(boolean b) {
try {
assertTrue(b);
- } catch (AssertionFailedError t) {
- threadRecordFailure(t);
- throw t;
+ } catch (AssertionError fail) {
+ threadRecordFailure(fail);
+ throw fail;
}
}
/**
* Just like assertFalse(b), but additionally recording (using
- * threadRecordFailure) any AssertionFailedError thrown, so that
- * the current testcase will fail.
+ * threadRecordFailure) any AssertionError thrown, so that the
+ * current testcase will fail.
*/
public void threadAssertFalse(boolean b) {
try {
assertFalse(b);
- } catch (AssertionFailedError t) {
- threadRecordFailure(t);
- throw t;
+ } catch (AssertionError fail) {
+ threadRecordFailure(fail);
+ throw fail;
}
}
/**
* Just like assertNull(x), but additionally recording (using
- * threadRecordFailure) any AssertionFailedError thrown, so that
- * the current testcase will fail.
+ * threadRecordFailure) any AssertionError thrown, so that the
+ * current testcase will fail.
*/
public void threadAssertNull(Object x) {
try {
assertNull(x);
- } catch (AssertionFailedError t) {
- threadRecordFailure(t);
- throw t;
+ } catch (AssertionError fail) {
+ threadRecordFailure(fail);
+ throw fail;
}
}
/**
* Just like assertEquals(x, y), but additionally recording (using
- * threadRecordFailure) any AssertionFailedError thrown, so that
- * the current testcase will fail.
+ * threadRecordFailure) any AssertionError thrown, so that the
+ * current testcase will fail.
*/
public void threadAssertEquals(long x, long y) {
try {
assertEquals(x, y);
- } catch (AssertionFailedError t) {
- threadRecordFailure(t);
- throw t;
+ } catch (AssertionError fail) {
+ threadRecordFailure(fail);
+ throw fail;
}
}
/**
* Just like assertEquals(x, y), but additionally recording (using
- * threadRecordFailure) any AssertionFailedError thrown, so that
- * the current testcase will fail.
+ * threadRecordFailure) any AssertionError thrown, so that the
+ * current testcase will fail.
*/
public void threadAssertEquals(Object x, Object y) {
try {
assertEquals(x, y);
- } catch (AssertionFailedError fail) {
+ } catch (AssertionError fail) {
threadRecordFailure(fail);
throw fail;
} catch (Throwable fail) {
@@ -885,13 +893,13 @@ public class JSR166TestCase extends Test
/**
* Just like assertSame(x, y), but additionally recording (using
- * threadRecordFailure) any AssertionFailedError thrown, so that
- * the current testcase will fail.
+ * threadRecordFailure) any AssertionError thrown, so that the
+ * current testcase will fail.
*/
public void threadAssertSame(Object x, Object y) {
try {
assertSame(x, y);
- } catch (AssertionFailedError fail) {
+ } catch (AssertionError fail) {
threadRecordFailure(fail);
throw fail;
}
@@ -913,8 +921,8 @@ public class JSR166TestCase extends Test
/**
* Records the given exception using {@link #threadRecordFailure},
- * then rethrows the exception, wrapping it in an
- * AssertionFailedError if necessary.
+ * then rethrows the exception, wrapping it in an AssertionError
+ * if necessary.
*/
public void threadUnexpectedException(Throwable t) {
threadRecordFailure(t);
@@ -923,12 +931,8 @@ public class JSR166TestCase extends Test
throw (RuntimeException) t;
else if (t instanceof Error)
throw (Error) t;
- else {
- AssertionFailedError afe =
- new AssertionFailedError("unexpected exception: " + t);
- afe.initCause(t);
- throw afe;
- }
+ else
+ throw new AssertionError("unexpected exception: " + t, t);
}
/**
@@ -1104,7 +1108,7 @@ public class JSR166TestCase extends Test
for (long retries = LONG_DELAY_MS * 3 / 4; retries-->0; ) {
try { delay(1); }
catch (InterruptedException fail) {
- fail("Unexpected InterruptedException");
+ throw new AssertionError("Unexpected InterruptedException", fail);
}
Thread.State s = thread.getState();
if (s == expected)
@@ -1290,38 +1294,46 @@ public class JSR166TestCase extends Test
/**
* Sleeps until the given time has elapsed.
- * Throws AssertionFailedError if interrupted.
+ * Throws AssertionError if interrupted.
*/
static void sleep(long millis) {
try {
delay(millis);
} catch (InterruptedException fail) {
- AssertionFailedError afe =
- new AssertionFailedError("Unexpected InterruptedException");
- afe.initCause(fail);
- throw afe;
+ throw new AssertionError("Unexpected InterruptedException", fail);
}
}
/**
* Spin-waits up to the specified number of milliseconds for the given
* thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
+ * @param waitingForGodot if non-null, an additional condition to satisfy
*/
- void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
- long startTime = 0L;
- for (;;) {
- Thread.State s = thread.getState();
- if (s == Thread.State.BLOCKED ||
- s == Thread.State.WAITING ||
- s == Thread.State.TIMED_WAITING)
- return;
- else if (s == Thread.State.TERMINATED)
+ void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis,
+ Callable waitingForGodot) {
+ for (long startTime = 0L;;) {
+ switch (thread.getState()) {
+ default: break;
+ case BLOCKED: case WAITING: case TIMED_WAITING:
+ try {
+ if (waitingForGodot == null || waitingForGodot.call())
+ return;
+ } catch (Throwable fail) { threadUnexpectedException(fail); }
+ break;
+ case TERMINATED:
fail("Unexpected thread termination");
- else if (startTime == 0L)
+ }
+
+ if (startTime == 0L)
startTime = System.nanoTime();
else if (millisElapsedSince(startTime) > timeoutMillis) {
- threadAssertTrue(thread.isAlive());
- fail("timed out waiting for thread to enter wait state");
+ assertTrue(thread.isAlive());
+ if (waitingForGodot == null
+ || thread.getState() == Thread.State.RUNNABLE)
+ fail("timed out waiting for thread to enter wait state");
+ else
+ fail("timed out waiting for condition, thread state="
+ + thread.getState());
}
Thread.yield();
}
@@ -1329,32 +1341,10 @@ public class JSR166TestCase extends Test
/**
* Spin-waits up to the specified number of milliseconds for the given
- * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING,
- * and additionally satisfy the given condition.
+ * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
*/
- void waitForThreadToEnterWaitState(
- Thread thread, long timeoutMillis, Callable waitingForGodot) {
- long startTime = 0L;
- for (;;) {
- Thread.State s = thread.getState();
- if (s == Thread.State.BLOCKED ||
- s == Thread.State.WAITING ||
- s == Thread.State.TIMED_WAITING) {
- try {
- if (waitingForGodot.call())
- return;
- } catch (Throwable fail) { threadUnexpectedException(fail); }
- }
- else if (s == Thread.State.TERMINATED)
- fail("Unexpected thread termination");
- else if (startTime == 0L)
- startTime = System.nanoTime();
- else if (millisElapsedSince(startTime) > timeoutMillis) {
- threadAssertTrue(thread.isAlive());
- fail("timed out waiting for thread to enter wait state");
- }
- Thread.yield();
- }
+ void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
+ waitForThreadToEnterWaitState(thread, timeoutMillis, null);
}
/**
@@ -1362,7 +1352,7 @@ public class JSR166TestCase extends Test
* enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
*/
void waitForThreadToEnterWaitState(Thread thread) {
- waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
+ waitForThreadToEnterWaitState(thread, LONG_DELAY_MS, null);
}
/**
@@ -1370,8 +1360,8 @@ public class JSR166TestCase extends Test
* enter a wait state: BLOCKED, WAITING, or TIMED_WAITING,
* and additionally satisfy the given condition.
*/
- void waitForThreadToEnterWaitState(
- Thread thread, Callable waitingForGodot) {
+ void waitForThreadToEnterWaitState(Thread thread,
+ Callable waitingForGodot) {
waitForThreadToEnterWaitState(thread, LONG_DELAY_MS, waitingForGodot);
}
@@ -1390,7 +1380,7 @@ public class JSR166TestCase extends Test
// r.run();
// } catch (Throwable fail) { threadUnexpectedException(fail); }
// if (millisElapsedSince(startTime) > timeoutMillis/2)
-// throw new AssertionFailedError("did not return promptly");
+// throw new AssertionError("did not return promptly");
// }
// void assertTerminatesPromptly(Runnable r) {
@@ -1403,11 +1393,13 @@ public class JSR166TestCase extends Test
*/
void checkTimedGet(Future f, T expectedValue, long timeoutMillis) {
long startTime = System.nanoTime();
+ T actual = null;
try {
- assertEquals(expectedValue, f.get(timeoutMillis, MILLISECONDS));
+ actual = f.get(timeoutMillis, MILLISECONDS);
} catch (Throwable fail) { threadUnexpectedException(fail); }
+ assertEquals(expectedValue, actual);
if (millisElapsedSince(startTime) > timeoutMillis/2)
- throw new AssertionFailedError("timed get did not return promptly");
+ throw new AssertionError("timed get did not return promptly");
}
void checkTimedGet(Future f, T expectedValue) {
@@ -1465,26 +1457,6 @@ public class JSR166TestCase extends Test
}
}
- public abstract class RunnableShouldThrow implements Runnable {
- protected abstract void realRun() throws Throwable;
-
- final Class> exceptionClass;
-
- RunnableShouldThrow(Class exceptionClass) {
- this.exceptionClass = exceptionClass;
- }
-
- public final void run() {
- try {
- realRun();
- threadShouldThrow(exceptionClass.getSimpleName());
- } catch (Throwable t) {
- if (! exceptionClass.isInstance(t))
- threadUnexpectedException(t);
- }
- }
- }
-
public abstract class ThreadShouldThrow extends Thread {
protected abstract void realRun() throws Throwable;
@@ -1497,11 +1469,12 @@ public class JSR166TestCase extends Test
public final void run() {
try {
realRun();
- threadShouldThrow(exceptionClass.getSimpleName());
} catch (Throwable t) {
if (! exceptionClass.isInstance(t))
threadUnexpectedException(t);
+ return;
}
+ threadShouldThrow(exceptionClass.getSimpleName());
}
}
@@ -1511,12 +1484,13 @@ public class JSR166TestCase extends Test
public final void run() {
try {
realRun();
- threadShouldThrow("InterruptedException");
} catch (InterruptedException success) {
threadAssertFalse(Thread.interrupted());
+ return;
} catch (Throwable fail) {
threadUnexpectedException(fail);
}
+ threadShouldThrow("InterruptedException");
}
}
@@ -1528,26 +1502,8 @@ public class JSR166TestCase extends Test
return realCall();
} catch (Throwable fail) {
threadUnexpectedException(fail);
- return null;
}
- }
- }
-
- public abstract class CheckedInterruptedCallable
- implements Callable {
- protected abstract T realCall() throws Throwable;
-
- public final T call() {
- try {
- T result = realCall();
- threadShouldThrow("InterruptedException");
- return result;
- } catch (InterruptedException success) {
- threadAssertFalse(Thread.interrupted());
- } catch (Throwable fail) {
- threadUnexpectedException(fail);
- }
- return null;
+ throw new AssertionError("unreached");
}
}
@@ -1604,13 +1560,15 @@ public class JSR166TestCase extends Test
}
public void await(CountDownLatch latch, long timeoutMillis) {
+ boolean timedOut = false;
try {
- if (!latch.await(timeoutMillis, MILLISECONDS))
- fail("timed out waiting for CountDownLatch for "
- + (timeoutMillis/1000) + " sec");
+ timedOut = !latch.await(timeoutMillis, MILLISECONDS);
} catch (Throwable fail) {
threadUnexpectedException(fail);
}
+ if (timedOut)
+ fail("timed out waiting for CountDownLatch for "
+ + (timeoutMillis/1000) + " sec");
}
public void await(CountDownLatch latch) {
@@ -1618,13 +1576,15 @@ public class JSR166TestCase extends Test
}
public void await(Semaphore semaphore) {
+ boolean timedOut = false;
try {
- if (!semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS))
- fail("timed out waiting for Semaphore for "
- + (LONG_DELAY_MS/1000) + " sec");
+ timedOut = !semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS);
} catch (Throwable fail) {
threadUnexpectedException(fail);
}
+ if (timedOut)
+ fail("timed out waiting for Semaphore for "
+ + (LONG_DELAY_MS/1000) + " sec");
}
public void await(CyclicBarrier barrier) {
@@ -1649,7 +1609,7 @@ public class JSR166TestCase extends Test
// long startTime = System.nanoTime();
// while (!flag.get()) {
// if (millisElapsedSince(startTime) > timeoutMillis)
-// throw new AssertionFailedError("timed out");
+// throw new AssertionError("timed out");
// Thread.yield();
// }
// }
@@ -1658,14 +1618,6 @@ public class JSR166TestCase extends Test
public String call() { throw new NullPointerException(); }
}
- public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
- protected void realRun() {
- try {
- delay(SMALL_DELAY_MS);
- } catch (InterruptedException ok) {}
- }
- }
-
public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
return new CheckedRunnable() {
protected void realRun() {
@@ -1721,8 +1673,8 @@ public class JSR166TestCase extends Test
return realCompute();
} catch (Throwable fail) {
threadUnexpectedException(fail);
- return null;
}
+ throw new AssertionError("unreached");
}
}
@@ -1736,7 +1688,7 @@ public class JSR166TestCase extends Test
/**
* A CyclicBarrier that uses timed await and fails with
- * AssertionFailedErrors instead of throwing checked exceptions.
+ * AssertionErrors instead of throwing checked exceptions.
*/
public static class CheckedBarrier extends CyclicBarrier {
public CheckedBarrier(int parties) { super(parties); }
@@ -1745,12 +1697,9 @@ public class JSR166TestCase extends Test
try {
return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
} catch (TimeoutException timedOut) {
- throw new AssertionFailedError("timed out");
+ throw new AssertionError("timed out");
} catch (Exception fail) {
- AssertionFailedError afe =
- new AssertionFailedError("Unexpected exception: " + fail);
- afe.initCause(fail);
- throw afe;
+ throw new AssertionError("Unexpected exception: " + fail, fail);
}
}
}
@@ -1802,28 +1751,27 @@ public class JSR166TestCase extends Test
}
}
- void assertImmutable(final Object o) {
+ void assertImmutable(Object o) {
if (o instanceof Collection) {
assertThrows(
UnsupportedOperationException.class,
- new Runnable() { public void run() {
- ((Collection) o).add(null);}});
+ () -> ((Collection) o).add(null));
}
}
@SuppressWarnings("unchecked")
T serialClone(T o) {
+ T clone = null;
try {
ObjectInputStream ois = new ObjectInputStream
(new ByteArrayInputStream(serialBytes(o)));
- T clone = (T) ois.readObject();
- if (o == clone) assertImmutable(o);
- assertSame(o.getClass(), clone.getClass());
- return clone;
+ clone = (T) ois.readObject();
} catch (Throwable fail) {
threadUnexpectedException(fail);
- return null;
}
+ if (o == clone) assertImmutable(o);
+ else assertSame(o.getClass(), clone.getClass());
+ return clone;
}
/**
@@ -1842,7 +1790,7 @@ public class JSR166TestCase extends Test
(new ByteArrayInputStream(bos.toByteArray()));
T clone = (T) ois.readObject();
if (o == clone) assertImmutable(o);
- assertSame(o.getClass(), clone.getClass());
+ else assertSame(o.getClass(), clone.getClass());
return clone;
}
@@ -1867,20 +1815,17 @@ public class JSR166TestCase extends Test
}
public void assertThrows(Class extends Throwable> expectedExceptionClass,
- Runnable... throwingActions) {
- for (Runnable throwingAction : throwingActions) {
+ Action... throwingActions) {
+ for (Action throwingAction : throwingActions) {
boolean threw = false;
try { throwingAction.run(); }
catch (Throwable t) {
threw = true;
- if (!expectedExceptionClass.isInstance(t)) {
- AssertionFailedError afe =
- new AssertionFailedError
- ("Expected " + expectedExceptionClass.getName() +
- ", got " + t.getClass().getName());
- afe.initCause(t);
- threadUnexpectedException(afe);
- }
+ if (!expectedExceptionClass.isInstance(t))
+ throw new AssertionError(
+ "Expected " + expectedExceptionClass.getName() +
+ ", got " + t.getClass().getName(),
+ t);
}
if (!threw)
shouldThrow(expectedExceptionClass.getName());
@@ -1913,6 +1858,18 @@ public class JSR166TestCase extends Test
Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
}
+ /**
+ * Returns the same String as would be returned by {@link
+ * Object#toString}, whether or not the given object's class
+ * overrides toString().
+ *
+ * @see System#identityHashCode
+ */
+ static String identityString(Object x) {
+ return x.getClass().getName()
+ + "@" + Integer.toHexString(System.identityHashCode(x));
+ }
+
// --- Shared assertions for Executor tests ---
/**
@@ -2084,4 +2041,42 @@ public class JSR166TestCase extends Test
assertEquals(savedCompletedTaskCount, p.getCompletedTaskCount());
assertEquals(savedQueueSize, p.getQueue().size());
}
+
+ void assertCollectionsEquals(Collection> x, Collection> y) {
+ assertEquals(x, y);
+ assertEquals(y, x);
+ assertEquals(x.isEmpty(), y.isEmpty());
+ assertEquals(x.size(), y.size());
+ if (x instanceof List) {
+ assertEquals(x.toString(), y.toString());
+ }
+ if (x instanceof List || x instanceof Set) {
+ assertEquals(x.hashCode(), y.hashCode());
+ }
+ if (x instanceof List || x instanceof Deque) {
+ assertTrue(Arrays.equals(x.toArray(), y.toArray()));
+ assertTrue(Arrays.equals(x.toArray(new Object[0]),
+ y.toArray(new Object[0])));
+ }
+ }
+
+ /**
+ * A weaker form of assertCollectionsEquals which does not insist
+ * that the two collections satisfy Object#equals(Object), since
+ * they may use identity semantics as Deques do.
+ */
+ void assertCollectionsEquivalent(Collection> x, Collection> y) {
+ if (x instanceof List || x instanceof Set)
+ assertCollectionsEquals(x, y);
+ else {
+ assertEquals(x.isEmpty(), y.isEmpty());
+ assertEquals(x.size(), y.size());
+ assertEquals(new HashSet(x), new HashSet(y));
+ if (x instanceof Deque) {
+ assertTrue(Arrays.equals(x.toArray(), y.toArray()));
+ assertTrue(Arrays.equals(x.toArray(new Object[0]),
+ y.toArray(new Object[0])));
+ }
+ }
+ }
}