/******************************************************************************* * Copyright 2015 Analog Devices, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ********************************************************************************/ package com.analog.lyric.util.test.tests; import static com.analog.lyric.util.test.ExceptionTester.*; import static org.junit.Assert.*; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.lang.reflect.Constructor; import java.util.regex.Pattern; import org.junit.Test; import com.analog.lyric.util.test.ExceptionTester; /** * Tests of {@link ExceptionTester} class * <p> * @since 0.08 * @author Christopher Barber */ public class TestExceptionTester { @Test public void test() { // Catch stack dump spew here ByteArrayOutputStream bos = new ByteArrayOutputStream(); ExceptionTester.stderr = new PrintStream(bos); // no exception boolean caught = false; try { expectThrow(Exception.class, new ExceptionTester.Case() { @Override public void run() throws Throwable { } }); } catch (AssertionError err) { caught = true; assertEquals("Expected 'Exception' but no exception thrown", err.getMessage()); } if (!caught) { fail("Expected AssertionError"); } assertEquals(0, bos.size()); // wrong exception caught = false; try { expectThrow(IllegalArgumentException.class, new ExceptionTester.Case() { @Override public void run() throws Throwable { throw new Error(); } }); } catch (AssertionError err) { caught = true; assertEquals("Expected 'IllegalArgumentException' but caught 'Error'", err.getMessage()); } if (!caught) { fail("Expected AssertionError"); } assertTrue(Pattern.matches("(?s)java\\.lang\\.Error\\s+at com\\.analog\\.lyric.*", bos.toString())); bos.reset(); // wrong message caught = false; try { expectThrow(IllegalArgumentException.class, "barf", new ExceptionTester.Case() { @Override public void run() throws Throwable { throw new IllegalArgumentException("gag"); } }); } catch (AssertionError err) { caught = true; assertEquals("Expected message matching 'barf' but got 'gag'", err.getMessage()); } if (!caught) { fail("Expected AssertionError"); } assertEquals(0, bos.size()); // ok expectThrow(IllegalArgumentException.class, new ExceptionTester.Case() { @Override public void run() throws Throwable { throw new IllegalArgumentException("barf"); } }); expectThrow(IllegalArgumentException.class, "barf", new ExceptionTester.Case() { @Override public void run() throws Throwable { throw new IllegalArgumentException("barf"); } }); assertEquals(0, bos.size()); // // Reflection cases // expectThrow(IllegalArgumentException.class, getClass(), "throwSomething", IllegalArgumentException.class, "gag"); expectThrow(RuntimeException.class, this, "throwSomething2", IllegalArgumentException.class, "gag"); bos.reset(); caught = false; try { expectThrow(IllegalArgumentException.class, getClass(), "throwSomething", Error.class, "gag"); } catch (AssertionError err) { caught = true; assertEquals("Expected 'IllegalArgumentException' but caught 'Error'", err.getMessage()); } if (!caught) { fail("Expected AssertionError"); } assertTrue(Pattern.matches("(?s)java\\.lang\\.Error: gag\\s+at.*", bos.toString())); bos.reset(); caught = false; try { expectThrow(IllegalArgumentException.class, this, "noSuchMethod"); } catch (AssertionError err) { caught = true; } if (!caught) { fail("Expected AssertionError"); } } /** * Test function that throws an exception of specified class and message * @since 0.08 */ public static void throwSomething(Class<? extends Throwable> exType, String msgFormat, Object ... msgArgs) throws Throwable { Constructor<? extends Throwable> constructor = exType.getConstructor(String.class); Throwable ex = constructor.newInstance(String.format(msgFormat, msgArgs)); throw ex; } public void throwSomething2(Class<? extends Throwable> exType, String msgFormat, Object ... msgArgs) throws Throwable { Constructor<? extends Throwable> constructor = exType.getConstructor(String.class); Throwable ex = constructor.newInstance(String.format(msgFormat, msgArgs)); throw ex; } }