package com.vaadin.tests.server.component;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashSet;
import org.junit.Assert;
import org.junit.Test;
import com.vaadin.tests.VaadinClasses;
import com.vaadin.ui.Component;
public class FinalMethodTest {
// public void testThatContainersHaveNoFinalMethods() {
// HashSet<Class<?>> tested = new HashSet<Class<?>>();
// for (Class<?> c : VaadinClasses.getAllServerSideClasses()) {
// if (Container.class.isAssignableFrom(c)) {
// ensureNoFinalMethods(c, tested);
// }
// }
// }
@Test
public void testThatComponentsHaveNoFinalMethods() {
HashSet<Class<?>> tested = new HashSet<>();
int count = 0;
for (Class<? extends Component> c : VaadinClasses.getComponents()) {
ensureNoFinalMethods(c, tested);
count++;
}
Assert.assertTrue(count > 0);
}
private void ensureNoFinalMethods(Class<?> clazz,
HashSet<Class<?>> tested) {
if (tested.contains(clazz)) {
return;
}
tested.add(clazz);
if (clazz == null || clazz.equals(Object.class)) {
return;
}
System.out.println("Checking " + clazz.getName());
for (Method m : clazz.getDeclaredMethods()) {
if (isPrivate(m)) {
continue;
}
if (isFinal(m)) {
String error = "Class " + clazz.getName() + " contains a "
+ (isPublic(m) ? "public" : "non-public")
+ " final method: " + m.getName();
// System.err.println(error);
throw new RuntimeException(error);
}
}
ensureNoFinalMethods(clazz.getSuperclass(), tested);
}
private boolean isFinal(Method m) {
return Modifier.isFinal(m.getModifiers());
}
private boolean isPrivate(Method m) {
return Modifier.isPrivate(m.getModifiers());
}
private boolean isPublic(Method m) {
return Modifier.isPublic(m.getModifiers());
}
}