/*******************************************************************************
* Copyright (c) 2007, 2014 compeople AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* compeople AG - initial API and implementation
*******************************************************************************/
package org.eclipse.riena.core.annotationprocessor;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.eclipse.riena.core.test.RienaTestCase;
import org.eclipse.riena.core.test.collect.NonUITestCase;
import org.eclipse.riena.core.util.ReflectionUtils;
import org.eclipse.riena.internal.core.annotationprocessor.IAnnotatedMethodHandlerExtension;
import org.eclipse.riena.ui.ridgets.annotation.OnActionCallback;
import org.eclipse.riena.ui.ridgets.annotation.OnClick;
/**
* Test the {@code AnnotationProcessor}.
*/
@NonUITestCase
public class AnnotationProcessorTest extends RienaTestCase {
private AnnotationProcessor processor;
@Override
protected void setUp() throws Exception {
super.setUp();
processor = ReflectionUtils.newInstanceHidden(AnnotationProcessor.class);
}
public void testFailWithDoubledHandlers() {
processor.update(new IAnnotatedMethodHandlerExtension[] { create(OnClick.class, new Handler()),
create(OnClick.class, new Handler()) });
try {
processor.processMethods(new String());
fail();
} catch (final AnnotationProcessorFailure e) {
ok();
}
}
public void testAlreadyProcessed() {
processor.update(new IAnnotatedMethodHandlerExtension[] { create(OnClick.class, new Handler()), });
final String watch = new String();
final IDisposer disposer1 = processor.processMethods(watch);
final IDisposer disposer2 = processor.processMethods(watch);
assertTrue(disposer1 != disposer2);
assertTrue(disposer2 == ReflectionUtils.getHidden(processor, "EMPTY_DISPOSER"));
final IDisposer disposer3 = processor.processMethods(watch);
assertTrue(disposer2 == disposer3);
}
public void testFlatAnnotatedObject() {
final Handler onClick = new Handler(OnClick.class);
final Handler onActionCallback = new Handler(OnActionCallback.class);
processor.update(new IAnnotatedMethodHandlerExtension[] { create(OnClick.class, onClick),
create(OnActionCallback.class, onActionCallback) });
processor.processMethods(new A());
assertTrue(onClick.getHandled().size() == 1);
assertTrue(onActionCallback.getHandled().size() == 1);
assertTrue(onClick.getHandled().get(0) instanceof OnClick);
assertTrue(onActionCallback.getHandled().get(0) instanceof OnActionCallback);
assertEquals("RidgetA1", ((OnClick) onClick.getHandled().get(0)).ridgetId());
assertEquals("RidgetA2", ((OnActionCallback) onActionCallback.getHandled().get(0)).ridgetId());
}
public void testHillyAnnotatedObject() {
final Handler onClick = new Handler(OnClick.class);
final Handler onActionCallback = new Handler(OnActionCallback.class);
processor.update(new IAnnotatedMethodHandlerExtension[] { create(OnClick.class, onClick),
create(OnActionCallback.class, onActionCallback) });
processor.processMethods(new B());
assertTrue(onClick.getHandled().size() == 1);
assertTrue(onActionCallback.getHandled().size() == 2);
assertTrue(onClick.getHandled().get(0) instanceof OnClick);
assertTrue(onActionCallback.getHandled().get(0) instanceof OnActionCallback);
assertTrue(onActionCallback.getHandled().get(1) instanceof OnActionCallback);
assertEquals("RidgetA1", ((OnClick) onClick.getHandled().get(0)).ridgetId());
assertEquals("RidgetA2", ((OnActionCallback) onActionCallback.getHandled().get(0)).ridgetId());
assertEquals("RidgetA3", ((OnActionCallback) onActionCallback.getHandled().get(1)).ridgetId());
}
private IAnnotatedMethodHandlerExtension create(final Class<? extends Annotation> annotationClass,
final IAnnotatedMethodHandler handler) {
return new IAnnotatedMethodHandlerExtension() {
public Class<? extends Annotation> getAnnotation() {
return annotationClass;
}
public IAnnotatedMethodHandler createHandler() {
return handler;
}
};
}
private static class Handler implements IAnnotatedMethodHandler {
private Class<? extends Annotation> annotationClass;
private final List<Annotation> handled = new ArrayList<Annotation>();
public Handler() {
}
public Handler(final Class<? extends Annotation> annotationClass) {
this.annotationClass = annotationClass;
}
public void handleAnnotation(final Annotation annotation, final Object object, final Method method,
final Map<?, ?> optionalArgs, final AnnotatedOverriddenMethodsGuard guard, final DisposerList disposers) {
assertTrue(annotationClass.isInstance(annotation));
handled.add(annotation);
disposers.add(new IDisposer() {
public void dispose() {
}
});
}
public List<Annotation> getHandled() {
return handled;
}
}
private static class A {
@OnClick(ridgetId = "RidgetA1")
public void onClick() {
}
@OnActionCallback(ridgetId = "RidgetA2")
public void onAcctionCallback() {
}
}
private static class B extends A {
@Override
@OnClick(ridgetId = "RidgetA1")
public void onClick() {
}
@Override
@OnActionCallback(ridgetId = "RidgetA3")
public void onAcctionCallback() {
}
}
}