/*
* Copyright 2013 uaiHebert Solucoes em Informatica
*
* 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.uaihebert.test;
import com.uaihebert.model.test.RegularEntityOne;
import com.uaihebert.uaicriteria.UaiCriteria;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
import static org.junit.Assert.*;
public class MultiSelectAbstractTest extends AbstractTest {
protected enum OpenJpaIndexToConvert {
NONE, SECOND
}
protected <E> E extractResult(final UaiCriteria<RegularEntityOne> uaiCriteria, final Class<E> resultType) {
final E criteriaResult;
if (isEclipselink()) {
final Vector resultAsVector = (Vector) uaiCriteria.getMultiSelectResult();
criteriaResult = (E) resultAsVector.get(0);
} else {
final List resultAsList = uaiCriteria.getMultiSelectResult();
criteriaResult = (E) resultAsList.get(0);
}
return criteriaResult;
}
protected void validateResultWithVector(final String query, final UaiCriteria<RegularEntityOne> uaiCriteria) {
final List<Object> resultFromJPQL = jpqlHelper.getListFromJPQL(query, Object.class);
final Vector jpqlVector = (Vector) resultFromJPQL;
assertTrue("making sure that the multiselect worked", jpqlVector.size() > 1);
final Vector multiselectVector = (Vector) uaiCriteria.getMultiSelectResult();
assertEquals("making sure that the multiselect has the same value", jpqlVector.size(), multiselectVector.size());
validateListResult(jpqlVector, multiselectVector);
}
protected void validateListResult(final List jpqlVector, final List multiselectVector, final OpenJpaIndexToConvert... convertIndex) {
for (int i = 0; i < jpqlVector.size(); i++) {
final Object[] jpqlLine = (Object[]) jpqlVector.get(i);
final Object[] multiselectLine = (Object[]) multiselectVector.get(i);
if (isOpenJPA()) {
// open JPA is returning long/int values in the avg attributes
if (convertIndex.length == 0 || OpenJpaIndexToConvert.NONE.equals(convertIndex)) {
// for some reason is returning long for jpql and int for criteria
assertEquals(jpqlLine[0], multiselectLine[0]);
try {
// for jpql is returning long and criteria big decimal
assertEquals(new BigDecimal(jpqlLine[0].toString()), new BigDecimal(multiselectLine[0].toString()));
} catch (final NumberFormatException nfe) {
try {
assertEquals(jpqlLine[0], multiselectLine[0]);
} catch (final Exception ex) {
fail("Could not parse query result");
}
}
continue;
}
if (convertIndex.length > 0 && i == 1 && Arrays.asList(convertIndex).contains(OpenJpaIndexToConvert.SECOND)) {
assertEquals(Double.valueOf(jpqlLine[1].toString()), Double.valueOf(multiselectLine[1].toString()));
}
} else {
// for some reason the eclipslink is returning null values
if (jpqlLine[1] == null && multiselectLine[1] == null) {
continue;
}
try {
// for jpql is returning long and criteria big decimal
assertEquals(new BigDecimal(jpqlLine[1].toString()), new BigDecimal(multiselectLine[1].toString()));
} catch (final NumberFormatException nfe) {
try {
assertEquals(jpqlLine[1], multiselectLine[1]);
} catch (final Exception ex) {
fail("Could not parse query result");
}
}
}
}
}
protected void validateResultAsList(final String query, final UaiCriteria<RegularEntityOne> uaiCriteria) {
final List jpqlList = jpqlHelper.getListFromJPQL(query, Object[].class);
assertTrue("making sure that the sum worked", jpqlList.size() > 1);
final List multiselectList = uaiCriteria.getMultiSelectResult();
assertEquals("making sure that the sum has the same value", jpqlList.size(), multiselectList.size());
validateListResult(jpqlList, multiselectList);
}
}