/* * Copyright 2005-2010 the original author or authors. * * 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 org.wamblee.test; import java.util.Arrays; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import java.util.logging.Logger; import junit.framework.TestCase; /** * Useful assertions for use in test cases. * * @author Erik Brakkee */ public final class AssertionUtils { private static final Logger LOG = Logger.getLogger(AssertionUtils.class .getName()); /** * Disabled constructor. * */ private AssertionUtils() { // Empty } /** * Asserts that two object arrays are equal. * * @param aExpected * Expected object array. * @param aActual * Actual object array. */ public static void assertEquals(T[] aExpected, T[] aActual) { assertEquals("", aExpected, aActual); } /** * Asserts that two object arrays are equal. * * @param aMsg * Message. * @param aExpected * Expected array. * @param aActual * Actual array. */ public static void assertEquals(String aMsg, T[] aExpected, T[] aActual) { TestCase.assertEquals(aMsg + " expected " + Arrays.asList(aExpected) + ", actual " + Arrays.asList(aActual) + ": Array lengths ", aExpected.length, aActual.length); for (int i = 0; i < aExpected.length; i++) { TestCase.assertEquals(aMsg + ": Element " + i, aExpected[i], aActual[i]); } } /** * Asserts that two objects are equal, and in case the object is an Object[] * delegates to {@link #assertEquals(String, Object[], Object[])}. * * @param aMsg * Message. * @param aExpected * Expected result. * @param aActual * Actual result. */ public static void assertEquals(String aMsg, T aExpected, T aActual) { if (aExpected instanceof Object[]) { AssertionUtils.assertEquals(aMsg, (Object[]) aExpected, (Object[]) aActual); return; } TestCase.assertEquals(aMsg, aExpected, aActual); } /** * Asserts that two maps are equal by comparing all keys and by checking * that the values for the same keys are the same. * * @param aMsg * Message. * @param aExpectedMap * Expected result. * @param aActual * Actual result. */ public static void assertEquals(String aMsg, Map aExpectedMap, Map aActual) { TestCase.assertEquals("Map sizes differ", aExpectedMap.size(), aActual .size()); Set> expectedEntries = aExpectedMap.entrySet(); for (Entry entry : expectedEntries) { Key key = entry.getKey(); TestCase.assertTrue("Map does not containg entry for key:" + key, aActual.containsKey(key)); AssertionUtils.assertEquals("Value of key " + key + " of map", entry.getValue(), aActual.get(key)); } } /** * Asserts that an exception occurs. * * @param aObject Erroneious code. * Test cases should create a subclass of this which contains the * code that should throw an exception. * @param aType * Type of exception that is expected. */ public static void assertException(ErroneousCode aObject, Class aType) { try { aObject.run(); throw new RuntimeException("No exception occurred"); } catch (Throwable t) { if (aType.isInstance(t)) { LOG.info("Expected exception occured " + t.getMessage()); return; // ok } throw new RuntimeException(t); } } public static interface ErroneousCode { void run() throws Exception; } }