From 505b147bd23e26d21932af2c3336c9f4607bbcce Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Wed, 7 May 2014 21:09:20 -0400 Subject: core: Make DelayedError complain if cancel() is called too late. --- .../com/tavianator/sangria/core/DelayedError.java | 9 +++++-- .../tavianator/sangria/core/DelayedErrorTest.java | 29 +++++++++++++++++++++- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/sangria-core/src/main/java/com/tavianator/sangria/core/DelayedError.java b/sangria-core/src/main/java/com/tavianator/sangria/core/DelayedError.java index d6f86a8..2aeabca 100644 --- a/sangria-core/src/main/java/com/tavianator/sangria/core/DelayedError.java +++ b/sangria-core/src/main/java/com/tavianator/sangria/core/DelayedError.java @@ -25,6 +25,8 @@ import com.google.inject.CreationException; import com.google.inject.Injector; import com.google.inject.spi.Message; +import static com.google.common.base.Preconditions.*; + /** * Similar to {@link Binder#addError(String, Object...)}, but can be canceled later. Useful for enforcing correct usage * of fluent APIs. @@ -35,6 +37,7 @@ import com.google.inject.spi.Message; */ public class DelayedError { private Throwable error; + private boolean reported = false; /** * Create a {@link DelayedError}. @@ -85,11 +88,13 @@ public class DelayedError { * Cancel this error. */ public void cancel() { - this.error = null; + checkState(!reported, "This error has already been reported"); + error = null; } @Inject - void inject(Injector injector) throws Throwable { + void reportErrors(Injector injector) throws Throwable { + reported = true; if (error != null) { throw error; } diff --git a/sangria-core/src/test/java/com/tavianator/sangria/core/DelayedErrorTest.java b/sangria-core/src/test/java/com/tavianator/sangria/core/DelayedErrorTest.java index 349dced..f27aea8 100644 --- a/sangria-core/src/test/java/com/tavianator/sangria/core/DelayedErrorTest.java +++ b/sangria-core/src/test/java/com/tavianator/sangria/core/DelayedErrorTest.java @@ -32,7 +32,7 @@ import static org.hamcrest.Matchers.*; * Tests for {@link DelayedError}. * * @author Tavian Barnes (tavianator@tavianator.com) - * @version 1.0 + * @version 1.1 * @since 1.0 */ public class DelayedErrorTest { @@ -83,4 +83,31 @@ public class DelayedErrorTest { } }); } + + @Test + public void testCancel() { + Guice.createInjector(new AbstractModule() { + @Override + protected void configure() { + DelayedError error = DelayedError.create(binder(), "Message"); + error.cancel(); + } + }); + } + + @Test + public void testLateCancel() { + final DelayedError[] errorHolder = new DelayedError[1]; + + Guice.createInjector(new AbstractModule() { + @Override + protected void configure() { + errorHolder[0] = DelayedError.create(binder(), "Message"); + errorHolder[0].cancel(); + } + }); + + thrown.expect(IllegalStateException.class); + errorHolder[0].cancel(); + } } -- cgit v1.2.3