blob: 9ac9ca9c0ee8ac325bbe02412c38fd6e6eb0a563 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 freemarker.ext.beans;
import static org.junit.Assert.*;
import java.lang.reflect.Method;
import org.junit.Test;
public class MethodMatcherTest {
@Test
public void testReturnTypeOverload() throws NoSuchMethodException {
MethodMatcher matcher = new MethodMatcher();
Method genericM = TestReturnTypeOverloadGeneric.class.getMethod("m");
assertEquals(Object.class, genericM.getReturnType());
matcher.addMatching(TestReturnTypeOverloadGeneric.class, genericM);
Method stringM = TestReturnTypeOverloadString.class.getMethod("m");
assertEquals(String.class, stringM.getReturnType());
assertTrue(matcher.matches(TestReturnTypeOverloadGeneric.class, genericM));
assertTrue(matcher.matches(TestReturnTypeOverloadString.class, genericM));
assertTrue(matcher.matches(TestReturnTypeOverloadString.class, stringM));
}
public static class TestReturnTypeOverloadGeneric<T> {
public T m() {
return null;
};
}
public static class TestReturnTypeOverloadString extends TestReturnTypeOverloadGeneric<String> {
public String m() {
return "";
};
}
/** Mostly to test upper bound classes. */
@Test
public void testInheritance() throws NoSuchMethodException {
{
MethodMatcher matcher = new MethodMatcher();
Method m = TestInheritanceC2.class.getMethod("m1");
assertEquals(m, TestInheritanceC1.class.getMethod("m1"));
matcher.addMatching(TestInheritanceC2.class, m);
assertFalse(matcher.matches(TestInheritanceC1.class, m));
assertTrue(matcher.matches(TestInheritanceC2.class, m));
assertTrue(matcher.matches(TestInheritanceC3.class, m));
}
{
MethodMatcher matcher = new MethodMatcher();
Method m = TestInheritanceC2.class.getMethod("m2");
assertNotEquals(m, TestInheritanceC1.class.getMethod("m2"));
matcher.addMatching(TestInheritanceC2.class, m);
assertFalse(matcher.matches(TestInheritanceC1.class, m));
assertTrue(matcher.matches(TestInheritanceC2.class, m));
assertTrue(matcher.matches(TestInheritanceC3.class, m));
}
{
// m2 again, but with a non-same-instance but "equal" method.
MethodMatcher matcher = new MethodMatcher();
Method m = TestInheritanceC1.class.getMethod("m2");
matcher.addMatching(TestInheritanceC2.class, m);
assertFalse(matcher.matches(TestInheritanceC1.class, m));
assertTrue(matcher.matches(TestInheritanceC2.class, m));
assertTrue(matcher.matches(TestInheritanceC3.class, m));
}
{
MethodMatcher matcher = new MethodMatcher();
Method m = TestInheritanceC2.class.getMethod("m3");
assertEquals(m, TestInheritanceC1.class.getMethod("m3"));
assertNotEquals(m, TestInheritanceC3.class.getMethod("m3"));
matcher.addMatching(TestInheritanceC2.class, m);
assertFalse(matcher.matches(TestInheritanceC1.class, m));
assertTrue(matcher.matches(TestInheritanceC2.class, m));
assertTrue(matcher.matches(TestInheritanceC3.class, m));
}
}
public static class TestInheritanceC1 {
public void m1() {
}
public void m2() {
}
public void m3() {
}
}
public static class TestInheritanceC2 extends TestInheritanceC1 {
@Override
public void m2() {
}
}
public static class TestInheritanceC3 extends TestInheritanceC2 {
@Override
public void m3() {
}
}
/** Mostly to test when same method associated to multiple unrelated classes. */
@Test
public void testInheritance2() throws NoSuchMethodException {
MethodMatcher matcher = new MethodMatcher();
Method m = Runnable.class.getMethod("run");
matcher.addMatching(TestInheritance2SafeRunnable1.class, m);
matcher.addMatching(TestInheritance2SafeRunnable2.class, m);
assertTrue(matcher.matches(
TestInheritance2SafeRunnable1.class, TestInheritance2SafeRunnable1.class.getMethod("run")));
assertTrue(matcher.matches(
TestInheritance2SafeRunnable2.class, TestInheritance2SafeRunnable2.class.getMethod("run")));
assertFalse(matcher.matches(
TestInheritance2UnsafeRunnable.class, TestInheritance2UnsafeRunnable.class.getMethod("run")));
}
public static class TestInheritance2SafeRunnable1 implements Runnable {
public void run() {
}
}
public static class TestInheritance2SafeRunnable2 implements Runnable {
public void run() {
}
}
public static class TestInheritance2UnsafeRunnable implements Runnable {
public void run() {
}
}
@Test
public void testOverloads() throws NoSuchMethodException {
Method mInt = TestOverloads.class.getMethod("m", int.class);
Method mIntInt = TestOverloads.class.getMethod("m", int.class, int.class);
{
MethodMatcher matcher = new MethodMatcher();
matcher.addMatching(TestOverloads.class, mInt);
assertTrue(matcher.matches(TestOverloads.class, mInt));
assertFalse(matcher.matches(TestOverloads.class, mIntInt));
}
{
MethodMatcher matcher = new MethodMatcher();
matcher.addMatching(TestOverloads.class, mIntInt);
assertFalse(matcher.matches(TestOverloads.class, mInt));
assertTrue(matcher.matches(TestOverloads.class, mIntInt));
}
}
public static class TestOverloads {
public void m(int x) {
}
public void m(int x, int y) {
}
}
}