/* * Copyright 2013, The Sporting Exchange Limited * * 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.betfair.testing.utils.cougar.assertions; import com.betfair.testing.utils.cougar.misc.AggregatedStepExpectedOutputMetaData; import com.betfair.testing.utils.cougar.misc.DataTypeEnum; import com.betfair.testing.utils.cougar.misc.NameValuePair; import java.util.List; public class JavaBeanArrayAssertion implements IAssertion { @Override public Object[] preProcess(Object actualObject, AggregatedStepExpectedOutputMetaData expectedObjectMetaData) throws AssertionError { String arrayObjectClassName = actualObject.getClass().getName().toString().replace("[L", ""); arrayObjectClassName = arrayObjectClassName.replace(";", ""); Class arrayObjectClass; try { arrayObjectClass = Class.forName(arrayObjectClassName); } catch (ClassNotFoundException e) { throw new AssertionError(e); } //If we can create an expected JavaBean instance //if not return null Object arrayClassObjectInstance; try { arrayClassObjectInstance = arrayObjectClass.newInstance(); } catch (InstantiationException e) { return null; } catch (IllegalAccessException e) { return null; } catch (NullPointerException e) { return null; } if (expectedObjectMetaData == null) { return null; } if (expectedObjectMetaData.size() == 0) { return new Object[0]; } Object[] expectedResultsArray = new Object[expectedObjectMetaData.size()]; for (int i = 0; i < expectedObjectMetaData.size(); i++) { List<NameValuePair> nvPairs = expectedObjectMetaData.getMetaDataAtIndex(i).getNameValuePairs(); if ((nvPairs.size() == 1) && (nvPairs.get(0).getValue().getClass() == arrayObjectClass)) { expectedResultsArray[i] = nvPairs.get(0).getValue(); } else { AggregatedStepExpectedOutputMetaData javaBeanMetaData = new AggregatedStepExpectedOutputMetaData(); javaBeanMetaData.addMetaData(expectedObjectMetaData.getMetaDataAtIndex(i)); IAssertion javaBeanAssertion = AssertionProcessorFactory.getAssertionProcessor(DataTypeEnum.BEAN); expectedResultsArray[i] = javaBeanAssertion.preProcess(arrayClassObjectInstance, javaBeanMetaData); } } return expectedResultsArray; } public void execute(String message, Object expectedObject, Object actualObject, AggregatedStepExpectedOutputMetaData expectedMetaData) throws AssertionError { if (expectedMetaData == null) { nullMetaDataAssert(message, expectedObject, actualObject); } else { metaDataAssert(message, expectedObject, actualObject, expectedMetaData); } } private void nullMetaDataAssert(String message, Object expectedObject, Object actualObject) throws AssertionError { if (actualObject == null) { if (expectedObject != null) { AssertionUtils.actionFail("Actual object is null, a non null object is expected"); return; } } if (expectedObject == null) { if (actualObject != null) { AssertionUtils.actionFail("Actual object is not null, a null object is expected"); return; } } Object[] actualArrayObject; try { actualArrayObject = (Object[])actualObject;} catch (ClassCastException e) { throw new AssertionError("Unable to cast actual object into an Array"); } Object[] expArrayObject; try { expArrayObject = (Object[])expectedObject;} catch (ClassCastException e) { throw new AssertionError("Unable to cast expected object into an Array"); } AssertionUtils.jettAssertEquals("Array length check: ", expArrayObject.length, actualArrayObject.length); for (int i = 0; i < expArrayObject.length; i++) { if (actualArrayObject.length < i) { AssertionUtils.actionFail("Row " + i + " missing from actual array"); } else { AssertionUtils.actionPass("Row " + i + " present in array, checking values"); Object actualJavaBeanObject = actualArrayObject[i]; Object expJavaBeanObject = expArrayObject[i]; IAssertion javaBeanAssertion = AssertionProcessorFactory.getAssertionProcessor(DataTypeEnum.BEAN); javaBeanAssertion.execute(message, expJavaBeanObject, actualJavaBeanObject, null); } } } private void metaDataAssert(String message, Object expectedObject, Object actualObject, AggregatedStepExpectedOutputMetaData expectedMetaData) throws AssertionError { Object[] actualArrayObject; try { actualArrayObject = (Object[])actualObject;} catch (ClassCastException e) { throw new AssertionError("Unable to cast actual object into an Array"); } if ((actualObject == null) && (expectedMetaData.getValues().size() != 0)) { AssertionUtils.actionFail("Actual object array was Null"); } AssertionUtils.jettAssertEquals("Array length check: ", expectedMetaData.getValues().size(), actualArrayObject.length); for (int i = 0; i < expectedMetaData.getValues().size(); i++) { if (actualArrayObject.length < i) { AssertionUtils.actionFail("Row " + i + " missing from actual array"); } else { AssertionUtils.actionPass("Row " + i + " present in array, checking values"); Object actualJavaBeanObject = actualArrayObject[i]; IAssertion javaBeanAssertion = AssertionProcessorFactory.getAssertionProcessor(DataTypeEnum.BEAN); if ((expectedMetaData.getMetaDataAtIndex(i).size() == 1) && (expectedMetaData.getMetaDataAtIndex(i).getValueAtIndex(0).getClass() == actualJavaBeanObject.getClass())) { javaBeanAssertion.execute(message, expectedMetaData.getMetaDataAtIndex(i).getValueAtIndex(0), actualJavaBeanObject, null); } else { AggregatedStepExpectedOutputMetaData javaBeanMetaData = new AggregatedStepExpectedOutputMetaData(); javaBeanMetaData.addMetaData(expectedMetaData.getMetaDataAtIndex(i)); javaBeanAssertion.execute(message, null, actualJavaBeanObject, javaBeanMetaData); } } } } }