11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License. 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License. 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.eventbus; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.lang.reflect.InvocationTargetException; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.lang.reflect.Method; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Test case for {@link EventHandler}. 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Cliff Biffle 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class EventHandlerTest extends TestCase { 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Object FIXTURE_ARGUMENT = new Object(); 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private boolean methodCalled; 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private Object methodArgument; 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected void setUp() throws Exception { 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super.setUp(); 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert methodCalled = false; 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert methodArgument = null; 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Checks that a no-frills, no-issues method call is properly executed. 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws Exception if the aforementioned proper execution is not to be had. 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBasicMethodCall() throws Exception { 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Method method = getRecordingMethod(); 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EventHandler handler = new EventHandler(this, method); 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert handler.handleEvent(FIXTURE_ARGUMENT); 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue("Handler must call provided method.", methodCalled); 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue("Handler argument must be *exactly* the provided object.", 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert methodArgument == FIXTURE_ARGUMENT); 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Checks that EventHandler's constructor disallows null methods. 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRejectionOfNullMethods() { 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new EventHandler(this, null); 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("EventHandler must immediately reject null methods."); 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Hooray! 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Checks that EventHandler's constructor disallows null targets. 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRejectionOfNullTargets() { 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Method method = getRecordingMethod(); 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new EventHandler(null, method); 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("EventHandler must immediately reject null targets."); 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Huzzah! 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testExceptionWrapping() { 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Method method = getExceptionThrowingMethod(); 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EventHandler handler = new EventHandler(this, method); 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert handler.handleEvent(new Object()); 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Handlers whose methods throw must throw InvocationTargetException"); 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (InvocationTargetException e) { 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue("Expected exception must be wrapped.", 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert e.getCause() instanceof IntentionalException); 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testErrorPassthrough() throws InvocationTargetException { 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Method method = getErrorThrowingMethod(); 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EventHandler handler = new EventHandler(this, method); 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert handler.handleEvent(new Object()); 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Handlers whose methods throw Errors must rethrow them"); 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (JudgmentError e) { 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Gets a reference to {@link #recordingMethod(Object)}. 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a Method wrapping {@link #recordingMethod(Object)}. 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IllegalStateException if executed in a context where reflection is 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * unavailable. 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws AssertionError if something odd has happened to 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #recordingMethod(Object)}. 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private Method getRecordingMethod() { 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Method method; 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert method = getClass().getMethod("recordingMethod", Object.class); 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (SecurityException e) { 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new IllegalStateException("This test needs access to reflection."); 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NoSuchMethodException e) { 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new AssertionError( 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "Someone changed EventHandlerTest#recordingMethod's visibility, " + 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "signature, or removed it entirely. (Must be public.)"); 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return method; 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Gets a reference to {@link #exceptionThrowingMethod(Object)}. 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a Method wrapping {@link #exceptionThrowingMethod(Object)}. 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IllegalStateException if executed in a context where reflection is 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * unavailable. 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws AssertionError if something odd has happened to 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #exceptionThrowingMethod(Object)}. 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private Method getExceptionThrowingMethod() { 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Method method; 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert method = getClass().getMethod("exceptionThrowingMethod", Object.class); 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (SecurityException e) { 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new IllegalStateException("This test needs access to reflection."); 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NoSuchMethodException e) { 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new AssertionError( 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "Someone changed EventHandlerTest#exceptionThrowingMethod's " + 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "visibility, signature, or removed it entirely. (Must be public.)"); 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return method; 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Gets a reference to {@link #errorThrowingMethod(Object)}. 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a Method wrapping {@link #errorThrowingMethod(Object)}. 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IllegalStateException if executed in a context where reflection is 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * unavailable. 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws AssertionError if something odd has happened to 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #errorThrowingMethod(Object)}. 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private Method getErrorThrowingMethod() { 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Method method; 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert method = getClass().getMethod("errorThrowingMethod", Object.class); 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (SecurityException e) { 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new IllegalStateException("This test needs access to reflection."); 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NoSuchMethodException e) { 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new AssertionError( 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "Someone changed EventHandlerTest#errorThrowingMethod's " + 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "visibility, signature, or removed it entirely. (Must be public.)"); 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return method; 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Records the provided object in {@link #methodArgument} and sets 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #methodCalled}. This method is called reflectively by EventHandler 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * during tests, and must remain public. 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param arg argument to record. 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void recordingMethod(Object arg) { 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (methodCalled == true) { 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new IllegalStateException("Method called more than once."); 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert methodCalled = true; 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert methodArgument = arg; 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void exceptionThrowingMethod(Object arg) throws Exception { 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new IntentionalException(); 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** Local exception subclass to check variety of exception thrown. */ 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert class IntentionalException extends Exception { 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = -2500191180248181379L; 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void errorThrowingMethod(Object arg) { 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new JudgmentError(); 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** Local Error subclass to check variety of error thrown. */ 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert class JudgmentError extends Error { 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 634248373797713373L; 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 209