/**
*
* Copyright (c) 2006-2017, Speedment, Inc. All Rights Reserved.
*
* 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.speedment.runtime.core.internal.component.sql.override;
import com.speedment.runtime.core.component.sql.override.reference.AllMatchTerminator;
import com.speedment.runtime.core.component.sql.override.reference.AnyMatchTerminator;
import com.speedment.runtime.core.component.sql.override.reference.CollectSupplierAccumulatorCombinerTerminator;
import com.speedment.runtime.core.component.sql.override.reference.CollectTerminator;
import com.speedment.runtime.core.component.sql.override.reference.CountTerminator;
import com.speedment.runtime.core.component.sql.override.reference.FindAnyTerminator;
import com.speedment.runtime.core.component.sql.override.reference.FindFirstTerminator;
import com.speedment.runtime.core.component.sql.override.reference.ForEachOrderedTerminator;
import com.speedment.runtime.core.component.sql.override.reference.ForEachTerminator;
import com.speedment.runtime.core.component.sql.override.reference.IteratorTerminator;
import com.speedment.runtime.core.component.sql.override.reference.MaxTerminator;
import com.speedment.runtime.core.component.sql.override.reference.MinTerminator;
import com.speedment.runtime.core.component.sql.override.reference.NoneMatchTerminator;
import com.speedment.runtime.core.component.sql.override.reference.ReduceIdentityCombinerTerminator;
import com.speedment.runtime.core.component.sql.override.reference.ReduceIdentityTerminator;
import com.speedment.runtime.core.component.sql.override.reference.ReduceTerminator;
import com.speedment.runtime.core.component.sql.override.reference.ReferenceTerminator;
import com.speedment.runtime.core.component.sql.override.reference.SpliteratorTerminator;
import com.speedment.runtime.core.component.sql.override.reference.ToArrayGeneratorTerminator;
import com.speedment.runtime.core.component.sql.override.reference.ToArrayTerminator;
import com.speedment.runtime.core.internal.component.sql.override.optimized.reference.OptimizedCountTerminator;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.stream.Stream;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import static org.mockito.Mockito.mock;
/**
*
* @author Per Minborg
*/
public class SqlStreamTerminatorComponentImplTest {
private SqlStreamTerminatorComponentImpl instance;
@Before
public void setUp() {
instance = new SqlStreamTerminatorComponentImpl();
}
@Test
public void testGetters() {
referenceTerminators()
.filter(c -> !CountTerminator.class.equals(c)) // Count is optimized by default. Test separately
.forEach(this::testGetter);
}
@Test
public void testGetCountTerminator() {
assertEquals(
OptimizedCountTerminator.create().getClass().getName(),
instance.getCountTerminator().getClass().getName()
);
}
@Test
public void testSetters() {
referenceTerminators()
.forEach(this::testSetter);
}
private void testGetter(Class<? extends ReferenceTerminator> clazz) {
final String getterName = "get" + clazz.getSimpleName();
try {
final Method getter = SqlStreamTerminatorComponentImpl.class.getMethod(getterName);
final Object instanceTerminator = getter.invoke(instance);
final Method defaultTerminatorMethod = clazz.getMethod("defaultTerminator");
final Object defaultTerminator = defaultTerminatorMethod.invoke(null);
System.out.println("Testing getter: " + clazz.getSimpleName() + ":" + instanceTerminator.getClass().getSimpleName());
assertEquals(clazz.getSimpleName(), defaultTerminator, instanceTerminator);
} catch (NoSuchMethodException
| SecurityException
| IllegalAccessException
| IllegalArgumentException
| InvocationTargetException e) {
throw new RuntimeException(e);
}
}
private <T extends ReferenceTerminator> void testSetter(Class<T> clazz) {
final String setterName = "set" + clazz.getSimpleName();
final String getterName = "get" + clazz.getSimpleName();
try {
final T mockTerminator = mock(clazz);
final Method setter = SqlStreamTerminatorComponentImpl.class.getMethod(setterName, clazz);
setter.invoke(instance, mockTerminator);
final Method getter = SqlStreamTerminatorComponentImpl.class.getMethod(getterName);
final Object instanceTerminator = getter.invoke(instance);
System.out.println("Testing setter: " + clazz.getSimpleName() + ":" + instanceTerminator.getClass().getSimpleName());
assertEquals(clazz.getSimpleName(), mockTerminator, instanceTerminator);
} catch (NoSuchMethodException
| SecurityException
| IllegalAccessException
| IllegalArgumentException
| InvocationTargetException e) {
throw new RuntimeException(e);
}
}
public Stream<Class<? extends ReferenceTerminator>> referenceTerminators() {
return Stream.of(
AllMatchTerminator.class,
AnyMatchTerminator.class,
CollectSupplierAccumulatorCombinerTerminator.class,
CollectTerminator.class,
CountTerminator.class,
FindAnyTerminator.class,
FindFirstTerminator.class,
ForEachOrderedTerminator.class,
ForEachTerminator.class,
IteratorTerminator.class,
MaxTerminator.class,
MinTerminator.class,
NoneMatchTerminator.class,
ReduceTerminator.class,
ReduceIdentityCombinerTerminator.class,
ReduceIdentityTerminator.class,
SpliteratorTerminator.class,
ToArrayGeneratorTerminator.class,
ToArrayTerminator.class
);
}
}