package com.vaadin.server; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; import java.util.regex.Pattern; import org.junit.Assert; import org.junit.Test; import com.vaadin.data.provider.AbstractDataProvider; import com.vaadin.event.EventRouter; import com.vaadin.event.MethodEventSource; import com.vaadin.shared.Registration; import com.vaadin.tests.VaadinClasses; public class RemoveListenersDeprecatedTest { private static final List<Predicate<Method>> ALLOW_REMOVE_LISTENER = new ArrayList<>(); static { ALLOW_REMOVE_LISTENER.add( RemoveListenersDeprecatedTest::acceptAbstarctClientConnectorRemoveMethods); ALLOW_REMOVE_LISTENER .add(RemoveListenersDeprecatedTest::acceptAbstractDataProvider); ALLOW_REMOVE_LISTENER .add(RemoveListenersDeprecatedTest::acceptMethodEventSource); } @Test public void allRemoveListenerMethodsMarkedAsDeprecated() { Pattern removePattern = Pattern.compile("remove.*Listener"); Pattern addPattern = Pattern.compile("add.*Listener"); int count = 0; for (Class<? extends Object> serverClass : VaadinClasses .getAllServerSideClasses()) { count++; if (serverClass.equals(EventRouter.class)) { continue; } for (Method method : serverClass.getDeclaredMethods()) { if (Modifier.isPrivate(method.getModifiers())) { continue; } if (addPattern.matcher(method.getName()).matches() && method.getAnnotation(Deprecated.class) == null) { Class<?> returnType = method.getReturnType(); Assert.assertEquals( "Method " + method.getName() + " is not deprectated in class " + serverClass.getName() + " and doesn't return a Registration object", Registration.class, returnType); } if (ALLOW_REMOVE_LISTENER.stream() .anyMatch(predicate -> predicate.test(method))) { continue; } if (removePattern.matcher(method.getName()).matches()) { Assert.assertNotNull( "Method " + method.getName() + " in class " + serverClass.getName() + " has not been marked as deprecated.", method.getAnnotation(Deprecated.class)); } } } Assert.assertTrue(count > 0); } private static boolean acceptMethodEventSource(Method method) { return method.getDeclaringClass().equals(MethodEventSource.class) && method.getParameterCount() == 2; } private static boolean acceptAbstarctClientConnectorRemoveMethods( Method method) { if (method.getDeclaringClass().equals(AbstractClientConnector.class)) { if (method.getParameterCount() == 2) { return true; } else if (method.getParameterCount() == 0) { return false; } else { return method.getParameterTypes()[0].equals(String.class); } } return false; } private static boolean acceptAbstractDataProvider(Method method) { return method.getDeclaringClass().equals(AbstractDataProvider.class) && method.getParameterCount() == 2; } }