// Path: testing/src/main/java/hm/binkley/junit/SuppressedExceptionMatcher.java
// public static SuppressedExceptionMatcher hasSuppressed(
//         final List<Matcher<? super Throwable>> matchers) {
//     return new SuppressedExceptionMatcher(matchers);
// }
// 
// Path: util/src/main/java/hm/binkley/util/Notices.java
// @Nonnull
// public static Notices<RuntimeException> notices() {
//     return noticesAs(RuntimeException::new);
// }


import org.junit.rules.ExpectedException;
import static hm.binkley.junit.SuppressedExceptionMatcher.hasSuppressed;
import static hm.binkley.util.Notices.notices;
import static java.lang.Thread.currentThread;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.internal.matchers.ThrowableMessageMatcher.hasMessage;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
    @Test
    public void shouldComputeWhenEmpty() {
        assertThat(notices().returnOrFail(() -> 3), is(equalTo(3)));
    }

    @Test
    public void shouldRecordPlainTextNotices() {
        final Notices<RuntimeException> notices = notices();
        notices.add("Hi, mom!");

        assertThat(notices.size(), is(1));
    }

    @Test
    public void shouldRecordExceptionNotices() {
        final Notices<RuntimeException> notices = notices();
        notices.add(new Foobar());

        assertThat(notices.size(), is(1));
    }

    @Test
    public void shouldThrowPlainTextNotices() {
        final Notices<RuntimeException> notices = notices();
        notices.add("Hi, mom!");

        thrown.expect(RuntimeException.class);
        thrown.expectMessage(allOf(containsString("1 notice(s)"),
                containsString("Hi, mom!")));
        thrown.expect(hasSuppressed(instanceOf(RuntimeException.class)));
// Path: testing/src/main/java/hm/binkley/junit/SuppressedExceptionMatcher.java
// public static SuppressedExceptionMatcher hasSuppressed(
//         final List<Matcher<? super Throwable>> matchers) {
//     return new SuppressedExceptionMatcher(matchers);
// }
// 
// Path: util/src/main/java/hm/binkley/util/Notices.java
// @Nonnull
// public static Notices<RuntimeException> notices() {
//     return noticesAs(RuntimeException::new);
// }


// Path: util/src/test/java/hm/binkley/util/NoticesTest.java
import org.junit.rules.ExpectedException;
import static hm.binkley.junit.SuppressedExceptionMatcher.hasSuppressed;
import static hm.binkley.util.Notices.notices;
import static java.lang.Thread.currentThread;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.internal.matchers.ThrowableMessageMatcher.hasMessage;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;

    @Test
    public void shouldComputeWhenEmpty() {
        assertThat(notices().returnOrFail(() -> 3), is(equalTo(3)));
    }

    @Test
    public void shouldRecordPlainTextNotices() {
        final Notices<RuntimeException> notices = notices();
        notices.add("Hi, mom!");

        assertThat(notices.size(), is(1));
    }

    @Test
    public void shouldRecordExceptionNotices() {
        final Notices<RuntimeException> notices = notices();
        notices.add(new Foobar());

        assertThat(notices.size(), is(1));
    }

    @Test
    public void shouldThrowPlainTextNotices() {
        final Notices<RuntimeException> notices = notices();
        notices.add("Hi, mom!");

        thrown.expect(RuntimeException.class);
        thrown.expectMessage(allOf(containsString("1 notice(s)"),
                containsString("Hi, mom!")));
        thrown.expect(hasSuppressed(instanceOf(RuntimeException.class)));
        thrown.expect(hasSuppressed(